bus 组件
bus是使用轻量级的消息代理,如rabbitMQ , Kafka 连接分布式系统的节点。这样就可以广播传播状态的更改或者其他管理指令。
两个重要的使用场景
配置变更通知
自定义消息广播
一、基于bus的配置中心改造
1.1 创建 config-bus-server
引入依赖
<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>
<!--2020 后的版本默认禁用 bootstrap.yml配置文件,如要使用加上这个依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--bus组件-->
<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>
</dependencies>
配置
application.yml
server:
port: 8701
spring:
application:
name: config-bus-colony-server # 创建多个以保证高可用
rabbitmq:
host: 192.168.0.107
port: 5672
username: guest
password: guest
cloud:
config:
server:
git:
uri: https://gitee.com/zhoust123/config
search-paths: spring.cloud.parent # 如果是在指定的文件夹下在这里指定,也可以模糊匹配ru: sprin*
force-pull: true # 强制拉取资源文件
# username: # git上非公开的项目需要指定用户名密码
# password: # git上非公开的项目需要指定用户名密码
eureka:
instance:
hostname: localhost
client:
register-with-eureka: true # 是否将自己注册到eureka上 不配置默认是true
fetch-registry: true # 是否从eureka服务上拉取拉取 服务信息 不配置默认是true
serviceUrl:
defaultZone: http://localhost:7009/eureka # 注册到eureka服务上。
# 暴露actor 所有端点
management:
security:
enabled: false # 不需要权限认证
endpoints:
web:
exposure:
include: "*" # 所有的接口
endpoint:
health:
show-details: always
bootstrap.yml
encrypt:
key: 20051001 # 加密串
启动项
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigBusServerApp {
public static void main(String[] args) {
SpringApplication.run(ConfigBusServerApp.class, args);
}
}
1.2 启动 rabbitMQ
1.3 创建config-bus-client
依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--2020 后的版本默认禁用 bootstrap.yml配置文件,如要使用加上这个依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--利用监控提供的端点来进行刷新-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--bus组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
bootstrap.yml
server:
port: 8602
spring:
application:
name: config-bus-colony-client
rabbitmq:
host: 192.168.0.107
port: 5672
username: guest
password: guest
cloud:
stream:
default-binder: rabbit # 如果项目中同时引入的有rabbit 也有Kafka,就需要指定默认的 binder
config:
name: config # git 上起的application名字,不填写默认 本项目名
# uri: http://localhost:8600/ # 默认是 localhost:8888 在bootstrap.yml
discovery:
enabled: true
service-id: config-bus-colony-server # 配合eureka使用,替换 uri
profile: dev # git 上的 -profile
label: master # 分支名
myKeyWord: ${keyword} # 测试从git拉取到本地赋值
management:
security:
enabled: false # 不需要权限认证
endpoints:
web:
exposure:
include: "*" # 所有的接口
endpoint:
health:
show-details: always
eureka:
client:
register-with-eureka: true # 是否将自己注册到eureka上 不配置默认是true
fetch-registry: true # 是否从eureka服务上拉取拉取 服务信息 不配置默认是true
serviceUrl:
defaultZone: http://localhost:7009/eureka # 注册到eureka服务上。
启动类
可以创建多个,以验证bus批量修改配置的功能。
@SpringBootApplication
@EnableEurekaClient
public class ConfigBusClientApp {
public static void main(String[] args) {
SpringApplication.run(ConfigBusClientApp.class, args);
}
}
测试:
属性加密:http://localhost:8701/encrypt 放到row中 格式text
属性解密:http://localhost:8701/decrypt 同上
查看bus-server 所有端点 http://localhost:8701/actuator/
查找返回端点 发现 http://localhost:8701/actuator/busrefresh 即为批量刷新端点。http://localhost:8701/actuator/busrefresh/{*destinations} 为指定机器刷
开始测试
批量修改属性:
-
调用bus-client http://localhost:8702/speak 或者 http://localhost:8703/speak 获得speak属性。记录speak 属性为老属性。
-
修改git上 speak 属性 。
-
再次调用 bus-client获得speak属性,发现两台机器属性没变。
-
调用 bus-server 批量刷新属性:http://localhost:8701/actuator/busrefresh
-
再次调用 bus-client获得speak属性,发现两台机器属性已经改变成最新属性。
上述第4步,调用 bus-clien 的/actuator/busrefresh 端点同样可以刷新全部属性。