在分布式系统中,我们每个服务都有自己的配置内容,这些内容里面有很多共用的配置,比如数据库连接,注册中心的配置等,这个时候就需要一个统一的文件中心服务来就行把这些配置集中管理,Spring cloud Config可以帮我们完成这个功能,但是如果仅仅只有的话还是不能满足我们的需求,假如我们配置发生了改变,这个时候其他的服务就需要重新读取新的配置内容,如果频繁重启服务就会造成服务中断,影响一些核心业务,导致一系列的严重后果,这个时候如果有一个可以在配置文件变更后可以通知各种服务重新读取配置内容的应用这些问题就会迎刃而解,那么他就是Spring cloud bus消息总线,Spring cloud bus简单的说就是把消息放入消息RabbitMq,Kafka中间件中入中,整合java的事件处理机制和消息中间件的发送和接收。
继续使用上一篇教程的代码工程,在其下面再创建一个model工程config-server作为配置文件中心
pom文件中引入
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-config-server
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-bus-amqp
配置文件如下:
spring.application.name=config-server
server.port=8885
#git地址
spring.cloud.config.server.git.uri=https://github.com/HSUD/Spring-Colude.git
#文件路径
spring.cloud.config.server.git.searchPaths=Config
#分支
spring.cloud.config.label=master
#github用户名称
spring.cloud.config.server.git.username=
#github用户密码
spring.cloud.config.server.git.password=
#注册中心地址
eureka.client.serviceUrl.defaultZone=http://dush:8881/eureka/
#rq配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#消息总线
spring.cloud.bus.enabled=true
spring.cloud.bus.trace.enabled=true
management.endpoints.web.exposure.include=*
在启动类上添加@RefreshScope注解
Spring cloud Config通过git来就行管理配置文件,只需要在配置中就行配置就可以实现,在git仓库这里我放了三个配置文件就行演示
在启动类上添加:@EnableConfigServer开启configServer,@EnableDiscoveryClient提供注册发现,@EnableEurekaClient三个注解
依次启动server-eureka,config-server,访问http://dush:8881/,可以看到configServer已经注册成功
访问http://localhost:8885/application-test.yml可以看到配置内容
接下来打开我们的service-consumer服务,就行改造集成
pom文件中添加configServer和bus的依赖
org.springframework.cloud
spring-cloud-starter-config
org.springframework.cloud
spring-cloud-starter-bus-amqp
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-stream-binder-rabbit
配置文件如下:
spring.application.name=service-consumer
server.port=8883
eureka.client.serviceUrl.defaultZone=http://dush:8881/eureka/
spring.cloud.config.label=master
spring.cloud.config.profile=test
spring.cloud.config.name=application-test
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-server
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.cloud.bus.enabled=true
spring.cloud.bus.trace.enabled=true
management.endpoints.web.exposure.include=*
在启动类上添加@RefreshScope注解
在controller添加一个hello接口读取远程配置的hello的值
package com.demo.controller;
import com.demo.service.ConsumerFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/producer/")
public class ConsumerController {
@Autowired
private ConsumerFeignService consumerFeignService;
@Value("${server.port}")
String port;
@Value("${spring.application.name}")
String applicationName;
@Value("${hello}")
String hello;
@GetMapping("hello")
public String hello() {
return hello;
}
@GetMapping("getHello")
public String getHello() {
return applicationName +" "+ port + " rpc==== >" +consumerFeignService.gethello();
}
}
启动service-consumer服务,访问http://localhost:8883/producer/hello
这个时候一个config的服务流程已经搭建完成,下面验证一下bus:
这个时候我们在github直接修改application-test.yml文件(偷个懒)的hello值为word881122
这个时候我们在访问http://localhost:8883/producer/hello
这个时候值还是没有变的,但是我们执行http://localhost:8885/actuator/bus-refresh,此命令是post请求,可以使用curl执行
curl -X POST http://localhost:8885/actuator/bus-refresh
在访问http://localhost:8883/producer/hello
可以看到hello的值已经被修改
当然在实际使用中会比这个更复杂,我们可以吧配置注册中心地址中心,数据库连接,rq连接这些维护到config服务中去