目录
是什么?
如何使用?
Docker安装RabbitMQ
SpringCloud Bus动态刷新全局广播
SpringCloud Bus动态刷新定点通知
是什么?
SpringCloud Bus是用来将分布式系统的节点与轻量级系统链接起来的一个框架,它整合了Java的事件处理机制和消息中间件的功能,SpringCloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道
SpringCloud Bus配合SpringCloud Config使用可以实现配置的动态刷新,Bus支持两种消息代理:RabbitMQ和Kafka
如何使用?
Docker安装RabbitMQ
在Linux的docker里拉取RabbitMQ镜像docker pull rabbitmq:3.8.3-management(management是带web的管理界面)
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker pull rabbitmq:3.8.3-management 3.8.3-management: Pulling from library/rabbitmq 23884877105a: Pull complete bc38caa0f5b9: Pull complete 2910811b6c42: Pull complete 36505266dcc6: Pull complete 15c38f93e1dd: Pull complete 3d3f9ad120a1: Pull complete 5b6fe3271410: Pull complete f19a60139bb3: Pull complete 6473f260fa7d: Pull complete c6bfc255d245: Pull complete ab9457e6d377: Pull complete 6b744fa5d23e: Pull complete Digest: sha256:2895b23e08cd7fa0615d39147c1746908b0cb8064e9fbbf7770619651b501814 Status: Downloaded newer image for rabbitmq:3.8.3-management docker.io/library/rabbitmq:3.8.3-management如果报了下面的错误
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker pull ribbitmq:3.8.3-management Error response from daemon: pull access denied for ribbitmq, repository does not exist or may require 'docker login': denied: requested access to the resource is denied注册一个账号,登录即可
运行RibbitMQ,注意:15672是web端访问可视化界面时使用的端口
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-web latest 83e2b1e93d3d 12 days ago 661MB tomcat latest b0e0b0a92cf9 3 weeks ago 680MB rabbitmq 3.8.3-management 867da7fcdf92 18 months ago 181MB redis 5.0.9-alpine3.11 3661c84ee9d0 19 months ago 29.8MB java 8 d23bdf5b1b1b 4 years ago 643MB [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker run -d --name ribbitmq-bus -p 5673:5672 -p 15671:15672 867da7fcdf92 514256b561f87a0589a9d6ef4c914977aa3929ac1c3f758e796b957640e09f5f [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps -a ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 514256b561f8 867da7fcdf92 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp, 0.0.0.0:15671->15672/tcp ribbitmq-bus 352322c01534 docker-web "java -jar /app.jar …" 12 days ago Up 22 hours 0.0.0.0:49160->8080/tcp chen-springboot-docker在浏览器地址栏输入http://10.211.55.17:15671访问RabbitMQ的管理页面,用户名和密码默认guest(如果是远程服务器,需要进安全组开放端口)
SpringCloud Bus动态刷新全局广播
- 具备良好的RibbitMQ环境
- 设计思想:利用消息总线触发一个服务端/ConfigServer/bus/refresh,而刷新所有客户端的配置
- 演示广播效果,增加复杂度,以3355为模板再制作一个3366
- 给cloud-config-center-3344配置中心服务端添加消息总线支持
- 给cloud-config-client-3355客户端添加消息总线支持
- 给cloud-config-client-3366客户端添加消息总线支持
- 测试
- 一次修改,广播通知,处处生效
1.按照3355新建3366
2.给cloud-config-center-3344配置中心(服务端)添加消息总线支持
- pom文件
org.springframework.cloud spring-cloud-starter-bus-amqp
- yml文件(最终版)
server: port: 3344 spring: application: name: cloud-config-center # 注册进Eureka服务器的微服务名 cloud: config: server: git: uri: https://github.com/chenstudyJava/springcloud-config.git # git的仓库地址 search-paths: # 搜索目录 - springcloud-config label: master # 读取的分支 rabbitmq: host: 112.124.16.82 # 本机写localhost,远程服务器的写服务器地址 port: 5673 # 客户端和RabbitMQ进行通信的端口 username: guest # 默认也是guest password: guest # 默认也是guest eureka: client: service-url: defaultZone: http://localhost:7001/eureka # 服务注册到的eureka地址 # RabbitMQ相关配置 management: endpoints: # 暴露bus刷新配置的端点 web: exposure: include: 'bus-refresh'3.给cloud-config-client-3355/3366客户端添加消息总线支持
- pom文件
org.springframework.cloud spring-cloud-starter-bus-amqp
- yml文件
server: port: 3355 spring: application: name: config-client cloud: # config客户端配置 config: # 这三个综合:master分支上的config-dev.yml的配置文件被读取到 # http://config-3344.com:3344/master/config-dev.yml label: master # 分支名称 name: config # 配置文件名称 profile: dev # 读取后缀名称 uri: http://localhost:3344 # 配置中心地址 rabbitmq: host: 112.124.23.82 # 本机写localhost,服务器的写服务器地址 port: 5673 # 客户端和RabbitMQ进行通信的端口 username: guest # 默认也是guest password: guest # 默认也是guest eureka: client: service-url: defaultZone: http://localhost:7001/eureka # 服务注册到的eureka地址 # 暴露监控端点 management: endpoints: web: exposure: include: "*"4.测试启动7001,3344,3355,3366,一次修改,广播通知,处处生效
这里我在启动3366的时候报错了:错误如下
Failed to execute goal org.apache.maven.plugins: maven-install-plugin:2.4:install (default-install) on project cloud-config-client-3366: Failed to install metadata com.IT.springcloud:cloud-config-client-3366:1.0-SNAPSHOT/maven-metadata.xml: Could not parse metadata D:.m2comITspringcloudcloud-config-client-33661.0-SNAPSHOTmaven-metadata-local.xml: only whitespace content allowed before start tag and not u0 (position: START_document seen u0. 无法执行goal org.apache.maven.plugins:maven安装插件:2.4: install(默认安装)在项目cloud-config-client-3366上: 未能安装元数据com.IT.springcloud:cloud-config-client-3366:1.0-SNAPSHOT/maven-metadata.xml: 无法分析元数据D:.m2comITspringcloudcloud-config-client-33661.0-SNAPSHOTmaven-metadata-local.xml: 仅允许在开始标记之前使用空格内容,而不允许u0(位置:开始u已看到文档u0好家伙,我只记得那天电脑突然卡住,然后就重启,各种卡死!!!好吧,还是先把问题解决了,上CSDN搜索了一下,应该是这个maven-metadata-local.xml文件有问题,快刀斩乱麻,删掉!!!(浪费好多时间)然后清理、重新启动项目解决了!嘿嘿!
修改GitHub上的版本号,在终端(cmd命令窗口)输入下面命令发送post请求:
E:>curl -X POST "http://localhost:3344/actuator/bus-refresh" E:>在浏览器地址栏分别输入:localhost:3355/configInfo,localhost:3366/configInfo
serverport:3355 configInfo:master branch,springcloud-config/config-dev.yml version=2 serverport:3366 configInfo:master branch,springcloud-config/config-dev.yml version=2其实吧,收到通知的客户端都同时订阅了一个topic交换机
SpringCloud Bus动态刷新定点通知
- 指定具体某一个实例生效而不是全部实例都生效
- 公式:http://localhost:配置中心的端口号/sctuator/bus-refresh/{destination}
- /bus/refresh请求将不再发送到具体的服务实例上,而是发给config server并通过destination参数来指定需要更新配置的服务或实例
不信来弄个测试:
1.修改Github上的版本号(我改为3)
2.在终端(cmd命令窗口)输入:
E:>curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355" E:>然后重新浏览器地址栏分别输入:localhost:3355/configInfo,localhost:3366/configInfo
# 返回结果 serverport:3355 configInfo:master branch,springcloud-config/config-dev.yml version=3 serverport:3366 configInfo:master branch,springcloud-config/config-dev.yml version=2



