当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2023-01-30
目录 springcloud Bus 什么是springcloud Bus 什么是消息总线 Bus实现自动刷新的原理 RabbitMQ的下载配置 Erlang RabbitMQ Bus动态刷新 全局广播通知代码实现 定点通知代码实现 springcloud Bus 什么是sp
目录
  • springcloud Bus
    • 什么是springcloud Bus
      • 什么是消息总线
      • Bus实现自动刷新的原理
  • RabbitMQ的下载配置
    • Erlang
      • RabbitMQ
      • 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: "*"

            

          上一篇:Java 流处理之收集器详解
          下一篇:没有了
          网友评论