栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

SpringCloud Bus消息总线

SpringCloud Bus消息总线

目录

是什么?

如何使用?

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/583964.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号