分布式系统配置管理的解决方案。包含Client和Server。配置文件存放在Server端,通过接口的形式提供给Client。
主要功能
- 集中管理各个环境,各个微服务的配置文件
- 提供服务端和客户端的支持
- 配置文件修改之后,马上生效(不需要重启)
- 配置文件通过git/svn进行管理,支持版本回退
- 支持高并发
ConfigServer
- 需要添加ConfigServer依赖
- 需要添加@EnableConfigServer注解在启用类上
- 添加配置文件
# 应用名称
spring.application.name=cloudconfig
server.port=8081
# 配置文件仓库地址
spring.cloud.config.server.git.uri=https://gitee.com/lizhi68/springcloudconfig.git
# 仓库某个配置文件的目录
spring.cloud.config.server.git.search-paths=client1
# 仓库账号/密码
spring.cloud.config.server.git.username=1580424756@qq.com
spring.cloud.config.server.git.password=xxxxxxxx
接口访问规则
/{application}/{profile}/{label}
/{application}-{profile}.yml
/{application}/{profile}.properties
/{label}/{application}-{profile}.yml
/{label}/{application}-{profile}.properties
application:表示配置文件名前缀或者项目文件夹名都可以
profile:表示配置文件profile,例如:prod,test,dev
label:表示git分支,参数可填可不填,默认master
配置及时提交到远程仓库,能够及时刷新
配置
这里的{application}占位符,表示Client配置的name属性值
{profile}表示Client配置的profile属性值
{label}表示Client配置的label属性值
spring.cloud.config.server.git.search-paths={application}
classpath配置
spring.profiles.active=native
或spring.cloud.config.server.native.search-locations=指定绝对路径
ConfigClient
- 添加依赖ConfigClient依赖
- 添加web依赖
添加bootstrap.properties配置(加载顺序在application.properties之前)
spring.application.name=client1
spring.cloud.config.profile=test
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:8081
server.port=8082
测试
@RestController
public class HelloController {
@Value("${lizhi}")
String lizhi;
@GetMapping("/hello")
public String hello(){
return lizhi;
}
}
动态刷新
当git的配置文件更新之后,只有ConfigServer可以及时查询最新数据。但是ConfigClient并不能做到。
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 添加配置,暴露refresh端点
management.endpoints.web.exposure.include=refresh
- 给需要及时获取实时信息的地方添加@RefreshScope注解
- 先调用refresh端点
- 在获取对应接口,就可以获取最新数据
请求重试
正常来说,配置了连接指向ConfigServer,启动ConfigClient项目时,如果没有连接成功是不会报错的,只有在调用相应接口时才会报错。
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
- 配置文件
开始快速响应
spring.cloud.config.fail-fast=true
配置重试机制
# 请求重试的初始间隔时间
spring.cloud.config.retry.inital-interval=1000
# 最大重试次数
spring.cloud.config.retry.max.attempts=6
# 重试时间间隔乘数
spring.cloud.config.retry.multiplier=1.1
# 最大间隔时间
spring.cloud.config.retry.max-interval=1000
加密
- 不可逆加密(MD5,SHA)
- 可逆加密
- 1 . 对称加密(加密/解密的密钥是一样的:des、aes)
- 2 . 非对称加密(加密/解密的密钥不一样,有公钥,私钥:RSA)
对称加密
- 配置JCE
将下载的jce的jar包放入JDK的lib/security文件夹下
- 在ConfigServer项目的bootstrap.properties配置密钥
encrpt.key=lizhi
在body体中添加明文,可以进行加密返回密文
将原有配置文件的明文替换成密文加上{cipher}前缀
非对称加密
- 使用kettool命令生成密钥对
keytool -genkeypair -alias config-server -keyalg RSA -keystore
D:\cloud\config-server.ketstore
将生成的store文件放在ConfigServer的resources目录下
- 在ConfigServer的bootstrap.properties配置
encrypt.key-store.location=config-server.keystore
encrypt.key-store.alias=config-server
encrypt.key-store.password=111111
encrypt.key-store.secret=111111
安全管理
防止用户直接通过ConfigServer看到配置文件信息,可以使用SpringSecurity来保护ConfigServer接口。
- ConfigServer添加SpringSecurity依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- ConfigServer配置SpringSecurity加密的账户/密码
spring.security.user.name=lizhi
spring.security.user.password=123456
- ConfigClient的bootstrap.properties配置访问ConfigServer的账户/密码,与ConfigServer的对应
spring.cloud.config.username=lizhi
spring.cloud.config.password=123456
服务化
之前的配置都是在ConfigClient中之间指向对应的ConfigServer,与Eureka并无关系。
- 先让ConfigServer、ConfigClient都注册到Eureka上,添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-boot-starter-netflix-eureka-client</artifactId>
</dependency>
- ConfigServer、ConfigClient都注册到Eureka上去
eureka.client.service-url.defaultZone=http://localhost:1111/eureka
修改ConfigClient的配置文件,不用写死ConfigServer地址了。
# 开通eureka获取ConfigServer的功能
spring.cloud.config.discovery.enabled=true
# 配置configServer的服务名称
spring.cloud.config.discovery.service-id=config-server
注意:加入eureka client之后,启动ConfigServer会报错。需要重新生成一个jks格式的密钥
keytool -genkeypair -alias mytestkey -keyalg RSA -keypass 111111 -keystore
D:\cloud\config-service.jks -storepass 1111111
生成的文件cp到ConfigServer的resources目录下,同时修改bootstrap.proerties配置