当前位置: 首页 > news >正文

SpingCloudBus整合RabbitMQ

SpringCloudBus介绍

SpringCloudBus:消息总线,可以将分布式系统的节点与轻量级消息代理连接,然后实现广播状态更改(如配置更改)或广播其他管理指令。总线就像一个分布式执行器,用于扩展SpringBoot应用程序,但可以用作应用程序之间的通信通道。

消息代理是一种消息验证、传输、路由的架构模式。它是一个中间产品,核心是一个消息的路由程序,用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。通常一下场景需要使用消息代。

  • 将消息路由到一个或多个目的地
  • 消息转化为其他的表达方式
  • 执行消息的聚集、消息的分解,并将结果发送到它们的目的地,然后重新组合响应返回给信息用户
  • 调用Web服务来检索数据
  • 响应事件或错误
  • 使用发布-订阅模式提供内容或基于主题的消息内容。

RabbitMQ实现消息总线

RibbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件,也称为面向消息的中间件。这里假设你已经了解RabbitMQ,具体的安装就不介绍了,可自行Google。

SpringBoot整合RabbitMQ

新建一个SpringBoot项目,这里命名hello-rabbitmq,然后添加amqp依赖。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

在配置文件application.properties中添加RabbitMQ的相关配置

spring.application.name=rabbitmq-hello

#配置rabbitmq的主机
spring.rabbitmq.host=192.168.18.133
#访问端口
spring.rabbitmq.port=5672
#安装RabbitMQ时配置的用户名
spring.rabbitmq.username=wqh
#安装RabbitMQ时配置的密码
spring.rabbitmq.password=wqh

然后创建消息生产者Sender,这里发送一串字符串到hello的消息对列中

/*
 *消息生产者Sender使用AmqpTemplate接口的实例来实现消息的发送
 */
@Component
public class Sender {
    private final Logger logger = LoggerFactory.getLogger(Sender.class);
    @Autowired
    private AmqpTemplate amqpTemplate;

    public void sender(){
        String context = "wqh say hello " + new Date();
        logger.info("发送消息=========》》》》{}",context);
        this.amqpTemplate.convertAndSend("hello",context);
    }
}

消息接收者Receiver,实现了对hello消息队列的消费

/**
 * 消息消费者Receiver 使用@RabbitListener注解定义该类对hello队列的监听, 并用@RabbitHandler 注解来指定对消息的处理方法
 *
 */
@Component
@RabbitListener(queues = "hello")
public class Receiver {
    private final Logger logger = LoggerFactory.getLogger(Receiver.class);

    @RabbitHandler
    public void receiver(String hello){
        logger.info("接收消息=====》》》》》{}",hello);
    }
}

创建RabbitMQ的配置类

/**
 *  RabbitMQ的配置类,用来配队列、交换器、路由等高级信息
 */
public class RabbitConfig {
    @Bean
    public Queue helloConfig(){
        return new Queue("hello");
    }
}

创建测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitmqApplicationTests {
    @Autowired
    private Sender sender;
    @Test
    public void hello(){
        sender.sender();
    }
}

上面说到一个hello队列,所以这里需要在RabbitMQ中添加一个hello队列,进入RabbitMQ的管理页面。

启动项目,运行测试方法:

SpringCloudBus整合RabbitMQ

前面使用SpringCloudConfig构建了一个配置中心,传送门 。前面的结构中如果远程仓库配置发生改变,我们需要调用每个服务的/refresh接口或者重启服务才能获取到最新的配置信息,这种方法在微服务架构中几乎是完全不可行的。使用SpringCloudBus和RabbitMQ整合可以优雅的实现应用配置的动态刷新。直接改造之前的config-client项目

  • 添加spring-cloud-starter-bus-amqp依赖
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  • 在配置文件中添加RabbitMQ的相关配置,这里需要注意的要忽略权限,不然访问/bus/refresh接口的时候回返回Full authentication is required to access this resource
#忽略权限拦截
management.security.enabled=false

spring.rabbitmq.host=192.168.18.133
spring.rabbitmq.port=5672
spring.rabbitmq.username=wqh
spring.rabbitmq.password=wqh
  • 将配置文件复制一份,修改端口,然后打包。分别启动eureka-server服务发现、config-server配置中心、两个config-client实例。项目结构

  • 启动项目之后访问http://localhost:60000/get_namehttp://localhost:60001/get_name获取到form属性。然后修改仓库中的中属性的值,会发现获取的到值并没有改变
  • 然后发出一个post请求到一个config-client,访问接口/bus/refresh ,发现这时候两个服务中都可以获取打最新的值

/bus/refresh 接口中有一个参数destination,该参数可以指定具体的实例刷新配置,还可指定具体的服务刷新配置。

  • 指定实例,只会触发端口号为60000的

    /bus/refresh?destination=config-client:60000
  • 指定服务,这里会触发config-client服务的所有实例进行刷新

    /bus/refresh?destination=config-client:**

在《SpringCloud微服务实战》中提到了一个系统架构的优化,就是将消息总线加入到配置中心,然后通过destination参数来指定更新配置的服务或实例。


参考:《SpringCloud微服务实战》

示例地址:https://gitee.com/wqh3520/

原文地址: SpingCloudBus整合RabbitMQ

相关文章:

  • 10分钟了解Android项目构建流程
  • 条件变量使用总结
  • JsonPath —— JSON 解析神器
  • Ubuntu 16.04 通过 apt 安装 RabbitMQ
  • 2018.1.26 7周5次课
  • API Playbook 业界首发,教你玩 High 阿里云 API!
  • 设计模式三:装饰者模式
  • 为 Linux 实例安装图形化桌面
  • Centos7-Install-Jenkins
  • C# 在异步中使用HttpWebRequest出现的“正在终止线程”错误的解决方案
  • WMS—启动过程
  • linux文件压缩解压命令
  • iOS无限滑动轮播图可竖着滑动
  • Java递归拷贝文件夹
  • SSH.ASDM:远程管理
  • gcc介绍及安装
  • js正则,这点儿就够用了
  • MySQL数据库运维之数据恢复
  • vue2.0项目引入element-ui
  • vue脚手架vue-cli
  • 给初学者:JavaScript 中数组操作注意点
  • 欢迎参加第二届中国游戏开发者大会
  • 基于遗传算法的优化问题求解
  • 区块链将重新定义世界
  • 通过git安装npm私有模块
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $L^p$ 调和函数恒为零
  • (33)STM32——485实验笔记
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (十)T检验-第一部分
  • (原)本想说脏话,奈何已放下
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ***利用Ms05002溢出找“肉鸡
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .php文件都打不开,打不开php文件怎么办
  • .skip() 和 .only() 的使用
  • ::before和::after 常见的用法
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [autojs]autojs开关按钮的简单使用
  • [Bada开发]初步入口函数介绍
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [C#7] 1.Tuples(元组)
  • [CISCN 2023 初赛]go_session
  • [CSS]CSS 字体属性
  • [IE9] IE9 beta版下载链接
  • [JavaWeb玩耍日记]Maven的安装与使用