SpringCloud(二)配置中心
SpringCloud配置中心以外部配置文件(鍵值對或者等效的YAML
文件)作爲資源的向客戶端提供Rest服務,使其通過配置中心即可獲取對應的配置信息。SpringCloud配置中心支持本地文件倉庫,Git倉庫和SVN倉庫作爲配置文件倉庫,並可以實現客戶端啓動時加載配置文件,動態刷新配置文件。
服務端配置
服務端需要在pom文件中引入依賴,spring-cloud-config-server
是服務端最主要的依賴,spring-cloud-starter-bus-amqp
和spring-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.enabled
爲false
使得刷新配置不需要權限驗證。另外還需要配置訪問時提供的用戶名和密碼,此處需要忽略/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.yml
和sms-service.yml
文件。
啓動配置中心(當然首先得啓動Eureka服務端),訪問http://localhost:8200/web-app-service/default
讀取到的內容和web-app-service.yml
文件的內容一致。證明配置中心搭建成功。
客戶端配置
客戶端需要引入spring-cloud-starter-config
和spring-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
來匹配的,,profile
和label
分別決定採用的環境化配置和Git項目的不同版本。Eureka通過serviceId
查找配置中心的服務,同時這裏也要配置訪問配置中心的用戶名和密碼。
label
可以使用commit id
,branch
或者tag
。如果label
中包含反斜槓/
需要使用(_)
替換。比如label
爲foo/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.rabbitmq
,management.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上的配置文件信息。其實如果沒有讀取成功項目啓動就會啓動失敗,這裏調用接口可以很直觀的看到讀取到的配置。
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實現動態刷新需要將配置中心部署到一個外網可以訪問的服務器。