Spring|Spring Cloud Config--配置管理中心

Spring Cloud Config 在微服务项目下,随着服务越来越多,所需要的配置文件也越来越多,因此若需要将这些文件集中管理,可以通过Spring Cloud Config实现。
Spring Cloud Config是一个分布式系统配置管理解决方案,它包含了Client和Server,配置文件放在Server端,通过接口的形式提供给Client。
Spring Cloud Config主要功能:

  • 集中管理各个环境、各个微服务的配置文件
  • 提供服务端和客户端的支持
  • 配置文件修改后可以快速生效
  • 配置文件通过Git/SVN进行管理,天然支持版本回退
  • 支持高并发,也支持多种开发语言
准备工作 在本地准备好相应配置文件,文件命名规则如下
Spring|Spring Cloud Config--配置管理中心
文章图片
image 提交至github的自建仓库。
Config Server 通过Config Server自动从Github上加载配置文件,并以接口的形式提供给Config Client。
首先创建config-server模块,添加时加入Web、Config Server依赖
项目创建成功后在启动类上添加@EnableConfigServer注解
在配置中添加github仓库的相关信息
spring.application.name=config-server server.port=8081 #配置github仓库地址 spring.cloud.config.server.git.uri=https://github.com/zby981207/configRepo.git #仓库中配置文件目录 spring.cloud.config.server.git.search-paths={application} #仓库用户名密码 spring.cloud.config.server.git.username=zby981207 spring.cloud.config.server.git.password=xxxxx

配置完成后启动config server,访问http://localhost:8081/client1/dev/master,就可以看到配置文件信息,同时在控制台也可以看到配置文件被保存在了一个临时目录中。
访问地址有如下规则:
/{application}/{profile}/[{label}]
/{label}/{application}-{profile}.properties
  • application:表示配置文件名
  • profile:表示配置文件的profile,如test、dev
  • label:表示git分值,该参数可选,默认为master
接下来可以修改配置文件并重新提交到github,刷新ConfigServer接口,就可以及时看到最新的配置内容。
Config Client 首先创建config-client模块,添加时加入Web、Config Client依赖
项目创建成功后在resources目录下添加bootstrap.properties,做如下配置
#服务名要和配置文件的application.name保持一致 spring.application.name=client1 #对应config-server中的{profile} spring.cloud.config.profile=dev #对应config-server中的{label} spring.cloud.config.label=master spring.cloud.config.uri=http://localhost:8081 server.port=8082

之后添加测试接口,将配置文件中的值注入到接口中,访问接口就可以看到配置文件可以获取到
@RestController public class HelloController { @Value("${config}") String config; @GetMapping("/hello") public String hello(){ return config; } }

配置文件加密 Spring Cloud Config支持对配置文件中的私密信息进行加密。
常见加密方案有两种:1.不可逆加密 2.可逆加密
不可逆加密就是理论上不可根据加密后的秘文推算出明文。常见的有MD5算法、SHA安全散列等,一般用于密码的加密。
可逆加密就是可以根据加密后的秘文推断出明文的加密方式。可逆加密又分为对称加密和非对称加密。对称加密指加密秘钥和解密秘钥是一样的,常见算法有des、3des、aes。非对称加密指加密秘钥和解密秘钥不同,加密的叫做公钥,可公开,解密使用私钥,自己保存,多用于一对多的通讯使用,常用的算法是RSA。
对称加密
首先下载不限长度的JCE,下载地址
下载完成后解压文件,将文件中的两个jar包放入jdk(jre)/lib目录下的security文件夹中。
在config-server中添加bootstrap.properties配置文件,在配置文件中配置秘钥:encrypt.key=security
然后启动模块,访问http://localhost:8081/encrypt/status,查看加密状态是否为“OK”。
在postman中向http://localhost:8081/encrypt发送post请求可对一段明文进行加密。
Spring|Spring Cloud Config--配置管理中心
文章图片
image 【Spring|Spring Cloud Config--配置管理中心】把加密后的明文存储到git仓库中,存储时记得加一个{ciper}前缀
非对称加密
进行非对称加密首先要生成密钥对。
执行如下命令,生成keystore
keytool -genkeypair -alias config-server -keyalg RSA -keystore D:\workspace\config-server.keystore

  • genkeypair: 生成密钥对
  • alias:密钥对别名
  • keyalg:加密算法
  • keystore:密钥对存放位置
然后将生成的密钥对放在config-server的resources目录下,然后在config-server中的bootstrap.properties配置文件中做如下配置:
encrypt.key-store.location=config-server.keystore encrypt.key-store.alias=config-server encrypt.key-store.password=789456 encrypt.key-store.secret=789456

在pom中设置加载.keystore文件
src/main/resources **/*.properties **/*.keystore

在EndPoints中查看加密状态为OK

Spring|Spring Cloud Config--配置管理中心
文章图片
image 安全管理 为防止通过config-server修改配置文件,可以使用Spring Security来保护接口。
首先在config-server中添加spring security依赖。添加依赖后接口就会被自动保护起来。
在config-server的bootstrap.application文件中配置spring security登录的用户名和密码:
spring.security.user.name=admin spring.security.user.password=123

再在config-client的bootstrap.application文件中做如下配置:
spring.cloud.config.username=admin spring.cloud.config.password=123

配置文件服务化 将config-server和config-client注册到Eureka上,这样就可以实现配置文件的自动获取,不必在client配置中写死server的地址。
首先启动Eureka,并在server和client中添加Eureka的依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client

之后将config-server注册到Eureka上
eureka.client.service-url.defaultZone=http://localhost:1111/eureka

开启config-client中服务发现功能,并将client也注册到eureka
#开启通过eureka获取config-server的功能 spring.cloud.config.discovery.enabled=true spring.cloud.config.discovery.service-id=config-server #暴露refresh端点 management.endpoints.web.exposure.include=refresh eureka.client.service-url.defaultZone=http://localhost:1111/eureka

最后再给config-client使用了配置文件的地方加上@RefreshScope注解
@RestController @RefreshScope public class HelloController { @Value("${config}") String config; @GetMapping("/hello") public String hello(){ return config; } }

重启server和client就可以将他们俩注册到eureka上,client也可以从eureka上读取server中的配置文件信息,在配置文件更新时,client也会自动刷新
当配置文件发生变化时,向http://localhost:8082/actuator/refresh发送post请求,即可自动刷新配置文件

    推荐阅读