一、统一管理微服务配置
微服务的配置管理,一般有以下需求
- 集中管理配置
- 不同环境,不同配置。
- 运行期间可动态调整。如动态调整数据源连接池大小或熔断阈值。
- 配置修改后可自动更新。
Spring Cloud Config为Spring Cloud子项目,提供一套分布式的配置管理方案,『官方文档传送门』
分为服务端Config Server和客户端Config Client,其中Server端连接git或svn,并对外提供配置信息服务。Client端从Server端获取配置信息。当配置变更时,只需要借助git的push操作来触发更新操作。
二、Config Server
git配置文件
首先需要在git上放置一些yml或properties文件,命名规则为:
{application}-{profile}.***。
- application 用于Client端连接时配置的spring.application.name,用于过滤配置文件。
- profile 用于Client端连接时配置的spring.cloud.config.profile,用于区分生产测试等不同环境。
- label 一般都是master,代表分支。
我们配置了3个yml文件如下(也可使用properties文件):
1、herr.yml
1 | server.port: 8082 |
2、herr-dev.yml
1 | #server.port=8082 |
3、herr-pro.yml
1 | server.port: 8086 |
Server端搭建
1、pom.xml依赖
1 | <dependency> |
2、application入口类添加注解@EnableConfigServer
3、application.yml配置
1 | server: |
运行并测试
使用浏览器访问,查看数据是否正常,如有找不到的属性,会默认去{application}.***上找。
访问规则如下:
1 | 配置文件命名规则如下,这些路径可到启动日志中查看,会自动mapped映射一堆url路径: |
三、Config Client
Client端搭建
1、pom.xml依赖
1 | <dependency> |
2、接口实现:profile接口,从配置文件中获取profile并显示
1 | @RestController |
3、提供默认application.yml文件
1 | server: |
4、提供初始化文件bootstrap.yml(名称不能改,默认),必须要这个文件,不然运行初始化时找不到server地址,会使用默认8888端口来获取server。
如省略掉该环节,会发现启动Client模块出现错误,报错信息为:Fetching config from server at: http://localhost:8888 等。SpringCloud里面有个“启动上下文”,主要是用于加载远端的配置,也就是加载Server里面的配置,默认加载顺序为:加载bootstrap.yml里面的配置 –> 链接Server,加载远程配置 –> 加载application.yml里面的配置;
1 | spring: |
如确实不想要bootstrap.yml文件,可将spring.cloud.config.uri在EditConfiguration中override parameter中设置,或者通过代码在入口main函数中代码设置。
1 | public static void main(String[] args) { |
5、运行并测试
由于配置的application.name为herr,profile为pro,因此会自动先去找herr-pro.yml[.properties]文件,查到server.port为8086,profile为herr-pro,因此访问的地址为:http://localhost:8086/profile 返回的文字为herr-pro。可修改这两个参数做其他验证。
额外说明
哪怕第4步项目application.yml有server.port为8082,profile为 test1。在Server服务启动的时候,bootstrap拿到远端配置注入到profile的属性中的话,那么就不会再次覆盖这个属性了,所以只会选择远端配置的内容。
四、其他特性
对称加密解密
加解密功能依赖Java Cryptography Extension(JCE)。
Config Server提供加密与解密的端点,对称加密使用bootstrap.yml配置文件中的encrypt.key属性来设置对称秘钥,注意每次加密产生的值都不一样,但是都可以反向解密。
1 | $ curl localhost:8080/encrypt -d mysecret |
yml文件可这样填写,使用{cipher}开头并有单引号。但是properties文件不能有单引号。
1 | spring: |
SpringCloud同样支持非对称加密。使用keytool生产jks文件,复制到项目classpath下。并在bootstrap.yml中添加如下内容。
1 | encrypt: |
手动刷新配置
1、spring-boot-starter-actuator包含了/refresh端点,用于配置的刷新。
2、在Controller中添加@RefreshScope,用于配置更改时做特殊处理。
自动刷新配置
Spring Cloud Bus使用轻量级的消息代理,连接分布式系统的节点,广播配置的更新。当某个微服务节点的/bus/refresh端点被请求时,会向消息总线发送一个配置更新事件,其他实例获取该事件后更新配置。
Spring Cloud Bus可使用Client端来集成。
1、pom依赖
1 | <dependency> |
2、yml配置
1 | spring: |
3、测试
访问/bus/refresh端点可刷新。
4、架构优化:同样可以使用Server端来集成,将Config Server加入消息总线,这样可以避免Client端被破坏。
高可用性
- Git仓库高可用
- RabbitMQ高可用
- Config Server高可用,可使用Eureka。如未注册到Eureka,需添加负载均衡器。