SpringCloud(二)配置中心

SpringCloud(二)配置中心

SpringCloud配置中心以外部配置文件(鍵值對或者等效的YAML文件)作爲資源的向客戶端提供Rest服務,使其通過配置中心即可獲取對應的配置信息。SpringCloud配置中心支持本地文件倉庫,Git倉庫和SVN倉庫作爲配置文件倉庫,並可以實現客戶端啓動時加載配置文件,動態刷新配置文件。

服務端配置

服務端需要在pom文件中引入依賴,spring-cloud-config-server是服務端最主要的依賴,spring-cloud-starter-bus-amqpspring-cloud-config-monitor主要是爲了實現配置的動態刷新。spring-boot-starter-security主要負責配置文件敏感信息的加解密。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--spring cloud 配置中心-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-monitor</artifactId>
</dependency>

配置中心服務端的啓動類需要增加@EnableConfigServer,表明這是一個配置中心的服務端。

@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigApplicationStarter {

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

bootstrap.yml配置文件中需要指定應用名稱和配置倉庫地址,這裏爲了實現動態刷新配置倉庫使用的是一個Docker裏面運行的GitLab(訪問端口已修改爲10800,初始用戶名爲root,密碼爲123456789)。也可以使用本地倉庫或者直接使用GitHub。
配置中心也可以根據{application}/{profile}使用正則匹配的方式,實現不同項目或者不同環境設置個性化的配置倉庫。spring.cloud.config.server.encrypt.enabled用於是否啓用加密解密。

spring:
  application:
    name: config-server
  profiles:
    #active: dev,native
    active: dev,git
  cloud:
    config:
      server:
        #本地文件
        native:
          #用本地文件夾存儲配置
          search-locations: file:d:\\springcloud\\config
        encrypt:
          enabled: true
        #git倉庫 gitlab地址
        git:
          uri: http://172.16.4.105:10800/root/springCloudConfig.git
          #git項目可能有多個目錄,但是配置文件可能會在某一目錄下,可以指定目錄
          search-paths: /
          username: root
          password: 123456789
          repos:
            #不同環境的不同配置倉庫
            sms-serivce-production:
              pattern: '*/production'
              uri: http://172.16.4.105:10800/root/sms-serivce-production.git
            #不同項目不同庫
            web-app-service:
              pattern:
                - web-app-service/**
                - web-app-service*
              uri: file:d:\\springcloud\\config

encrypt:
  #祕鑰
  key: 123

作爲一個SpringCloud項目,application.yml中要進行Eureka客戶端的配置。另外需要設置management.security.enabledfalse使得刷新配置不需要權限驗證。另外還需要配置訪問時提供的用戶名和密碼,此處需要忽略/monitor路徑,保證Git上配置文件後能夠不用權限驗證自動刷新配置。rabbitmq的配置主要是爲了實現配置刷新。

info:
  name: Config Server

server:
  port: 8200


#rabbitmq的地址、用戶名和密碼
spring:
  rabbitmq:
    host: 172.16.4.39
    username: rabbitmq
    password: rabbitmq
  profiles:
    active: dev

#使得/refresh不需要權限驗證
management:
  security:
    enabled: false
#訪問時需要提供用戶名和密碼
security:
  #/monitor接口用於接收git刷新通知,不需要用戶名密碼校驗
  ignored: /monitor
  user:
    name: chenxyz
    password: 123

# 不同環境的配置
---
spring:
  profiles: dev
eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/
  instance:
    preferIpAddress: true
---
spring:
  profiles: production
eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/,http://eureka3:8763/eureka/
  instance:
    preferIpAddress: true

我們在GitLab上使用root用戶創建springCloudConfig項目並新增web-app-service.ymlsms-service.yml文件。
啓動配置中心(當然首先得啓動Eureka服務端),訪問http://localhost:8200/web-app-service/default讀取到的內容和web-app-service.yml文件的內容一致。證明配置中心搭建成功。
服務端讀取配置信息

客戶端配置

客戶端需要引入spring-cloud-starter-configspring-cloud-starter-bus-amqp兩個依賴。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- spring bus 事件通知實現自動刷新 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

WebApp項目

bootstrap.yml文件中增加配置中心的相關配置。配置中心的配置文件命名就是根據spring.cloud.config.name來匹配的,,profilelabel分別決定採用的環境化配置和Git項目的不同版本。Eureka通過serviceId查找配置中心的服務,同時這裏也要配置訪問配置中心的用戶名和密碼。

label可以使用commit idbranch或者tag。如果label中包含反斜槓/需要使用(_)替換。比如labelfoo/bar需要修改爲foo(_)bar

spring:
  application:
    name: web-app-service
  cloud:
    config:
      discovery:
        enabled: true
        #配置中心的服務id
        service-id: config-server
      username: chenxyz
      password: 123
      #配置中心會覆蓋本地配置
      override-none: false
      fail-fast: true
      name: ${spring.application.name}
      profile: ${spring.profiles.active}
      #git倉庫中,可以使用label來做不同版本的配置管理 默認是master
      #label: '1.0'

application.yml需要配置註冊中心Eureka的相關信息

spring:
  profiles:
    active: dev

---
spring:
  profiles: dev
#eureka配置
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      default-zone: http://eureka1:8761/eureka/
  instance:
    #心跳間隔
    lease-renewal-interval-in-seconds: 30
---
spring:
  profiles: production
#eureka配置
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      default-zone: http://eureka1:8761/eureka/,http://eureka1:8762/eureka/,http://eureka3:8761/eureka/
  instance:
    #心跳間隔
    lease-renewal-interval-in-seconds: 30

修改Git中的web-app-service.yml文件,配置對應的spring.rabbitmqmanagement.security.enabled=false以及sms.template屬性。其中spring.rabbitmq.password對密碼進行了加密。

info:
  name: Web App Service

server:
  port: 8101

#調用refresh的時候不校驗權限
management:
  security:
    enabled: false

spring:
  profiles:
    active: dev
  rabbitmq:
      host: 172.16.4.39
      username: rabbitmq
      #password: rabbitmq
      passowrd: '{cipher}c0b6a30bcea3bdd48c8bb3459fae9dc7119943f96ee5233ea2fe5cfeb1ad4fa3'

sms:
  template: '{user_name},感謝您參與我們的活動'

要實現屬性的加解密,首先要在配置中心中啓用加密,並且設置加密祕鑰。發送post請求至/encrypt接口獲取到加密字符串。

curl localhost:8200/encrypt -d rabbitmq

請求加密接口
加密字符串需要使用{cipher}作爲開頭,這樣從配置中心獲取配置時會對加密字符串進行解密。
如果調用加解密方法失敗。可參考SpringCloud不能加密,希望可以幫助到你。

實現一個讀取配置文件的Controller。

@Controller
@RequestMapping("/sms")
@RefreshScope
public class SMSController {

    @Value("${sms.template}")
    private String smsTemplate;

    @RequestMapping("getSMSTemplate")
    @ResponseBody
    public String getSMSTemplate() {
        return smsTemplate;
    }
}

請求/sms/getSMSTemplate接口,可以看到成功讀取到GitLab上的配置文件信息。其實如果沒有讀取成功項目啓動就會啓動失敗,這裏調用接口可以很直觀的看到讀取到的配置。
web-app成功讀取配置

SMS短信服務

和WebApp項目類似,SMS短信服務(spring.applicain.name=sms-service)也進行配置中心客戶端的設置。

配置文件刷新

當配置文件改變時,我們希望運行的客戶端能夠在不重啓的情況下動態地修改配置項。SpringCloud配置中心提供了局部刷新、全局刷新和自動刷新三種刷新方式。在需要動態刷新的配置上添加@RefreshScope註解,當需要刷新的時候配置中心服務端會從Git上重新clone對應的項目,讀取配置信息並且通知客戶端重新加載。

局部刷新

當Git上針對某個應用的配置文件修改後,我們需要調用該應用/refresh接口。該應用的配置文件會自動刷新,並且不會導致其它應用的刷新。
調用局部刷新接口
局部刷新後的接口顯示

全局刷新

當我們需要刷新所有應用的配置項時,可以調用任一應用的/bus/refresh接口(POST請求)實現全局刷新。
全局刷新

自動刷新

實現自動刷新需要設置在Git上設置Webhook,當有文件提交的時候觸發服務端的/monitor接口,實現自動刷新。
如GitLab上的springCloudConfig項目,點擊Setting>>Integrations
url設置爲http://172.16.4.149:8200/monitor,這個地址是服務端的局域網地址,我們需要保證GitLab可以訪問配置中心的服務端。如果使用GitHub實現動態刷新需要將配置中心部署到一個外網可以訪問的服務器。


相關代碼
SpringCloudDemo-Config


參考:
Spring Cloud Config Server

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章