Springcloud Bus消息总线原理是实现详解

 更新时间:2022年09月14日 11:24:58   作者:扎哇太枣糕  
Spring Cloud Bus 使用轻量级的消息代理来连接微服务架构中的各个服务,可以将其用于广播状态更改(例如配置中心配置更改)或其他管理指令,本文将对其用法进行详细介绍

springcloud Bus

什么是springcloud Bus

  上一章的springcloud Bus是对分布式微服务的远程配置,但是有一个遗留的问题就是,Config客户端对远程配置的刷新需要手动使用post请求来完成,这就使得Config客户端动态刷新变得十分麻烦。于是消息总线springcloud Bus就是来解决这个问题的

什么是消息总线

  在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都链接上来。由于该主题中产生的消息都会被所有实例监听和消费,所以称它为消息总线。

Bus实现自动刷新的原理

  所有的Config客户端都监听MQ中同一个topic(默认是SpringCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其他监听同一Topic的服务就能得到通知,然后去更新自身的配置。

  由于springcloud Bus支持两种消息的代理(RabbitMQ和kafka),于是接下来的demo选择使用RabbitMQ 3.7.14,其他的消息中间件Bus暂不支持

RabbitMQ的下载配置

Erlang

  第一步: 下载安装Erlang,地址:传送门,安装除了自定义安装路径外,一路next即可

  第二步: 配置环境变量,新建一个环境变量命名为ERLANG_HOME,值为Erlang的安装路径

path环境中添加 %ERLANG_HOME%\bin

  第三步: win + R 输入cmd回车,键入命令erl测试配置是否成功

RabbitMQ

  第一步: 这里以RabbitMQ 3.7.14为例,地址:传送门,页面的最下方有下载的地方,安装除了自定义安装路径外,一路next即可

  第二步: 配置环境变量,新建一个环境变量命名为RABBITMQ_SERVER,值为RabbitMQ的安装路径

path环境中添加 %RABBITMQ_SERVER%\sbin

  第三步: 安装管理工具RabbitMQ-Plugins,win + R 输入cmd回车,键入命令

rabbitmq-plugins enable rabbitmq_management

  第四步: 第三部安装的管理工具会安装几个RabbitMQ的管理快捷方式,可以点击win键查看,点击即可执行对应操作

  第五步: 测试是否安装成功,浏览器http://localhost:15672(默认账号:guest,密码:guest),登入RabbitMQ的管理页就表示已经安装成功

Bus动态刷新

  Bus动态刷新有两种设计思想,第一种利用消息总线触发一个客户端的bus/refresh,从而刷新这条总线上的所有客户端配置;第二种利用消息总线触发一个服务端ConfigServer的bus/refresh,从而刷新这个配置中心(服务端)上注册的所有客户端配置。

  以上两种思想并不是都有应用,而是选择了第二种,因为第一种设计思想会使得被选中的服务端节点在配置获取职责之外新增配置刷新的职责,这会打破微服务的职责单一性和各节点之间的对等性。且一旦被选中的节点失效,配置刷新也将会随之失效,这条总线上的服务端依旧无法实时获取到最新的配置。

全局广播通知代码实现

  此时配置相关微服务一共有三个,它们是配置中心服务端3344、客户端3355、客户端3366,全局广播的代码实现需要对三个微服务都进行配置

  配置中心3344: pom文件和配置文件

<!--添加消息总线RabbitMQ支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

spring:
    #rabbitmq相关配置
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest
##rabbitmq相关配置,暴露bus刷新配置的端点 SpringCloud Bus动态刷新全局广播
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'

  客户端3355、3366: pom文件和配置文件

<!--添加消息总线RabbitMQ支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

spring:
    #rabbitmq相关配置
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest

以3366为例,配置文件的缩进如下

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    config:
      uri: http://localhost:3344  #配置中心的地址
      label: master  #分支名称
      name: config  #配置文件名称
      profile: dev  #读取后缀名称   上述三个综合http://localhost:3344/master/config-dev.yml
  #rabbitmq相关配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
#服务注册到eureka地址
eureka:
  client:
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7001/eureka #单机版

# 暴露监控端点 否则 curl -X POST "http://localhost:3355/actuator/refresh" 不可使用
management:
  endpoints:
    web:
      exposure:
        include: "*"

  🚩值得注意的是,之前rabbitmq的web访问端口是15672,但是在代码中连接rabbitmq使用的端口是5672,这里很容易踩坑

  完成前面的配置,使用以下链接访问配置中心服务端3344、客户端3355、客户端3366的配置信息

http://localhost:3344/master/config-dev.yml
http://localhost:3355/configInfo
http://localhost:3366/configInfo

  然后修改gitee上的远程配置,仍然使用上面链接访问,会发现只有配置中心服务端获取的配置是最新的,但是配置客户端的配置还是修改前的,需要使用win+R输入命令刷新,再访问的话配置客户端就是最新的配置了

curl -X POST "http://localhost:3344/actuator/bus-refresh"

定点通知代码实现

  bus除了可以一个命令刷新总线上的所有微服务之外,还可以支持定点刷新,命令如下

定点通知一个

curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

定点通知多个

curl -X POST "http://localhost:3344/actuator/bus-refresh/{config-client:3355,config-client:3366}"

到此这篇关于Springcloud Bus消息总线原理是实现详解的文章就介绍到这了,更多相关Springcloud Bus内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java下界通配符(? super Type)的使用

    Java下界通配符(? super Type)的使用

    在Java中,? super Type是一个下界通配符,本文主要介绍了Java下界通配符(? super Type)的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Java 8中 Stream小知识小技巧方法梳理

    Java 8中 Stream小知识小技巧方法梳理

    这篇文章主要介绍了Java8中Stream小知识小技巧方法梳理,Stream流和迭代器一样,它只能够迭代一次。当它遍历完的时候,我们就称它已经消费完了。如果还想重新执行操作,那么就只能从原来的地方再获取一个流
    2022-09-09
  • 使用 Redis 缓存实现点赞和取消点赞的示例代码

    使用 Redis 缓存实现点赞和取消点赞的示例代码

    这篇文章主要介绍了使用 Redis 缓存实现点赞和取消点赞的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • MyBatis 实现多对多中间表插入数据

    MyBatis 实现多对多中间表插入数据

    这篇文章主要介绍了MyBatis 实现多对多中间表插入数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java中的指令重排详解

    Java中的指令重排详解

    在 Java 中,指令重排是一种性能优化技术,它涉及到编译器和处理器对程序中指令的执行顺序进行调整,以提高执行效率,本文给大家详细介绍了Java中的指令重排,需要的朋友可以参考下
    2023-12-12
  • 解决Map集合使用get方法返回null抛出空指针异常问题

    解决Map集合使用get方法返回null抛出空指针异常问题

    这篇文章主要介绍了解决Map集合使用get方法返回null抛出空指针异常问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Mac下安装配置Maven并在IDEA中配置的详细教程

    Mac下安装配置Maven并在IDEA中配置的详细教程

    这篇文章主要介绍了Mac下安装配置Maven并在IDEA中配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java中HashSet和HashMap的区别_动力节点Java学院整理

    Java中HashSet和HashMap的区别_动力节点Java学院整理

    这篇文章主要介绍了Java中HashSet和HashMap的区别_动力节点Java学院整理,需要的朋友可以参考下
    2017-04-04
  • springboot基于IDEA环境热加载与热部署教程

    springboot基于IDEA环境热加载与热部署教程

    这篇文章主要为大家介绍了springboot在IDEA环境下的热加载与热部署教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 详解Java Cglib动态代理

    详解Java Cglib动态代理

    这篇文章主要介绍了Java Cglib动态代理的相关资料,帮助大家更好的理解和学习Java代理,感兴趣的朋友可以了解下
    2020-08-08

最新评论