Spring Cloud Config
在微服务项目下,随着服务越来越多,所需要的配置文件也越来越多,因此若需要将这些文件集中管理,可以通过Spring Cloud Config实现。
Spring Cloud Config是一个分布式系统配置管理解决方案,它包含了Client和Server,配置文件放在Server端,通过接口的形式提供给Client。
Spring Cloud Config主要功能:
- 集中管理各个环境、各个微服务的配置文件
- 提供服务端和客户端的支持
- 配置文件修改后可以快速生效
- 配置文件通过Git/SVN进行管理,天然支持版本回退
- 支持高并发,也支持多种开发语言
准备工作
在本地准备好相应配置文件,文件命名规则如下
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请求可对一段明文进行加密。
image把加密后的明文存储到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文件
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.keystore</include>
</includes>
</resource>
</resources>
在EndPoints中查看加密状态为OK
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的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
之后将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请求,即可自动刷新配置文件
网友评论