热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

16.SpringCloudBus消息总线

SpringCloudBus消息总线概述SpringCloudBus具有分布式自动刷新配置的功能,配合SpringCloudConfig,即可实现配置
Spring Cloud Bus消息总线

概述


Spring Cloud Bus具有分布式自动刷新配置的功能,配合 Spring Cloud Config,即可实现配置的动态刷新

在这里插入图片描述

  • SpringCloudBus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。

  • SpringCloudBus目前支持两种消息代理:RabbitMQ和Kafka


作用

在这里插入图片描述

SpringCloudBus能管理和传播分布式系统的消息,就像一个分布式执行器,可用于广播状态更改,事件推送等,也可以当做微服务的通信通道。

什么是总线

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

基本原理

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

在这里插入图片描述

上图是通过topic进行广播通知

RabbitMQ环境配置


1.Erlang安装

http://erlang.org/download/otp_win64_21.3.exe

安装完成之后,需要配置一下环境变量

系统变量:新建,变量值选你自己的erlang目录
在这里插入图片描述
用户变量:添加Path

%ERLANG_HOME%\bin

2.RabbitMQ安装

https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exe

3.启动管理功能

控制台进入RabbitMQ的sbin目录

以我的为例

在这里插入图片描述

rabbitmq-plugins enable rabbitmq_management

在这里插入图片描述

4.启动

选择start启动即可

在这里插入图片描述

4.测试

http://localhost:15672/

默认的用户名/密码都是guest,成功!

在这里插入图片描述

在这里插入图片描述

Spring Cloud Bus动态刷新全局广播


再创建一个Config客户端


1.创建cloud-config-client-3366模块


2.创建pom

<dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-configartifactId>dependency>

3.创建yml

bootstrap.yml

server:port: 3366spring:application:name: config-clientcloud:# config客户端配置config:# 下面这3个综合起来就是&#xff1a;master分支上config-dev.yml的配置文件被读取# http://config-3344.com:3344/master/config-dev.yml&#xff08;文件名里面的“-”是自动添加的&#xff09;label: master # 分支名称name: config # 配置文件名称profile: dev # 读取后缀名称uri: http://localhost:3344/ # 配置中心地址eureka:client:service-url:defaultZone: http://localhost:7001/eureka# 暴露监控点
management:endpoints:web:exposure:include: "*"

4.创建启动类

在这里插入图片描述

5.创建controller

package com.indi.springcloud.controller;&#64;RestController
&#64;RefreshScope // 使客户端具备刷新的能力
public class ConfigClientController{&#64;Value("${server.port}")private String serverPort;&#64;Value("${config.info}")private String configInfo;&#64;GetMapping("/configInfo")public String getConfigInfo(){return "serverPort&#xff1a;" &#43; serverPort &#43; "\t\n\n configInfo&#xff1a;" &#43; configInfo;}
}

设计思想

Spring Cloud Bus采用的是第二种设计思想

第一种

利用消息总线触发一个客户端/bus/refresh&#xff0c;而刷新所有客户端的配置

在这里插入图片描述

第二种

利用消息总线触发一个服务端ConfigServer的/bus/refresh端点&#xff0c;而刷新所有客户端的配置&#xff08;更加推荐&#xff09;

在这里插入图片描述

为什么不采用第一种呢&#xff1f;

理由如下

  1. 打破了微服务的职责单一性&#xff0c;因为微服务本身是业务模块&#xff0c;它不应该再承担配置刷新职责
  2. 破坏了微服务各节点的对等性
  3. 有一定的局限性&#xff0c;例如&#xff0c;微服务在迁移时&#xff0c;它的网络地址常常发生变化&#xff0c;此时如果想要做到自动刷新&#xff0c;那就会增加更多的修改。

给3344/3355/3366添加消息总线支持


3344/3355/3366的yaml

3344添加全部的&#xff0c;3355/3366只添加rabbitmq相关配置

在这里插入图片描述

# rabbitmq相关配置rabbitmq:host: localhostport: 5672username: guestpassword: guest# 暴露bus刷新配置的端点
management:endpoints:web:exposure:include: &#39;bus-refresh&#39;

3344/3355/3366的pom

<dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-bus-amqpartifactId>dependency>

测试

先启动7001、3344、3355、3366

修改之前&#xff0c;3344/3355/3366&#xff0c;version全部都是3
在这里插入图片描述

在线修改完Github文件之后&#xff0c;发送POST请求刷新总控中心

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

结果3344/3355/3366全部得到了刷新&#xff0c;成功实现了一次广播&#xff0c;处处通知。

在这里插入图片描述

Spring Cloud Bus动态刷新定点通知


定点通知&#xff0c;指定具体某一个实例生效而不是全部

在这里插入图片描述

测试

先启动7001、3344、3355、3366&#xff0c;在线修改完Github文件之后&#xff0c;查询3355/3366字段version的值都是4

在这里插入图片描述
在这里插入图片描述

# 通知3355刷新
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

刷新完之后&#xff0c;只有3355发生了变化&#xff0c;3366还是没变&#xff0c;成功&#xff01;

在这里插入图片描述

在这里插入图片描述

总结

在这里插入图片描述


推荐阅读
  • SpringCloud之Bus(消息总线)
    说明:关于SpringCloud系列的文章中的代码都在码云上面地址:https:gitee.comzh_0209_javaspringcloud-ali ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • 动态壁纸 LiveWallPaper:让您的桌面栩栩如生(第二篇)
    在本文中,我们将继续探讨如何开发动态壁纸 LiveWallPaper,使您的桌面更加生动有趣。作为 2010 年 Google 暑期大学生博客分享大赛 Android 篇的一部分,我们将详细介绍 Ed Burnette 的《Hello, Android》第三版中的相关内容,并分享一些实用的开发技巧和经验。通过本篇文章,您将了解到如何利用 Android SDK 创建引人入胜的动态壁纸,提升用户体验。 ... [详细]
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 启动activemq_「Java」SpringBoot amp; ActiveMQ
    一、消息队列消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构, ... [详细]
  • 基于2.1.0构造函数初始化accumulator,这是一个发送的缓冲队列管理器this.accumulatornewRecordAccumulator(logContext,co ... [详细]
author-avatar
陀飞轮小朱朱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有