Spring Cloud Config
概念
Config Server(配置服务器):负责从各种后端存储中拉取配置信息供配置客户端使用
Config Client(配置客户端):应用程序中的一个组件,Config Client通过连接到 Config Server来动态获取配置信息。客户端可以根据条件动态选择对应的配置文件
版本控制集成:Spring Cloud Config 默认使用Git作为配置存储的后端, 这样可以利用Git的版本控制功能来管理配置文件的版本.,每个环境对应一个特定的版本, 可通过切换版本号来自动获取对应环境下的配置
使用
搭建ConfigServer
-
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> -
启用Config Server,在启动类加上
@EnableConfigServer注解 -
完善配置
yamlspring: cloud: config: server: git: uri: #配置文件Git 地址 default-label: #配置文件分支 search-paths: #配置文件所在根目录 -
访问规则
/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.propertiesapplication:微服务名称
profile当前环境的配置文件,spring.profiles.active属性
label:git仓库中的分支,默认为master
-
git上传配置文件命名规则,{application}-{profile}.yml或者{application}-{profile}.properties
搭建ConfigClient
-
添加依赖
SpringCloud会创建一个 Bootstrap Context 作为Spring应用Application Context的父上下文,负责在Spring应用初始化阶段从外部源中加载并解析配置
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> -
完善配置,由于是在Spring初始化阶段读取远程仓库的配置,所以ConfigClient的配置文件要放到bootstrap.yml 或 bootstrap.properties
yamlspring: profiles: active: application: name: cloud: config: uri: ConfigServer地址 -
获取配置
java@Value("${key}") String env; -
多配置中心,读取的还是{application}-{profile}配置,根据spring.profiles.active的不同,选择下方不同的配置
yamlspring: profiles: active: prod application: name: blog-service --- spring: config: activate: on-profile: - dev cloud: config: uri: --- spring: config: activate: on-profile: - prod cloud: config: uri:
配置中心自动刷新
SpringCloudConfig没有原生支持动态刷新,需要手动调用接口
-
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>spring-boot-starter-actuator是SpringBoot提供的监控和管理工具,允许开发者查看和管理SpringBoot应用的搁置运行时指标和状态。
-
添加@RefreshScope
-
开启端点
端点:本质上是服务端或客户端对外提供的 HTTP RESTful 接口 URL,HTTP RESTful是一种设计风格,本质上是通过HTTP 标准方法(Method)来表达增删改查的语义。所以访问/actuator/refresh 要指定为POST请求
management: endpoint: shutdown: enabled: false #禁用/actuator/shutdown,外部通过此接口直接触发 JVM停机 endpoints: web: exposure: include: - "*" #将所有可用的管理端点暴露给 HTTP 协议 -
访问/actuator/refresh 接口(POST)请求,动态刷新Spring Cloud Config客户端的配置
添加WebHooks
WebHooks:每次push代码,都会给远程 HTTP URL 发送一个POST请求

Spring Cloud Bus 自动刷新
解决启动多个客户端服务,修改配置时,需要调用每个服务的/actuator/refresh接口,无法实现一次调用,全服务配置刷新的问题
Spring Cloud Bus 核心原理就是利用消息队列做广播,将实例通过消息队列连接起来。当配置更新时,只需要触发一次指令,Spring Cloud Bus就会通过消息队列广播
-
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> -
添加配置,这里使用RabbitMQ作为消息代理
spring: rabbitmq: addresses: amqp://账号:密码@IP:Port/Vhost -
访问/actuator/busrefresh刷新配置
加密解密
对配置文件属性进行加密, 以保护配置文件中的敏感数据不被泄露
对称加密
-
下载jar包,用不限长度的 JCE 替换掉Java自带的有限长度的 JCE,放到$JAVA_HOME/jre/lib/security目录下
https://www.oracle.com/java/technologies/javase-jce8-downloads.html
-
添加配置,设置密钥,在Config Server服务中添加bootstrap.yml文件
yamlencrypt: key: -
由于使用了bootstrap文件,所以要添加对应的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> -
访问/encrypt/status接口,如果返回{"status":"OK"},表示设置成功
-
加密:

解密:

-
在配置文件中添加加密数据的格式是
'{cipher}密文',单引号不能省略
非对称加密
-
使用keytool生成密钥
keytool -genkeypair -keystore 密钥库的位置和名称(D:/config-server.keystore) -alias keystore关联的别名 -keyalg 指定密钥生成的算法(RSA) -keypass 密钥库口令 -storepass 密钥口令 -
添加配置
encrypt: key-store: location: #keystore文件存储路径 alias: #密钥别名 password: #storepass密钥仓库 secret: #keypass 用来保护所生成密钥对中的密钥
Consul
启动命令
nohup consul agent -dev -client 0.0.0.0 -ui &
http://IP:8500/
服务注册/服务发现
-
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>引入 Consul Discovery 后,Consul Server 默认对注册的客户端进行健康检查。客户端必须引入
spring-boot-starter-actuator并且暴露/actuator/health接口 -
添加配置
yamlspring: application: name: cloud: consul: host: port: discovery: service-name: #可省略,默认为application.name -
在主启动类加上
@EnableDiscoveryClient注解
服务配置/刷新
Consul使用的 Key/Value 格式来管理配置信息,Key为文件名, Value 对应整个配置文件
-
添加配置
-
建立配置文件夹
config/product-service/:使应用名为product-service,未配置profiles.active
config/product-service,dev/ 应用名为product-service, 配置profiles.active为dev
config/product-service,prod/ 应用名为product-service, 配置profiles.active为prod
默认情况下, 配置的路径前缀是 /config
-
添加配置文件
文件名使用data,内容为key:data的yaml格式

-
-
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> -
读取配置,使用@value注解
java@Value("${service-name}") public String serviceName; @Value("${output.info}") String outPutInfo;
动态刷新
Consul原生支持动态刷新配置,在Controller类上面添加@RefreshScope注解开启动态刷新。Consul对配置的检查时间间隔为 1000 ms,通过spring.cloud.consul.config.watch.delay修改。
只针对修改原有配置,不支持新增配置
路径优先级
config/product-service,dev/ #对应服务dev环境的配置
config/product-service/ #对应服务默认环境的配置
config/application,dev/ #全局dev环境的配置
config/application/ #全局默认环境的配置
由具体到抽象,Consul会先优先寻找对应服务名的配置,然后再拉取全局配置,对于相同的key,前者会覆盖后者
bootstrap.yml更多配置
spring:
cloud:
consul:
host: 127.0.0.1
port: 8500
config:
# 是否启用配置中心,默认值 true 开启
enabled: true
# 设置配置的基本文件夹,默认值 config 可以理解为配置文件所在的最外层文件夹
prefix: config
# 配置环境分隔符,默认值 "," 和 default-context 配置项搭配
# 需在 config 文件夹下创建 product-service, product-service-dev, product-service-prod 文件夹即可
profile-separator: '-'
# 指定配置格式为 yaml
format: YAML
# Consul 的 Key/Values 中的 Key, Value 对应整个配置文件,默认为data,也就是配置文件名
data-key: productConfig
# 以上配置可以理解为:加载 config/product-service/ 文件夹下 Key 为 productConfig 的 Value 对应的配置信息
watch:
# 是否开启自动刷新,默认值 true 开启
enabled: true
# 刷新频率,单位:毫秒,默认值 1000
delay: 1000
配置持久化
Consul是否开启持久化与启动命令有关
consul agent options
-dev:开发模式, 关闭所有持久化选项, 用于快速开启consul代理
-server:以服务器模式启动 Consul
client:指定HTTP/DNS/gRPC等服务调用的监听地址,默认为127.0.0.1
-ui:启用 Consul 的 Web 用户界面
-bootstrap-expect:n 设置期望加入的服务器节点数, 只有n个节点成功互通后才开始对外服务
-data-dir:指定数据存储目录,会自动创建目录。除开发模式之外,这个参数必须配置