SpringCloud Config
使用分布式配置的原因:服务太多,配置太杂,实现统一动态的配置功能方便维护服务。
SpringCloud Config为微服务架构中的微服务提供集中化外部配置支持,配置服务器为每个不同微服务应用的所有环节提供了一个中心化的外部配置。
配置中心服务端
-
添加maven依赖
<!--配置中心服务端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
启动类添加注解@EnableConfigServer
@SpringBootApplication @EnableConfigServer //激活配置中心 public class ConfigCenterApplication { public static void main(String[] args) { SpringApplication.run(ConfigCenterApplication.class,args); } }
-
配置文件yml
配置git仓库地址,可以通过访问配置中心读取到git仓库的文件
server: port: 3344 spring: application: name: cloud-config-center #服务名称 cloud: config: server: git: uri: https://gitee.com/zhaoqingquan/springcloud-config.git #git地址 search-paths: - springcloud-config #搜索路径 label: master #git读取分支 #服务注册eureka eureka: client: service-url: defaultZone: http://eureka1.com:7001/eureka/
读取配置文件规则
-
/{label}/{application}-{profile}.yml:返回文件内容
http://localhost:3344/master/config-test.yml
-
/{application}-{profile}.yml:返回文件内容
http://localhost:3344/config-test.yml
-
/{application}/{pofile}/{lable}:返回JSON格式
http://localhost:3344/config/test/master
-
配置中心客户端
-
引入配置中心客户端maven依赖
<!--配置中心客户端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config</artifactId> </dependency>
-
新建系统级配置文件bootstrap.yml
application.yml是用户及的资源配置文件,bootstrap.yml是系统级的资源配置文件,系统级的配置文件优先级更高,系统优先加载bootstrap.yml
server: port: 3355 spring: application: name: config-client cloud: #Config客户端配置 config: label: master #git分支名称 name: config # 配置文件名称 profile: dev #读取后缀名称 uri: http://localhost:3344 #配置中心地址 eureka: client: service-url: defaultZone: http://eureka1.com:7001/eureka/
-
启动类+测试接口
@SpringBootApplication @EnableEurekaClient public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class,args); } }
/** * 接口测试,通过读取配置中心读取git文件配置 */ @RestController public class TestConfigController { /** * 读取配置 */ @Value("${config.info}") private String configInfo; @GetMapping(value = "/configInfo") public String getConfigInfo(){ return configInfo; } }
此处Git仓库配置修改客户端并不会获取最新配置,需配置动态刷新
动态刷新-手动刷新配置
-
添加pom依赖
<!--监控系统--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
添加配置,暴露监控端点
server: port: 3355 spring: application: name: config-client cloud: config: label: master name: config profile: dev uri: http://localhost:3344 eureka: client: service-url: defaultZone: http://eureka1.com:7001/eureka/ #暴露监控端点 新增 management: endpoints: web: exposure: include: "*"
-
Controller新增注解@RefreshScope
@RestController @RefreshScope public class TestConfigController { /** * 读取配置 */ @Value("${config.info}") private String configInfo; @GetMapping(value = "/configInfo") public String getConfigInfo(){ return configInfo; } }
-
手动调用接口刷新
post请求:http://localhost:3355/actuator/refresh
-
客户端再次获取配置即为最新配置,避免服务重启
消息总线
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个公用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。
Spring Cloud Bus使用来将分布式的节点与轻量级消息系统连接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。支持RabbitMQ和Kafka。Spring Cloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可当做微服务间的通信通道。
利用消息总线触发一个配置中心服务端config-server的bus-refresh端点,去刷新所有客户端的配置
服务端配置
-
添加消息总线RabbitMQ支持
<!--消息总线RabbitMQ支持--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <!--监控系统--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
配置文件添加配置
spring: #rabbitmq配置 rabbitmq: host: port: 5672 username: guest password: guest #rabbitmq配置,暴露bus刷新配置的端点 management: endpoints: web: exposure: include: 'bus-refresh'
客户端配置
-
添加消息总线RabbitMQ支持
<!--消息总线RabbitMQ支持--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
-
客户端yml文件添加rabbitmq配置
spring: #rabbitmq配置 rabbitmq: host: 192.168.136.131 port: 5672 username: guest password: guest
-
修改gitee配置,发送post请求刷新配置:http://localhost:3344/actuator/bus-refresh
ConfigClient实例都会监听MQ中同一个Topic(默认springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样监听同一Topic的服务就得到通知,更新自身配置
-
消息总线动态刷新定点通知
公式:http://{配置中心ip}:{配置中心端口}/actuator/bus-refresh/{destination}。通过destination(微服务名称:端口号)指定需要更新的服务的配置