简介
ESB(企业服务总线)是OA (面向服务架构)的一种常见的设计实践 基于总线的设计,借鉴了计算机内部硬件组成的设计思想:通过总线传输数据。在分布式系统中,不同子系统之间需要实现相互通信和远程调用,比较直接的方式就 “点对点”的通信方式,但是这样会暴露出一些很明显的问题:系统之间紧密耦合、配置和引用混乱、服务调用关系错综复杂、难以统一管理、异构系统之间存在不兼容等。基于总线 的设计,可以解决上述问题。总线作为中枢系统,提供统一的服务入口,实现了服务统一管理、服务路由、协议转换、数据格式转换等功能。这样能够将不同系统有效地连接起来,并大大降低了连接数(每个子系统只需要和总线建立连接)和系统问连接拓扑的复杂度。
Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新。目前Spring Cloud Bus支持两种消息代理:RabbitMQ和Kafka,这里使用RabbitMQ来实现Spring Cloud Bus动态刷新配置的功能。
动态刷新配置
对前面配置项目改进如下图:
消息总线连接了Config-Server和Config-Client,当配置提交到配置仓库时,利用webhook或者手动访问/actuator/bus-refresh 端点,Config-Server将会将变更消息通知到各个客户端。
主要涉及的服务包括:
- 配置服务器Config-Server,从配置仓库中拉取配置,注册到服务注册中心,并为配置客户端提供配置信息;
- 口配置客户端 Config-Client-1,注册到服务注册中心,在启动时从配置服务器拉取配置;
- 配置客户端 Config-Client-2,同上;
- 配置仓库Config-Repo;
准备
其中注册中心还是沿用前面的eureka-serve,对config-server、config-client进行修改。
config-server添加消息总线支持
添加依赖
<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>
RabbitMQ和Actuator端点配置
server:
port: 8500
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/fengerwa/study-springcloud.git
search-paths: springcloud-config
default-label: master
username:
password:
# rabbitmq配置
rabbitmq:
addresses: 127.0.0.1
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
# 自定义服务名称信息
instance-id: config-server:8500
#访问路径可以显示Ip地址
prefer-ip-address: true
# 设置actuator在HTTP上暴露所有的控制端点
management:
endpoints:
web:
exposure:
include: '*'
config-client添加消息总线支持
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
RabbitMQ配置
spring:
application:
name: config-client
cloud:
config:
# uri: http://localhost:8500/ #配置服务地址
label: master
profile: dev
discovery:
enabled: true #从配置中心读取文件
service-id: config-server #配置中心的servieId,即服务名。
# rabbitmq配置
rabbitmq:
addresses: 127.0.0.1
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
# 自定义服务名称信息
instance-id: config-client:8600
#访问路径可以显示Ip地址
prefer-ip-address: true
添加注解@RefreshScope
@RestController
@RequestMapping("/api")
@RefreshScope
public class ConfigPrintController {
@Value("${config.name}")
private String name;
@Value("${config.age}")
private String age;
@PostMapping("/printConfig")
public String printConfig(){
return "name:" + name + ",age:" + age;
}
}
测试
- 未修改时,访问接口返回情况
- 通过post访问http://localhost:8500/actuator/bus-refresh端点,刷新配置
返回参数已经改变,证明我们配置成功。