相关文章推荐
喝醉的草稿纸  ·  Error starting ZK ...·  9 月前    · 
文武双全的跑步鞋  ·  商务部公示东方红获直销牌照 ...·  9 月前    · 
另类的墨镜  ·  《做到饭糊资源》做到饭糊&完整版(全文免费观 ...·  11 月前    · 
烦恼的哑铃  ·  盐泰锡常宜铁路全线首桩正式开钻!·  11 月前    · 
怕考试的苹果  ·  JS数组对象——英文按照首字母进行排序sor ...·  1 年前    · 
Code  ›  SpringCloud系列之服务总线(Bus)_springcloud 服务总线_两米以下皆凡人的博客
https://blog.csdn.net/qq_43509535/article/details/113837098
礼貌的蛋挞
3 年前
  • 1、概述
    • ①、工作流程
    • ②、什么是总线
    • ③、基本原理
  • 2、RabbitMQ环境配置
    • ①、Windows安装ErLang
    • ②、Windows安装RabbitMQ
    • ③、安装安装管理工具RabbitMQ-Plugins
    • ③、Docker安装
      • Ⅰ、拉取镜像
    • Ⅱ、运行容器
      • Ⅲ、访问web管理页面
    • 3、动态刷新全局广播
      • ①、创建新的module
      • ②、测试
      • ③、ConfigServer添加消息总线的支持
        • Ⅰ、POM
        • Ⅱ、YML
      • ④、ConfigClient添加消息总线的支持
        • Ⅰ、POM
        • Ⅱ、YML
      • 4、动态刷新的定点通知
        • ①、一个小公式
        • ②、测试

        在学习完 Config 之后,我们发现了一个问题就是每当配置中心配置发生变化以后,都需要将每个微服务重新启动一遍,这样对于某些大型项目而言是很痛苦的,然后我们就又引入了动态刷新功能,每当配置中心配置变化后,我们的运维小哥就手动给每一个微服务都发送一个 POST 请求用于更新配置,这样便免于重新启动服务,节约时间,但是这样的动态刷新还是不够彻底,我们如何才能彻底解放运维小哥的双手呢?那就是使用 Spring Cloud Bus 配合 Spring Cloud Config 使用实现动态刷新配置

        Spring Cloud Bus 是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了 Java 的事件处理机制和消息中间件的功能,它能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道,目前支持 RabbitMQ 和 Kafka ,本文便是使用 RabbitMQ 。

        ①、工作流程

        第一种方式(消息发送给一个客户端而刷新所有的配置)

        • 配置更新,推送到 Git 仓库
        • Config Server 配置中心同步配置
        • 使用订阅了消息的主机给其中一个服务发送一个 Post bus/refresh 更新请求
        • 该服务向服务配置中心拉取最新配置,并将信息发送给消息总线
        • 这个消息将会通过消息总线广播出去,域内指定或所有服务收到消息就回去服务配置中心拉取最新配置

        第二种方式(消息发送给服务配置中心来刷新所有配置)

        • 配置更新,推送到 Git 仓库
        • Config Server 配置中心同步配置
        • 使用订阅了消息的主机给服务配置中心发送一个 Post bus/refresh 更新请求
        • 服务配置中心给消息总线发送通知请求刷新配置
        • 消息总线向域内指定或所有服务发送更新通知消息
        • 服务从服务配置中心拉取最新配置

        相比之下,第二种应该更合理,图一不合理的原因如下

        • 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。如果这个服务挂了,那是不是就会既影响订单服务,又影响通知服务,数罪并罚死得更惨
        • 破坏了微服务各节点的对等性
        • 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改

        ②、什么是总线

        在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播─些需要让其他连接在该主题上的实例都知道的消息.

        ③、基本原理

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

        2、RabbitMQ环境配置

        ①、Windows安装ErLang

        使用 RabbitMQ 时需要下载安装 ErLang 环境,因为 RabbitMQ 是用 ErLang 语言编写的

        官网下载速度特别快,所以我这就准备了两种方案

        一份云盘 链接 ,提取码: ppqi

        又或者是 RabbitMQ 官网提供的 下载链接

        傻瓜式安装,就不贴图了,然后配置环境变量(这个不会的还是百度吧)

        但是如果你安装完后修改了计算机名称(比如你遇到了我得问题,计算机名为中文,然后改成了英文)即使你启动成功,你还是无法访问 localhost://15672 ,网上又查了好一会,得出结论,简单粗暴重装一遍 RabbitMQ 。

        一切就绪,进入管理页面查看,账号密码都是 guest

        ③、Docker安装

        怎么样, Windows 的环境问题搞得是不是头大,按道理实际开发也不会用 Windows 的 RabbitMQ 啊,所以 Docker 才是针不戳

        Ⅰ、拉取镜像

        #management版本的自带web管理页面
        docker pull rabbitmq:3.8.3-management
        

        Ⅱ、运行容器

        强调需要映射两个端口一个5672,一个15672,因为RabbitMQ会开启3个端口,5672、15672、25672,其中5672是提供消息队列服务所用,15672是开启后台http访问所用,

        docker run -d -p 15672:15672 -p 5672:5672 --name myRabbitMQ rabbitmq:3.8.3-management
        

        Ⅲ、访问web管理页面

        访问之前记得打开安全组(云服务器)

        (拍桌)这TM比Windows好用太多了

        3、动态刷新全局广播

        ①、创建新的module

        基于上一篇文章,再次创建一个与3344相同的3355,步骤省略,区别仅在于配置文件端口号声明为3366

        为了便于区分,两个ConfigClient的Controller修改为:

        * @author PengHuAnZhi * @createTime 2021/2/16 15:30 * @projectName SpringCloudDemo * @className ConfigClientController.java * @description TODO @RestController @Slf4j @RefreshScope public class ConfigClientController { // 因为config仓库以rest形式暴露,所以所有客户端都可以通过config服务端访问到github上对应的文件信息 @Value("${config.info}") private String configInfo; @Value("${server.port}") private String serverPort; @GetMapping("/configInfo") public String getConfigInfo() { return "ServerPort : " + serverPort + "\t"+"configInfo : "+configInfo;

        服务没有问题

        ③、ConfigServer添加消息总线的支持

        这里采用第二种通知方式,直接通知配置中心,更加合理

        Ⅰ、POM

        在3344的POM文件中新增依赖坐标

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

        Ⅱ、YML

        新增RabbitMQ和management节点配置

        server:
          port: 3344
        spring:
          application:
            name: config-center
          cloud:
            config:
              server:
                git:
                  uri: https://github.com/PengHuAnZhi/CloudDemoConfig #Github上的git仓库地址
                  ##搜索目录.这个目录指的是github上的目录
                  search-paths:
                    - CloudDemoConfig
              ##读取分支
              label: main
          #rabbitmq相关设置
          rabbitmq:
            host: 39.105.43.3
            port: 5672
            username: guest
            password: guest
        eureka:
          client:
            service-url:
              defaultZone: http://eureka7001.com:7001/eureka/
        #暴露 bus刷新配置的端点
        management:
          endpoints:
            web:
              exposure:
                include: 'bus-refresh'
        

        ④、ConfigClient添加消息总线的支持

        3355,3366配置相同

        Ⅰ、POM

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

        Ⅱ、YML

        server:
          port: 3355
        spring:
          application:
            name: config-client
          cloud:
            #Config客户端配置
            config:
              label: main #分支名称
              name: config #配置文件名称
              profile: dev #读取后缀名称 上诉3个综合就是 master分支上 config-dev.yml
              uri: http://localhost:3344
          #rabbitmq相关设置
          rabbitmq:
            host: 39.105.43.3
            port: 5672
            username: guest
            password: guest
        eureka:
          client:
            service-url:
              defaultZone: http://eureka7001.com:7001/eureka/
        #暴露监控端点
        management:
          endpoints:
            web:
              exposure:
                include: "*"
        

        如果服务运行期间一直循环报java.net.SocketException: socket closed,那就是你云服务器的安全组没有开,又或者是docker镜像的端口映射不对,特别注意是要配置两个映射端口

        重启服务,访问测试

        git仓库version改为5

        再次查看3344,发现正常更新

        发送Post请求

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

        再次访问3355和3366

        查看RabbitMQ的Topic订阅主题,发现确有一个名叫springCloudBus的Topic!

        4、动态刷新的定点通知

        在配置更新后,我们有时候有这种需求,只希望某一部分服务更新配置,另一部分不更新,那么就需要进行定点通知,放在本文中,也就是只通知3355或者3366,另一个不通知

        ①、一个小公式

        http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}

        请求就会发给config server并通过destination参数类指定需要更新配置的服务或实例

        curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355" #只通知3355,config-client为服务名
        curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3366" #只通知3366
         

        修改version

        1、概述在学习完Config之后,我们发现了一个问题就是每当配置中心配置发生变化以后,都需要将每个微服务重新启动一遍,这样对于某些大型项目而言是很痛苦的,然后我们就又引入了动态刷新功能,每当配置中心配置变化后,我们的运维小哥就手动给每一个微服务都发送一个POST请求用于更新配置,这样便免于重新启动服务,节约时间,但是这样的动态刷新还是不够彻底,我们如何才能彻底解放运维小哥的双手呢?那就是使用Spring Cloud Bus配合Spring Cloud Config使用实现动态刷新配置Spring Spring Cloud Bus 使用轻量级的消息代理来连接微服务架构中的各个服务,可以将其用于广播状态更改(例如配置中心配置更改)或其他管理指令,本文将对其用法进行详细介绍。 我们通常会使用消息代理来构建一个主题,然后把微服务架构中的所有服务都连接到这个主题上去,当我们向该主题发送消息时,所有订阅该主题的服务都会收到消息并进行消费。使用 Spring Cloud Bus 可以方便地构建起这套机制,所以 Spring Cloud Bus 又被称为消息总线。...
        文章目录什么是企业服务总线?路由器转换器端点 我相信你一定有生病去医院的经历,你一般通过什么渠道挂号呢?我们很多人会借助在线挂号 App 或小程序来预约挂号,但你有没有想过,全国有这么多家医院,每个医院内部都可能有自己的信息化系统,在线挂号 App 是怎么帮你准确而高效地找到目标医院和医生的呢? 我们看一下挂号预约的整个业务流程,你就明白了。这里的移动医疗系统就是 App 供应商所开发的系统,而医院信息系统则位于各个医院的内部。 那么,怎么实现这个场景呢?这里的核心需求在于,使用合适的系统集成机制来整合我
        Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架, 它整合了Java的事件处理机制和消息中间件的功能。 Spring Clud Bus目前支持RabbitMQ和Kafka。 Spring Cloud Bus能干吗? Spring Cloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器, Spring Cloud是一个用于开发分布式系统的开源框架,它基于Spring Boot构建,并提供了一些额外的工具和库来简化分布式系统开发。Spring Cloud包括多个子项目,其中包括: - Spring Cloud Config:提供了一个集中化的配置管理系统,使得配置的修改变得更加容易,并且可以动态更新配置,无需重新部署应用程序。 - Spring Cloud Netflix:集成了Netflix公司开发的多个组件,包括Eureka(服务注册和发现)、Hystrix(断路器)、Zuul(API网关)等,可以轻松地实现负载均衡、服务容错、API路由等功能。 - Spring Cloud Bus:用于在分布式系统中传播状态变化(例如配置的修改)的消息总线。 - Spring Cloud Stream:为Spring Boot应用程序提供了构建消息驱动的微服务的支持,可以通过多种消息中间件(如Kafka、RabbitMQ)来实现异步通信。 - Spring Cloud Sleuth:为分布式系统提供了请求跟踪和日志聚合的功能。 使用Spring Cloud,开发人员可以更加方便地构建可伸缩、弹性、可靠的分布式系统。
 
推荐文章
喝醉的草稿纸  ·  Error starting ZK when running the command "gadmin start infra" - GraphStudio - TigerGraph
9 月前
文武双全的跑步鞋  ·  商务部公示东方红获直销牌照 获牌直企达56家--企业-DSC颇具价值的直销资讯平台DSC颇具价值的直销资讯平台
9 月前
另类的墨镜  ·  《做到饭糊资源》做到饭糊&完整版(全文免费观看)_科技范
11 月前
烦恼的哑铃  ·  盐泰锡常宜铁路全线首桩正式开钻!
11 月前
怕考试的苹果  ·  JS数组对象——英文按照首字母进行排序sort()、localeCompare()_js sort字母排序-CSDN博客
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号