Spring Cloud Config
为什么要统一管理微服配置
- 集中管理配置
- 不同环境不同配置
- 运行期间可动态调整
- 配置修改后可自动更新
简介
SpringCloud Config为分布式系统外部化配置提供了服务端和客户端的支持,包括了Config Server和Config Client两部分。
Config Server用于集中管理各个应用程序的配置,默认使用Git存储配置内容。Config Client是Config Server的客户端,用于操作存储在Config Server中的配置属性。各个服务启动时,会请求ConfigServer以获取所需要的配置属性,然后缓存这些属性。
编写Config Server
- 编写一个ConfigClient的配置文件
- 添加maven依赖
- 添加启动类注解@EnableConfigServer
- 编写配置文件application.yml
Config Server就配置完成了
Config Server的端点
可使用ConfigServer的端点访问配置文件
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
例如:访问http://localhost:8041/grape-client-dev.yml
编写Config Client
-
创建一个Config Client微服务,为该服务添加以下依赖
-
创建配置文件bootstrap.yml
这里注意:以上配置应在bootstrap.yml而不是application.yml。主应用程序的父上下文,引导上下文加载bootstrap.*中的属性。配置在bootstrap.*的属性有更高的优先级,因此默认情况下他们不能被本地配置覆盖。 -
编写Controller
配置内容的加解密(对称加密)
-
安装JCE
config Server的加解密功能依赖JCE
下载地址:
https://www.oracle.com/technetwork/java/javase/downloads/jce-all-download-5170447.html
下载完后,可看到这两个jar包:local_policy.jar和US_export_policy.jar
替换或新增%JDK_HOME%\jre\lib\security目录下的这两个jar。 -
配置Config Server的bootstrap.yml
这里需要配置到bootstrap.yml,若配置到application.yml可能无效 -
使用Config Server的加密端点
curl $CONFIG_SERVER_URL/encrypt -d 需要加密的明文
curl $CONFIG_SERVER_URL/decrypt -d 需要解密的密文
-
加密后的内容,可使用{cipher}密文的形式存储
新建一个 encryption.yml配置文件专门用来配置加密信息
-
访问 自动转化成明文,Config Server能自动解密加密内容,一些场景下,希望Config Server返回密文,由Config Client自行解密,可配置spring.cloud.config.server.encrypt.enabled=false,但似乎需要配置在bootstrap.yml里才会生效。
配置内容的加解密(非对称加密)
- 执行以下命令创建一个keySotre
keytool -genkeypair -alias mytestkey -keyalg RSA -dname “CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US” -keypass changeme -keystroe server.jks -storepass letmein
- 将生成的server.jks复制到Config Server的classpath下
- 新建bootstrap.yml配置如下
- 使用curl尝试对信息加密
- 同样的对需要放在GIt仓库的配置文件配置如下
- 访问
- 同样的若希望返回非解密的内容,配置spring.cloud.server.encrypt.enabled=false
使用/refresh端点手动刷新配置
我们之前写的Config Client,当配置文件更新时,程序运行期间并不会动态调整配置,首先,介绍利用/refresh端点手动刷新配置。
- 为项目添加actuator依赖,该依赖包含了/refresh端点
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>2.0.4.RELEASE</version> </dependency>
- 在Controller上添加@RefreshScope注解
- 访问
- 修改配置文件
- 通过发送post请求到 http://localhost:8762/actuator/refresh 手动刷新配置
再次访问,可以看到配置文件已经刷新
使用Spring Cloud Bus自动刷新配置
springCloud bus使用轻量级消息代理(如RabbitMq、Kafka等)连接分布式系统节点,广播状态的更改或其他管理指令。
- 在Config Server下添加依赖
- 配置bootstrap.yml的rabbitmq连接信息,rabbitmq的guest用户默认只能localhost访问,这里我新建了root用户,并添加了相应权限。
rabbitmq:
host: 192.168.177.124
port: 5672
username: root
password: root
springboot2进行了很大调整,屏蔽了actuator的端点,要做如下配置
management:
endpoints:
web:
exposure:
include: "*"
- 发送Post请求到config Server更新配置信息,更新指令会自动广播到其config client下
curl -X POST http://localhost:8041/actuator.bus-refresh