配置中心-Bus

0
字数 1.8k
阅读时间 3 分钟

Spring Cloud Bus

Bus 的官方文档对 Bus 描述如下:

Spring Cloud Bus links nodes of a distributed system with a lightweight message broker. This can then be used to broadcast state changes (e.g. configuration changes) or other management instructions. The only implementation currently is with an AMQP broker as the transport, but the same basic feature set (and some more depending on the transport) is on the roadmap for other transports.

Spring Cloud Bus 使用轻量级消息代理链接分布式系统的节点。然后,这可以用于广播状态改变(例如,配置改变)或其他管理指令。目前唯一的实现是使用 AMQP 代理作为传输,但是相同的基本功能集(以及一些更多取决于传输)是其他传输的路线图。

简单来讲官方对 Bus 的定位是消息传输
本 doom 利用 RabbitMQ 来实现消息总线的功能。

添加 Bus 依赖

config 项目添加 Bus 依赖

config 项目添加 spring-cloud-starter-bus-amqp 依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.github.liuzhuoming23</groupId>
<artifactId>config-center</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<packaging>jar</packaging>

<artifactId>config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config</name>
<description>Demo project for Spring Cloud</description>

<dependencies>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

其中 spring-cloud-starter-stream-rabbit 依赖为指定实现消息总线的方式为 rabbitmq
application.yml 配置修改为:

server:
port: 8040

spring:
application:
name: @pom.artifactId@
cloud:
config:
server:
git:
uri: https://gitee.com/liuzhuoming23/config-repo
search-paths: config
username:
password:
bus:
#开启消息总线功能
enabled: true
rabbitmq:
#rabbitmq host
host: localhost
#rabbitmq port
port: 5672
#rabbitmq 帐号
username: guest
#rabbitmq 密码
password: guest

eureka:
client:
service-url:
defaultZone: http://admin:admin@localhost:8000/eureka/

management:
endpoints:
web:
exposure:
#配置监控endpoint,其中bus-refresh为根据消息总线刷新配置的endpoint
include: bus-refresh,httptrace,info,health

然后重启 config 项目,访问 rabbitmq 后台管理页面http://localhost:15672,进入 Exchanges 选项卡,可以看到 Exchanges 里面已经增加了名为 springCloudBus 的 topic:
01.jpg

producer-client 项目添加 Bus 依赖

producer-client 项目 pom.xml 修改为:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.github.liuzhuoming23</groupId>
<artifactId>server-center</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<packaging>jar</packaging>

<artifactId>producer-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>producer-client</name>
<description>Demo project for Spring Cloud</description>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

application.yml 修改为:

server:
port: 8010

spring:
application:
name: @pom.artifactId@
cloud:
bus:
enabled: true
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest

management:
endpoints:
web:
exposure:
include: refresh,info,health

然后重启 8010 和 8011 两个项目,访问 rabbitmq 后台管理页面http://localhost:15672,进入 Exchanges 选项卡,打开 springCloudBus 详情,可以看到 springCloudBus 主题下绑定了三个实例,其中一个为发布者,另外两个为订阅者(不过我没分辨出哪个是哪个):
02.jpg

根据 Bus 刷新全部 producer-client 实例的动态配置

修改 git 里面的 config/producer-client-dev.yml 文件为:

config:
name: 国际巨星🍺xj

使用 Postman 用 POST 请求访问http://localhost:8040/actuator/bus-refresh/,然后分别访问http://localhost:8010/port/testhttp://localhost:8011/port/test,返回结果都是(因为根据消息总线刷新配置过程稍微久一点,所以在刷新之后个别实例配置并没有更新过来也是正常的,打印的端口都是 8010 的问题参照上一章):
国际巨星🍺xj | test: client port | 8010
说明根据消息总线刷新全部实例成功。
在刷新配置的时候访问 rabbitmq 后台管理页面http://localhost:15672,进入 Exchanges 选项卡,打开 springCloudBus 详情,会看到已经产生了消息数据的传递:
03.jpg

根据 Bus 刷新局部 producer-client 实例的动态配置

修改 git 里面的 config/producer-client-dev.yml 文件为:

config:
name: 战术后仰

使用 Postman 用 POST 请求访问http://localhost:8040/actuator/bus-refresh/producer-client:8010,然后访问http://localhost:8010/port/test,返回结果:
战术后仰 | 🐕: client port | 8010 | feign
看到 8010 实例的配置已经改变,然后访问http://localhost:8011/port/test,返回结果:
国际巨星🍺xj | 🐕: client port | 8010 | feign
看到 8011 实例的配置并未改变,也就证明局部刷新配置成功。


系列文章 #Spring Cloud

(1)前言

(2)注册中心-Eureka

(3)服务间调用-Feign(🔒)

(4)路由中心-Gateway

(5)配置中心-Config

(6)配置中心-Bus

(7)监控中心-Admin

(8)监控中心-Sleuth+Zipkin(🔒)

(9)监控中心-Elasticsearch+Zipkin(🔒)

(10)监控中心-HystrixDashboard+Turbine(🔒)

(11)授权中心-Oauth2+JWT

(12)注册中心/配置中心-Nacos

(13)动态路由-Gateway

(14)授权中心-Oauth2+JWT补全


创建自定义的Spring Boot Starter项目 配置中心-Config