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.bootgroupId>
<artifactId>spring-boot-starter-securityartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-serverartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-monitorartifactId>
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.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>
在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上的配置文件信息。其实如果没有读取成功项目启动就会启动失败,这里调用接口可以很直观的看到读取到的配置。
和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