跟我學SpringCloud | 第六篇:Spring Cloud Config Github配置中心

来源:https://www.cnblogs.com/babycomeon/archive/2019/07/06/11134717.html
-Advertisement-
Play Games

SpringCloud系列教程 | 第六篇:Spring Cloud Config Github配置中心 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 隨著分散式項目越來越大,勤勞的程式猿們會開始面臨 ...


SpringCloud系列教程 | 第六篇:Spring Cloud Config Github配置中心

Springboot: 2.1.6.RELEASE

SpringCloud: Greenwich.SR1

如無特殊說明,本系列教程全採用以上版本

隨著分散式項目越來越大,勤勞的程式猿們會開始面臨一個挑戰,配置文件會越來越繁雜,雖然spring提供了一個雞肋版的解決方案,spring.profiles.active,在大型的分散式項目體系中,聊勝於無吧,手動維護配置文件的痛苦,生產,UAT,測試,開發環境的隔離,額外的配置文件,如:logback.xml日誌的配置文件,bootstrap.properties配置文件,當系統中有幾十個服務,相應的會有上百個配置文件,簡直就是史詩級的災難大片,每次發佈上線,都要手動去檢查配置文件,相應的服務都需要重啟,那麼,有沒有一種方案,可以自動更新配置,並且對版本做出相應的控制,恰好,springcloud為我們提供了這樣一種工具,雖然很多方面都還不完善,配置能力比較弱,但是也給我們提供了一種思路。

市面上有很多配置中心,BAT每家都出過,360的QConf、淘寶的diamond、百度的disconf都是解決這類問題。國外也有很多開源的配置中心Apache Commons Configuration、owner、cfg4j等等。這些開源的軟體以及解決方案都很優秀,也存在這樣或者那樣的缺陷。今天我們要瞭解的Spring Cloud Config,可以無縫的和spring體系相結合,夠方便夠簡單顏值高。

1. Spring Cloud Config

在介紹Spring Cloud Config之前,我們可以先憑空想一下一個配置中心需要提供的核心功能有哪些:

  • 提供客戶端和服務端的支持
  • 提供各個環境的配置
  • 配置文件修改後可以快速生效
  • 可以提供不同版本的管理
  • 可以支持不同的語言(java、.Net、Delphi、node等)
  • 支持一定數量的併發
  • 高可用(防止意外宕機導致配置不可用)

Spring Cloud Config項目是一個解決分散式系統的配置管理方案。它包含了Client和Server兩個部分,server提供配置文件的存儲、以介面的形式將配置文件的內容提供出去,client通過介面獲取數據、並依據此數據初始化自己的應用。Spring cloud使用git或svn存放配置文件,預設情況下使用git,我們先以git為例做一套示例。

首先在github上面創建了一個文件夾springcloud-config用來存放配置文件,為了模擬生產環境,我們創建以下三個配置文件:

// 開發環境
springcloud-config-dev.properties
// 測試環境
springcloud-config-test.properties
// 生產環境
springcloud-config-pro.properties

每個配置文件中都寫一個屬性springcloud.hello,屬性值分別是 hello dev/test/pro。下麵我們開始配置server端

2. Server端

1. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springcloud</groupId>
    <artifactId>config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2. 配置文件

server:
  port: 8080
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/meteor1993/SpringCloudLearning # git倉庫的地址
          search-paths: chapter6/springcloud-config  # git倉庫地址下的相對地址,可以配置多個,用,分割。
          username: #Git倉庫用戶名
          password: #Git倉庫密碼

Spring Cloud Config也提供本地存儲配置的方式。我們只需要設置屬性spring.profiles.active=native,Config Server會預設從應用的src/main/resource目錄下檢索配置文件。也可以通過spring.cloud.config.server.native.searchLocations=file:E:/properties/屬性來指定配置文件的位置。雖然Spring Cloud Config提供了這樣的功能,但是為了支持更好的管理內容和版本控制的功能,還是推薦使用git的方式。

3. 啟動類 ConfigServerApplication

package com.springcloud.configserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }

}

增加@EnableConfigServer註解,激活對配置中心的支持

4. 測試

首先測試我們的server端能否從github上獲取到我們需要的信息,直接訪問:http://localhost:8080/springcloud-config/pro, 註意: springcloud-config是文件夾的首碼命名,可以看到如下結果:

{
    "name":"springcloud-config",
    "profiles":[
        "pro"
    ],
    "label":null,
    "version":"4e3d1a93e869fb336254c480ed1e5b36d58124aa",
    "state":null,
    "propertySources":[
        {
            "name":"https://github.com/meteor1993/SpringCloudLearning/chapter6/springcloud-config/springcloud-config-pro.properties",
            "source":{
                "springcloud.hello":"hello pro"
            }
        }
    ]
}

上述的返回的信息包含了配置文件的位置、版本、配置文件的名稱以及配置文件中的具體內容,說明server端已經成功獲取了git倉庫的配置信息。

如果直接查看配置文件中的配置信息可訪問:http://localhost:8080/springcloud-config-dev.properties, 返回:springcloud.hello: hello dev

修改配置文件springcloud-config-dev.properties中配置信息為:springcloud.hello=hello dev update,再次在瀏覽器訪問http://localhost:8080/springcloud-config-dev.properties,返回:springcloud.hello: hello dev update。說明server端會自動讀取自動提交功能。

倉庫中的配置文件會被轉換成web介面,訪問可以參照以下的規則:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

以springcloud-config-dev.properties為例,它的application是springcloud-config,profile是dev,label是分支的意思,如果只有一個主分支,可以不寫,預設會訪問master分支,client會根據填寫的參數來選擇讀取對應的配置。

3. client端

主要展示如何在業務項目中去獲取server端的配置信息。

1. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springcloud</groupId>
    <artifactId>config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-client</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2. 配置文件

這裡配置文件分兩個,application.yml和bootstrap.properties

application.yml如下:

server:
  port: 8081
spring:
  application:
    name: spring-cloud-config-client

bootstrap.properties如下:

spring.cloud.config.name=springcloud-config
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:8080/
spring.cloud.config.label=master
  • spring.application.name:對應{application}部分
  • spring.cloud.config.profile:對應{profile}部分
  • spring.cloud.config.label:對應git的分支。如果配置中心使用的是本地存儲,則該參數無用
  • spring.cloud.config.uri:配置中心的具體地址
  • spring.cloud.config.discovery.service-id:指定配置中心的service-id,便於擴展為高可用配置集群。

註意:上面這些與spring-cloud相關的屬性必須配置在bootstrap.properties中,config部分內容才能被正確載入。因為config的相關配置會先於application.properties,而bootstrap.properties的載入也是先於application.yml。

3. 啟動類

package com.springcloud.configclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }

}

啟動類只需要@SpringBootApplication註解就可以,常規操作。

4. 訪問類

package com.springcloud.configclient.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: shiyao.wei
 * @Date: 2019/7/4 16:19
 * @Version: 1.0
 * @Desc:
 */
@RestController
public class HelloController {

    @Value("${springcloud.hello}")
    private String hello;

    @RequestMapping("/hello")
    public String from() {
        return this.hello;
    }
}

使用@Value註解來獲取server端參數的值

5. 測試

啟動client端,訪問鏈接:http://localhost:8081/hello, 返回:hello dev update,說明已經正確的從server端獲取到了參數。到此一個完整的服務端提供配置服務,客戶端獲取配置參數的例子就完成了。

可以再進行一個小實驗,我們再次修改springcloud-config-dev.properties中的內容為:hello dev update1,提交至github後,再次訪問http://localhost:8081/hello,可以發現,返回的內容還是hello dev update,這是為什麼呢?因為springboot項目只有在啟動的時候才會獲取配置文件的值,修改github信息後,client端並沒有在次去獲取,所以導致這個問題。如何去解決這個問題呢?留到下一篇我們在介紹。

示例代碼-Github

參考:http://www.ityouknow.com/springcloud/2017/05/22/springcloud-config-git.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 由於不同瀏覽器,不同版本性能不一,且控制台本質是是套用了一大堆 "eval" ,沙盒化程度高,所以需使用 "node" 環境測試來提高準確性 比第二種方法更簡潔 倒敘簡潔版 兩個分號之間的表達式為 true 會一直執行直到 判斷為 false (i = 0) 正序簡潔版 當 i 大於等於數組長度或a ...
  • 摘要: 玩轉npm。 作者:前端小智 原文: "13 個 npm 快速開發技巧" "Fundebug" 經授權轉載,版權歸原作者所有。 為了保證的可讀性,本文采用意譯而非直譯。 每天,數以百萬計的開發人員使用 或 來構建項目。運行 或`npx create response app`等命令幾乎構建J ...
  • display對象可以獲取所有顯示屏此處演示程式啟動是投放新視窗至另一屏幕 import { app, BrowserWindow } from 'electron' const electron = require('electron') //獲取electron對象 let newWindow ...
  • 寫了個評分組件,效果如下 組件Rate.js 組件樣式 Rate.less 背景圖 調用 <Rate number={10} def={5} /> number:為評分總數,預設為5 def:為評分數,預設為0 ...
  • 1. vue項目打包採坑 1.1. vue運行報錯error:Cannot assign to read only property 'exports' of object ' ' 這個錯誤我是在打包完部署到nginx上才會報的,在本地環境可以正常運行,真坑; 網上的資料說的報錯原因是export和 ...
  • 官網地址:http://www.bacubacu.com/colresizable/ 這裡值得註意的是,如果是動態加入的列,則需要先清理調用插件生成的class,id和div之後再重新調用才會有作用。 至於為何動態載入的列沒有效果呢。首先,我想到了可能是方法載入在了動態生成列之前,所以我便手動在生成 ...
  • 雙大括弧會將數據解釋為普通文本,而非 HTML 代碼。為了輸出真正的 HTML,你需要使用 v-html 指令,例如: 渲染結果為: <p>{{message}}</p>里的message被解釋為了普通文本,而不是輸出真正的 HTML,而<p v-html="message"></p>輸出了真正的h ...
  • 這12個問題,基本上就是HTML和CSS基礎中的重點難點了,也是必須要弄清楚的基本問題,其中定位的絕對定位和相對定位到底相對什麼定位?這個還是容易被忽視的,浮動也是一個大坑,有很多細節。 這12個知識點是我個人認為的,下麵我們就來看看這12個知識點。 1.怎麼讓一個不定寬高的 DIV,垂直水平居中? ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...