CloudConfig 实现云动态配置中心
参考:
Spring Cloud config:https://www.cnblogs.com/fengzheng/p/11242128.html
Spring Cloud Bus 消息总线:https://www.cnblogs.com/babycomeon/p/11141160.html
官网: https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.2.RELEASE/reference/html/
一、前言
1.1 Spring Cloud Config
为分布式系统中的外部配置提供服务器和客户端支持。方便部署与运维。分客户端、服务端。
Spring Cloud Config 是一种用来动态获取Git、SVN、本地的配置文件的一种工具
这里采用git
1.2 客户端介绍
客户端则是通过指定配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。默认采用 git,并且可以通过 git 客户端工具来方便管理和访问配置内容。
- 用于外部配置的HTTP,基于资源的API(名称 值对或等效的YAML内容)<br />
- 加密和解密属性值(对称或非对称)<br />
- 使用可轻松嵌入Spring Boot应用程序<br />
- 可以轻松的结合Eureka实现高可用<br />
- 可以轻松的结合Spring Cloud Bus实现自动化持续集成<br />
1.3 服务端介绍
服务端也称分布式配置中心,是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
- 绑定到Config Server并Environment使用远程属性源初始化Spring<br />
- 加密和解密属性值(对称或非对称)<br />
- 结合Eureka实现服务发现<br />
1.4 好处多多
1、修改配置文件不用重新启动服务器,通过刷新机制(springCloudBus)接口(/actuator/bus-refresh)刷新即可。
2、实现了一些配置的保密,如不想让开发人员知道的可读写数据库
3、可以配置加密实现 配置文件的保密(对称和非对称加解密)
二、需要了解
1、springBoot加载配置文件顺序
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml ,
其中 bootstrap.properties 配置为最高优先级
2、 Spring Cloud Config 有它的一套访问规则,只能在 config 服务器 进行查看。
/{application}/{profile}[/{label}]
/{application}-{profile}.yml /{label}
/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
{application} 就是应用名称,对应到配置文件上来,就是配置文件的名称部分,例如我上面创建的配置文件。
{profile} 就是配置文件的版本,我们的项目有开发版本、测试环境版本、生产环境版本,对应到配置文件上来就是以 application-{profile}.yml 加以区分,例如application-dev.yml、application-sit.yml、application-prod.yml。
{label} 表示 git 分支,默认是 master 分支,如果项目是以分支做区分也是可以的,那就可以通过不同的 label 来控制访问不同的配置文件了。
上面的 5 条规则中,我们只看前三条,因为我这里的配置文件都是 yml 格式的。根据这三条规则,我们可以通过以下地址查看配置文件内容:
http://localhost:3301/config-single-client/dev/master
http://localhost:3301/config-single-client/prod
http://localhost:3301/config-single-client-dev.yml
http://localhost:3301/config-single-client-prod.yml
http://localhost:3301/master/config-single-client-prod.yml
通过访问以上地址,如果可以正常返回数据,则说明配置中心服务端一切正常。
3、使用 Spring Cloud Bus 来自动刷新多个端
Spring Cloud Bus 将分布式系统的节点与轻量级消息代理链接。这可以用于广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是,Bus 就像一个扩展的 Spring Boot 应用程序的分布式执行器,但也可以用作应用程序之间的通信渠道。
—— Spring Cloud Bus 官方解释
三、搭建过程
接下来,我们开始在 Spring Boot 项目中集成 Spring Cloud Config,并以 github 作为配置存储。除了 git 外,还可以用数据库、svn、本地文件等作为存储。主要从以下三块来说一下 Config 的使用。
1.基础版的配置中心(不集成 Eureka);
2.结合 Eureka 版的配置中心;
3.实现配置的自动刷新(使用springCloudBus);
3.1搭建需要,这里以我的项目为例
1、使用了 rabbitmq 作为消息总线,实现 配置文件通知的提醒
2、使用eureka 用于注册于发现
3、我的github已经实现: https://github.com/tianliuzhen/springCloud
config-server | config 服务器 | 配置github的仓库的账号和密码 |
---|---|---|
config-client | config 客户端 | 用于 连接 config 服务器获取 git远程仓库的配置文件 |
config-bus | 消息总线客户端 | 这里为了方便理解消息总线,单独做了一个demo 消息总线其实和config 客户端 一模一样 |
config | 我的github用于存储config | 项目位置:https://github.com/tianliuzhen/cloud-configs |
四、加解密
两种形式,个人觉得 对称加解密 足够
1、对称加解密
2、非对称加解密
4.1 对称加解密 推荐使用
参考: https://blog.csdn.net/qincidong/article/details/82752539
需要注意两点
1、 在Config Server所在的应用增加秘钥的配置(配置到bootstrap.yml):
对称加解密 key
encrypt:
key: salt
然后重启Config Server应用。
测试接口
这里的 3301 是 config-server 服务器
1、测试接口是否正常: http://localhost:3301/encrypt/status
2、加密 http://localhost:3301/encrypt
2、解密 http://localhost:3301/encrypt
4.2 非对称加解密
参考: https://segmentfault.com/a/1190000011680775(入门)
https://blog.csdn.net/liuxinghao/article/details/78216201(解坑)
4.2.1 准备工作
其实,jdk自带的工具也是OK的,已经很保密了
4.2.2 生成 生成密钥对
上文我们使用了对称加解密的方式来确保配置文件的安全性,如果使用非对称加解密的方式,我们的安全性将会得到进一步的提高。使用非对称加密的话需要我们先生成密钥对,生成密钥对可以直接使用jdk中自带的keytool工具,方式如下:
keytool -genkeypair -alias config-server -keyalg RSA -keystore config-server.jks
执行成功之后,会在命令执行目录下生成一个名为config-server.keystore的文件,将该文件拷贝到config-server的src/main/resources目录下,然后在bootstrap.yml 做如下配置:
#非对称加解密
encrypt:
key-store:
location: classpath:/config-server.jks
alias: config-server
password: tianlz
secret: 12345678
4.3 注意点
1.配置encrypt.key=foo必须配置到bootstrap.yml中,不能配置到application.yml,否则无法加密。会返回如下错误
2.yml配置文件加密项需要使用引号,而Properties文件则不能用引号引起来。
data:
env: config-eureka-dev
user:
username: eureka-client
password: ‘{cipher}01af96782a0939f3c19c0af706ca8e3a60879d90464a6b1dda5627c0d56994df’
五、注意事项:
1、bus 消息总线 刷新路径
在springboot2.x的版本中刷新路径为:/actuator/bus-refresh,(bus 全局生效)
在springboot1.5.x的版本中刷新路径为:/bus/refresh。(单个生效)
注意这些刷新接口,均是post,并且需要参数类型content-type:application/json
2、切换本地方式读取配置信息
spring.cloud.config.server.git的配置改成spring.profiles.active=native,然后在resources路径下新增一个文件即可。
3、eureka和 **git config yml文件加载位置问题
在结合 eureka 的场景中,关于 eureka 和 git config 相关的配置要放在 bootstrap.yml 中,否则会请求默认的 config server 配置,这是因为当你加了配置中心,服务就要先去配置中心获取配置,而这个时候,application.yml 配置文件还没有开始加载,而 bootstrap.yml 是最先加载的。
4、 Config Server的依赖问题
之前我们一般都是用的各种starter,而这个config server不是
spring-cloud-starter-config-server而是spring-cloud-config-server
5、 @Value 或 @ConfigurationProperties 问题。
@Value 如果和 controller 不在 一个类里面。重新加载后 **@Value会无效
6、 要注意客户端的 application 名称要和 github 中配置文件的名称一致。
除了注册到 Eureka 的配置外,就是配置和配置中心服务端建立关系。
其中 service-id 也就是服务端的application name。
7、采用 ssh 连接
参考: https://blog.csdn.net/YapingGe2014/article/details/79737506
使用参数来生成密钥
ssh-keygen -m PEM -t rsa -b 4096
spring:
application:
name: config-eureka-server # 云 config服务器 配置名称,用于config客户端连接
cloud:
config:
server:
git:
#配置文件所在仓库
uri: git@git.haoxiaec.com:tianliuzhen/cloud-configs.git
ignoreLocalSshSettings: true #为了激活基于属性的SSH配置
#官网给的是 三个参数注释掉能用
# default-label: master #配置文件分支
# hostKey:
# hostKeyAlgorithm: ssh-rsa
# 一定要使用
# ** ssh-keygen -m PEM -t rsa -b 4096 * 进行生成
private-key: |
——-BEGIN RSA PRIVATE KEY——-
MIIJKgIBAAKCAgEA1QWAhKDVP33NghwLq4C/KjCsCTvao6nRd8fgdaUm5la25ktv
………
——-END RSA PRIVATE KEY——-
8、如果使用非对称出现问题
4.2.2 如果这里出现问题 需要配置maven pom 拦截
因为自定义的配置文件。maven打包会拦截掉,不会编译