一、 分布式配置中⼼应⽤场景
1、 集中配置管理,⼀个微服务架构中可能有成百上千个微服务,所以集中配置管理是很重要的(⼀次修改、到处⽣效)
2、 不同环境不同配置,⽐如数据源配置在不同环境(开发dev,测试test,⽣产prod)中是不同的
3、 运⾏期间可动态调整。例如,可根据各个微服务的负载情况,动态调整数据源连接池⼤⼩等配置修改后可⾃动更新
4、 如配置内容发⽣变化,微服务可以⾃动更新配置
那么,我们就需要对配置⽂件进⾏集中式管理,这也是分布式配置中⼼的作⽤。
二、Spring Cloud Config
1. Config 简介
- Server 端:提供配置⽂件的存储、以接⼝的形式将配置⽂件的内容提供出去,通过使⽤@EnableConfigServer注解在 Spring boot 应⽤中⾮常简单的嵌⼊
- Client 端:通过接⼝获取配置数据并初始化⾃⼰的应⽤
2. Config分布式配置应⽤
- Config Server是集中式的配置服务,⽤于集中管理应⽤程序各个环境下的配置。 默认使⽤Git存储配置⽂件内容,也可以SVN。
- 构建Config Server统⼀配置中⼼,引⼊依赖坐标(需要注册⾃⼰到Eureka)
- 注解@EnableConfigServer开启配置中⼼服务器功能
- 构建Client客户端
- application.yml修改为bootstrap.yml配置⽂件,bootstrap.yml是系统级别的,优先级⽐application.yml⾼,应⽤启动时会检查这个配置⽂件,在这个 配置⽂件中指定配置中⼼的服务地址,会⾃动拉取所有应⽤配置并且启⽤。
三、Config配置⼿动刷新
不⽤重启微服务,只需要⼿动的做⼀些其他的操作(访问⼀个地址/refresh)刷新,之后再访问即可 此时,客户端取到了配置中⼼的值,但当我们修改GitHub上⾯的值时,服务端(Config Server)能实时获取最新的值,但客户端(Config Client)读的是缓存,⽆法实时获取最新值。Spring Cloud已 经为 我们解决了这个问题,那就是客户端使⽤post去触发refresh,获取最新数据。
- Client客户端添加依赖springboot-starter-actuator
- Client客户端bootstrap.yml中添加配置(暴露通信端点)
- Client客户端使⽤到配置信息的类上添加@RefreshScope
- ⼿动向Client客户端发起POST请求,http://localhost:8080/actuator/refresh,刷新配置信息
注意:⼿动刷新⽅式避免了服务重启(流程:Git改配置—>for循环脚本⼿动刷新每个微服务)
四、Config配置⾃动更新
实现⼀次通知处处⽣效,与zk原理相同,在微服务架构中,我们可以结合消息总线(Bus)实现分布式配置的⾃动更新(Spring Cloud Config+Spring Cloud Bus)
1. 消息总线Bus
Spring Cloud Bus(基于MQ的,⽀持RabbitMq/Kafka) 是Spring Cloud中的消息总线⽅案,Spring Cloud Config + Spring Cloud Bus 结合可以实现配置信息的⾃动更新。
2. Spring Cloud Config+Spring Cloud Bus 实现⾃动刷新
- Config Server服务端添加消息总线⽀持
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- ConfigServer添加配置
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
- 微服务暴露端⼝ 重启各个服务,更改配置之后,向配置中⼼服务端发送post请求 http://localhost:9003/actuator/bus-refresh, 各个客户端配置即可⾃动刷新, 在⼴播模式下实现了⼀次请求,处处更新,如果我只想定向更新呢? 在发起刷新请求的时候http://localhost:9006/actuator/bus-refresh/lagou-service-resume:8081 即为最后⾯跟上要定向刷新的实例的 服务名:端⼝号即可