微服务架构 | 配置中心 - [Config]
@
§1 简介
config + bus 构成 Springcloud 的配置中心,也可以通过 nacos/apollo 实现
用于给多个微服务的每个实例涉及到的公用配置,提供集中的、动态的配置服务
作用
- 集中管理配置文件
- 不同环境下的区别化配置
- 动态化配置生效与热更新
- 配置信息以 rest 接口形式暴露
§2 搭建
Config 分为服务端和客户端,并且依赖一个作为配置仓库的远程库
通常使用 git 作为配置仓库存放各种配置文件
通过 config-server 连接配置仓库,可以读取配置仓库里的内容
通过config-client访问config-server,拉取自己对应的配置内容
§2.1 使用一个代码仓库作为配置库
§2.2 config-server
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
配置
server:
port: 3344
spring:
application:
name: config-server #注册进Eureka服务器的微服务名
cloud:
config:
server:
git:
uri: git@gitee.com:unfixed/sprcloudlearning-config.git #GitHub上面的git仓库名字
####搜索目录
search-paths:
- sprcloudlearning-config
username: 用户名
password: 密码
####读取分支
label: master
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://eureka-1.com:7001/eureka/,http://eureka-2.com:7002/eureka/,http://eureka-3.com:7003/eureka/
启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class,args);
}
}
配置文件访问路径
令 :
标识符 | 含义 | 简称 | 说明 |
---|---|---|---|
配置文件名 | A | 由 spring.application.name 配置指定 | |
环境名 | B | 常见有 dev/test/release/prod | |
分支名 | C |
则,合法的 config 路径为:
- /C/A-B.yml
- /C/A-B.properties
- /A-B.yml
- /A-B.properties
- /A/B/C
§2.3 config-client
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
bootstrap.yml
说明:
- bootstrap.yml 由 BootstrapApplicationListener 加载,生成 bootstrap context 作为 application context 的父级上下文
- bootstrap.yml 是系统级配置文件,用于应用程序上下文的引导阶段
- bootstrap.yml 具有比 application.yml 更高的优先级,其中的配置不能被本地配置覆盖
- bootstrap.yml 适合放置引导应用启动的、不随应用或不同时间场景下应用变化的配置(比如配置中心信息)
可以理解为 application.yml 是用来配置应用的,bootstrap.yml 是用来配置应用启动和启动环境的
server:
port: 3355
spring:
application:
name: config-client
cloud:
#Config客户端配置
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取http://192.168.3.7.com:3344/master/config-dev.yml
uri: http://192.168.3.7:3344 #配置中心地址k
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://eureka-1.com:7001/eureka/,http://eureka-2.com:7002/eureka/,http://eureka-3.com:7003/eureka/
§3 配置热更新
§3.1 半自动热更新(actuator 支持)
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置
# 打开 actuator 功能端点
management:
endpoints:
web:
exposure:
include: "*"
@RefreshScope
添加 @RefreshScope 注解,此注解可以添生效于
- 直接引用配置值(@value("${}"))的类上
- 通过 @ConfigurationProperties 引用配置的配置类上
通过 actuator 接口刷新配置
调用 /actuator/refresh 接口即可刷新配置,也可以使用下面命令实现
curl -X POST "http://192.168.3.7:3355/actuator/refresh"
服务多实例时,可以结合脚本实现批量刷新
§3.2 自动热更新(bus 支持)
原理
添加微服务消息总线 BUS 后,系统中的任意服务可以向 BUS 中发布消息,并由其他所有服务消费,已达到广播的目的
- 可以通过接口触发某个服务刷新配置
- 接到请求的服务会将刷新配置的消息发布到 BUS
- 各个服务消费到 BUS 中对应消息后自动完成配置更新
技术上,只要配置正确,通知任意服务都能实现全服务实例的配置热更新
但通常只由 config-server 处理:
- 热更新配置本身就是 config-server 的职责范围
- 作为 config-client 的业务模块,应该尽量职责单一
- 作为触发点的 config-client 的业务服务实例,破坏了服务节点的对等性(更不可能让所有业务服务实例都具有此能力)
- 作为触发点的 config-client 的业务服务实例,可能具有一定的局限,比如 ip 变动等
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
配置
spring:
rabbitmq:
host: 192.168.3.7
port: 5672
username: guest
password: guest
打开 Actuator 的 endpoint
只在负责发送消息的服务中配置即可,通常是 config-server
management:
endpoints:
web:
exposure:
include: "bus-refresh"
触发刷新配置
全局刷新
curl -X POST "http://192.168.3.7:3344/actuator/bus-refresh"
局部刷新
curl -X POST "http://192.168.3.7:3344/actuator/bus-refresh/服务名:端口号"
消息内容
================================================================================
2022-07-16 8:40:02:256: Message published
Node: rabbit@Vm0
Connection: 192.168.3.7:53827 -> 192.168.3.10:5672
Virtual host: /
User: guest
Channel: 1
Exchange: springCloudBus
Routing keys: [<<"springCloudBus">>]
Routed queues: [<<"springCloudBus.anonymous.aVuxMbBrSz6Hz4PDZ6Eyow">>,
<<"springCloudBus.anonymous.jFggjeHkRAqEmY6jNaWyhQ">>,
<<"springCloudBus.anonymous.qXWGsEcVTxiDnh0zAuUQXg">>]
Properties: [{<<"timestamp">>,signedint,1657960798},
{<<"message_id">>,longstr,
<<"a897332e-5100-2700-1685-f4205df294c3">>},
{<<"priority">>,signedint,0},
{<<"delivery_mode">>,signedint,2},
{<<"headers">>,table,[]},
{<<"content_type">>,longstr,<<"application/json">>}]
Payload:
{"type":"RefreshRemoteApplicationEvent","timestamp":1657960798252,"originService":"config-server:3344:6444f3135345955eefa18e2b8f21c99e","destinationService":"**","id":"6c5ddaa1-3036-4ab4-b36d-387af53faec1"}
传送门:
微服务架构 | 组件目录