SpringCloud Bus入门及使用
一、Bus简介
1.Bus功能
使用Bus和Config组合可以实现配置动态刷新
2.Bus形式
Bus整合了java事件处理机制和消息中间件功能
支持消息代理RabbitMQ和Kafka
3.总线概念
总线简而言之,就是用轻量级的消息代理构建一个共用的消息主题,让所有微服务实例对其进行订阅,被所有微服务实例所监听和消费,如果发生更改,可以广播给所有已订阅的微服务
二、Bus使用
首先前提是有一个3344的Config服务中心,一个3355的Config客户端和3366的Config客户端
设计总线的思想有两种:
- 将消息传递给其中一个客户端,然后再对其他客户端进行感染
- 将消息传给服务中心,然后对其他客户端进行广播
第二种方案比较好,因为消息服务中心和其他服务衔接好,也不需要其他特有功能.只需要发送给服务中心/bus/refresh端点,其他已订阅的服务端就能收到信息
1.改写服务中心3344
1.改写pom
加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2.改写yml
配置rabbitMQ的配置
#配置RabbitMQ
rabbitmq:
port: 5672
host: 192.168.1.50
username: guest
password: guest
#暴露刷新的监控端点
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
总配置
server:
port: 3344
spring:
application:
name: cloud-config-center #注册进Eureka服务器的微服务名
cloud:
config:
server:
git:
uri: https://github.com/xy19980319/springcloud-config #GitHub上面的git仓库名字
####搜索目录
search-paths:
- springcloud-config
####读取分支
label: master
#配置RabbitMQ
rabbitmq:
port: 5672
host: 192.168.1.50
username: guest
password: guest
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
#暴露刷新的监控端点
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
2.改写客户端3355,3366
1.改写pom
加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2.改写yml
#配置RabbitMQ
rabbitmq:
port: 5672
host: 192.168.1.50
username: guest
password: guest
三、通知配置
1.广播通知
根据上面的配置,只需要运维发送一个post请求就能够广播给所有服务实例
curl -X POST “http://localhost:3344/actuator/bus/refresh”
2.定点通知
curl -X POST “http://localhost:{center}/actuator/bus/refresh/{destination}”
这里的占位符{center}是服务中心的端口号
{destination}是需要定点通知的服务端,服务名:端口号
例如如果只要通知3355,就要发送curl -X POST “http://localhost:3344/actuator/bus/refresh/config-client:3355”
四、总结
1.学习总结
Bus作为消息总线,可通过给Config服务中心(与外部相连)来通知所有Config客户端修改配置,可以广播,可以定点
广播通知方式是往 http://localhost:服务中心端口号/actuator/bus/refresh 发送post请求
定点通知方式是往 http://localhost:服务中心端口号/actuator/bus/refresh/服务名:端口号 发送post请求
2.注意事项
日志中warning:Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method ‘POST’ not supported],出现405,post请求不被允许.
{
"timestamp": “2020-06-26T16:32:05.517+0000”,
"status": 405,
"error": “Method Not Allowed”,
"message": "Request method ‘POST’ not supported"
}
如果出现了这样的情况,访问405,可以尝试这样修改,参考博客修改后还是无效,或者无法定点通知
#暴露刷新的监控端点
management:
endpoints:
web:
exposure:
include: "bus-refresh"
endpoint:
bus-env:
enabled: true
bus-refresh:
enabled: true
最后我是通过还是和原来一样的配置,没什么修改的,但是要先将3344启动完全后,再一个个启动3355,3366就可以了。
#3344服务中心的yml配置
server:
port: 3344
spring:
application:
name: cloud-config-center #注册进Eureka服务器的微服务名
cloud:
config:
server:
git:
uri: https://github.com/xy19980319/springcloud-config #GitHub上面的git仓库名字
####搜索目录
search-paths:
- springcloud-config
####读取分支
label: master
#配置RabbitMQ
rabbitmq:
host: 192.168.1.50
port: 5672
username: guest
password: guest
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
#暴露刷新的监控端点
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
#3355,3366结点
server:
port: 3366
spring:
application:
name: config-client
cloud:
#Config客户端配置
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
uri: http://localhost:3344 #配置中心地址k
#配置RabbitMQ
rabbitmq:
port: 5672
host: 192.168.1.50
username: guest
password: guest
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
对这个地方为什么会报出405,还是无法理解,如果有知道的大佬可否提点一二?