1. 程式人生 > 實用技巧 >[SpringCloud]Config配置中心入門

[SpringCloud]Config配置中心入門

Config

SpringCloud Config是微服務架構中的微服務提供的集中化外部配置支援,配置伺服器為各個不同的微服務的所有環境提供一箇中心化的外部配置。Config分為客戶端和服務端兩部分,服務端是分散式配置中心,是一個獨立的微服務,用來連線配置伺服器併為客戶端提供獲取配置資訊,加密解密資訊等訪問介面。客戶端則通過指定的配置中心來管理應用資源,以及與業務相關的配置內容,並在啟動的時候從配置中心獲取和載入資訊配置服務預設採用git來儲存配置資訊。

作用

1,集中管理配置檔案
2,不同的環境不同的配置,動態化的配置更新,分環境部署比如dev/test/prod/beta/release
3,執行期間動態調整配置,不再需要在每個服務部署的機器上編寫配置檔案,服務會向配置中心統一拉取配置自己的資訊。
4,當配置發生變動的時候,服務不再需要重啟來感知自身配置的變化並且及時地應用新的配置。
5,將配置資訊以Rest介面的形式暴露。

基本使用

1,建立Config服務端。新增依賴。

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

        <!--common模組-->
        <dependency>
            <groupId>cn.izzer</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--監控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

接下來是yml的配置,Config會預設載入github上的配置檔案,可是目前在國內上GitHub的話還是挺慢的,所以這裡最好用碼雲,就不會受網路的限制。
2,建立配置倉庫。
3,將倉庫通過git clone到本地,將配置檔案上傳到碼雲。
4,在yml裡面使用HTTPS或者SSH的方式引入倉庫地址,這裡我使用的是HTTPS。

server:
  port: 3344
spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/Yintianhao/SpringCloudConfigCenter.git
          search-paths:
            - SpringCloudConfigCenter
          username: Yintianhao(賬號)
          password: XXXXX(賬號密碼)
          force-pull: true
      label: master

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

5,建立啟動類。主要是需要注意加上@EnableConfigServer的註解。
6,測試是否能夠通過localhost:3344正常訪問git上的配置檔案。

http://localhost:3344/master/config-dev.yml
master是分支,config-dev表示檔名,這裡是指開發環境的配置檔案,一般還有生產環境等等。

bootstrap.yml

與application不同的是bootstrap一般用來表示系統級的配置項,優先順序比application高。SpringCloud會建立一個BootstrapContext,作為Spring應用的ApplicationContext的父上下文,初始化的時候,BootstrapContext負責從外部資源載入配置屬性並且解析配置,這兩個上下文共享一個從外部獲取的Environment。Bootstrap的屬性具有高優先順序,預設情況下他們都不會被本地配置覆蓋,Bootstrap context和Application Context有著不同的約定,所以新增一個Bootstrap.yml檔案,保證BootstrapContext和application Context配置的分離。

搭建Config客戶端來獲取服務端的配置

依賴跟服務端不同的地方主要是這裡引用的是客戶端的依賴。其餘都和服務端差不多。

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.izzer</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--監控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--熱部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

在這之後新建Bootstrap.yml檔案。

# bootstrap.yml
server:
  port: 3355
spring:
  application:
    name: config-client
  cloud:
    config:
      label: master
      name: config #配置檔名稱
      profile: dev #讀取字尾名稱
      uri: http://localhost:3344 #配置中心地址

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
management:
  endpoints:
    web:
      exposure:
        include: "*"

啟動類就不寫了,在這之後,通過Controller層呼叫服務端的介面來獲得配置資訊。

@RestController
@RefreshScope
public class ConfigClientController {
    
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configinfo")
    public String getConfigInfo(){
        return configInfo;
    }
}

進行簡單的測試:

動態重新整理的問題

這裡帶來的問題就是客戶端無法和同步更新服務端檢測到的git上的配置資訊的改變,所以需要配置動態重新整理。這裡就需要用到actuator的監控功能了,從而可以避免每次都需要重啟客戶端來同步服務端的配置資訊。需要的配置資訊就是上面yml檔案中的最後的management節點中的內容。除此之外就是需要在controller層加入@RefreshScope的註解來開啟重新整理。但是這裡我個人覺得還是有一點不方便,儘管這不需要重啟客戶端,但是與此同時又需要利用curl來發送post請求來啟用重新整理,如果客戶端數量不多那還好,但如果在生產環境中有需要個客戶端服務,那麼這裡的工作量也是不小的。我想應該後面會有相應的技術解決方案,之後學到了再把這個坑填上。
curl測試很簡單。

在執行完這個命令之後就可以使用動態重新整理了。

參考資料

同步部落格