Spring|Spring Cloud Config--配置管理中心
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
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 【Spring|Spring Cloud Config--配置管理中心】把加密后的明文存储到git仓库中,存储时记得加一个{ciper}前缀
非对称加密
进行非对称加密首先要生成密钥对。
执行如下命令,生成keystore
keytool -genkeypair -alias config-server -keyalg RSA -keystore D:\workspace\config-server.keystore
- genkeypair: 生成密钥对
- alias:密钥对别名
- keyalg:加密算法
- keystore:密钥对存放位置
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
文章图片
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请求,即可自动刷新配置文件
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 2018-07-09|2018-07-09 Spring 的DBCP,c3p0
- spring|spring boot项目启动websocket
- Spring|Spring Boot 整合 Activiti6.0.0
- Spring集成|Spring集成 Mina
- springboot使用redis缓存
- Spring|Spring 框架之 AOP 原理剖析已经出炉!!!预定的童鞋可以识别下发二维码去看了
- Spring|Spring Boot之ImportSelector