【Spring Cloud + RabbitMQ 实现分布式消息总线】—— 每天一点小知识

简介: 【Spring Cloud + RabbitMQ 实现分布式消息总线】—— 每天一点小知识

🐳使用 Spring Cloud + RabbitMQ 实现分布式消息总线

Spring Cloud 是一个用于构建分布式系统的开发工具包,而 RabbitMQ 是一种功能强大的消息代理。结合使用 Spring Cloud 和 RabbitMQ,我们可以实现一个强大的分布式消息总线。本文将介绍如何使用 Spring Cloud Bus 和 RabbitMQ 实现以下功能:

  1. 配置刷新
  2. 事件广播
  3. 服务监控
  4. 微服务间通信

准备工作

 💧在开始之前,确保您已经完成以下准备工作:

  • 安装并配置 RabbitMQ。
  • 创建一个 Spring Cloud 微服务项目。

配置刷新

 💧配置刷新是一种实现动态配置更新的功能。当配置发生变化时,我们希望能够自动刷新微服务的配置,而不需要重启服务。下面是实现配置刷新的步骤:

  1. 在您的 Spring Cloud 微服务项目中,添加以下依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  1. 配置 RabbitMQ 连接信息,在 application.properties 文件中添加以下配置:
spring.rabbitmq.host=<RabbitMQ 主机名>
spring.rabbitmq.port=<RabbitMQ 端口>
spring.rabbitmq.username=<RabbitMQ 用户名>
spring.rabbitmq.password=<RabbitMQ 密码>
  1. 在您的微服务的配置类上添加 @RefreshScope 注解,例如:
@RestController
@RefreshScope
public class MyController {
    // Controller code here
}
  1. 配置 RabbitMQ 发送消息的端点。在 application.properties 文件中添加以下配置:
management.endpoints.web.exposure.include=bus-refresh
  1. 启动您的微服务应用程序,并进行配置更改。
  2. 使用 POST 请求访问 /actuator/bus-refresh 端点,例如:http://localhost:8080/actuator/bus-refresh。这将触发配置刷新并更新微服务的配置。

事件广播

 💧事件广播是一种将事件消息广播给所有微服务实例的功能。下面是实现事件广播的步骤:

  1. 在您的 Spring Cloud 微服务项目中,添加以下依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  1. 配置 RabbitMQ 连接信息,在 application.properties 文件中添加以下配置:
spring.rabbitmq.host=<RabbitMQ 主机名>
spring.rabbitmq.port=<RabbitMQ 端口>
spring.rabbitmq.username=<RabbitMQ 用户名>
spring.rabbitmq.password=<RabbitMQ 密码>
  1. 创建一个事件消息发布者,用于发送事件消息。例如,创建一个名为 EventPublisher 的类:
import org.springframework.cloud.bus.BusProperties;
import org.springframework.cloud.bus.event.RemoteApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
@Component
public class EventPublisher {
    private final ApplicationEventPublisher eventPublisher;
    private final BusProperties busProperties;
    public EventPublisher(ApplicationEventPublisher eventPublisher, BusProperties busProperties) {
        this.eventPublisher = eventPublisher;
        this.busProperties = busProperties;
    }
    public void publishEvent(Object event) {
        String originService = busProperties.getId();
        RemoteApplicationEvent remoteEvent = new RemoteApplicationEvent(event, originService, null);
        eventPublisher.publishEvent(remoteEvent);
    }
}
  1. 在需要触发事件广播的地方,使用 EventPublisher 发布事件消息。例如,在一个 REST Controller 中:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
    private final EventPublisher eventPublisher;
    public MyController(EventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }
    @GetMapping("/trigger-event")
    public String triggerEvent() {
        // 创建事件对象
        MyEvent event = new MyEvent("Hello, world!");
        // 发布事件消息
        eventPublisher.publishEvent(event);
        return "Event triggered";
    }
}
  1. 启动多个微服务实例,并访问其中一个实例的 /trigger-event 路径。事件消息将被广播到所有微服务实例,每个实例都能接收到该事件并执行相应的操作。

服务监控

 💧服务监控可以实现对微服务实例的监控和告警。下面是实现服务监控的步骤:

  1. 在您的 Spring Cloud 微服务项目中,添加以下依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  1. 配置 RabbitMQ 连接信息,在 application.properties 文件中添加以下配置:
spring.rabbitmq.host=<RabbitMQ 主机名>
spring.rabbitmq.port=<RabbitMQ 端口>
spring.rabbitmq.username=<RabbitMQ 用户名>
spring.rabbitmq.password=<RabbitMQ 密码>
  1. 配置 RabbitMQ 发送消息的端点。在 application.properties 文件中添加以下配置:
management.endpoints.web.exposure.include=bus-health, bus-env
  1. 启动您的微服务应用程序,并访问 /actuator/bus-health/actuator/bus-env 端点,例如:http://localhost:8080/actuator/bus-healthhttp://localhost:8080/actuator/bus-env。这将提供有关微服务实例的健康状态信息和环境变量信息。
  2. 配置监控系统以订阅并处理 RabbitMQ 发送的监控消息,实现实时监控和告警功能。

微服务间通信

 💧微服务间通信是通过消息传递实现解耦和异步处理的方式。下面是实现微服务间通信的步骤:

  1. 在您的 Spring Cloud 微服务项目中,添加以下依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  1. 配置 RabbitMQ 连接信息,在 application.properties 文件中添加以下配置:
spring.rabbitmq.host=<RabbitMQ 主机名>
spring.rabbitmq.port=<RabbitMQ 端口>
spring.rabbitmq.username=<RabbitMQ 用户名>
spring.rabbitmq.password=<RabbitMQ 密码>
  1. 创建一个消息消费者,用于处理接收到的消息。例如,创建一个名为 MessageConsumer 的类:
import org.springframework.cloud.bus.event.RemoteApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class MessageConsumer implements ApplicationListener<RemoteApplicationEvent> {
    @Override
    public void onApplicationEvent(RemoteApplicationEvent event) {
        if (event instanceof MyMessageEvent) {
            MyMessageEvent messageEvent = (MyMessageEvent) event;
            // 处理接收到的消息
            handleMessage(messageEvent.getMessage());
        }
    }
    private void handleMessage(String message) {
        // 处理消息的逻辑
        System.out.println("Received message: " + message);
    }
}
  1. 创建一个消息发布者,用于发送消息给其他微服务。例如,创建一个名为 MessagePublisher 的类:
import org.springframework.cloud.bus.BusProperties;
import org.springframework.cloud.bus.event.RemoteApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
@Component
public class MessagePublisher {
    private final ApplicationEventPublisher eventPublisher;
    private final BusProperties busProperties;
    public MessagePublisher(ApplicationEventPublisher eventPublisher, BusProperties busProperties) {
        this.eventPublisher = eventPublisher;
        this.busProperties = busProperties;
    }
    public void publishMessage(String message) {
        String originService = busProperties.getId();
        MyMessageEvent messageEvent = new MyMessageEvent(message, originService);
        eventPublisher.publishEvent(messageEvent);
    }
}
  1. 创建一个自定义的消息事件类,用于封装消息内容。例如,创建一个名为 MyMessageEvent 的类:
import org.springframework.cloud.bus.event.RemoteApplicationEvent;
public class MyMessageEvent extends RemoteApplicationEvent {
    private String message;
    // 构造函数、getter、setter 省略...
    public MyMessageEvent(String message, String originService) {
        super(message, originService);
        this.message = message;
    }
}
  1. 在需要发送消息的地方,使用 MessagePublisher 发布消息。例如,在一个 REST Controller 中:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
    private final MessagePublisher messagePublisher;
    public MyController(MessagePublisher messagePublisher) {
        this.messagePublisher = messagePublisher;
    }
    @PostMapping("/send-message")
    public String sendMessage(@RequestBody String message) {
        // 发送消息给其他微服务
        messagePublisher.publishMessage(message);
        return "Message sent";
    }
}
  1. 启动多个微服务实例,并访问其中一个实例的 /send-message 路径,发送消息给其他微服务。其他微服务的 MessageConsumer 将接收到消息并进行处理。

总结

通过完成上述步骤,你可以结合 Spring Cloud 和 RabbitMQ 实现配置刷新、事件广播、服务监控以及微服务间通信的功能。这些功能可以提供更强大的分布式系统能力,并帮助实现解耦、异步处理和实时监控的目标。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
5月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
4442 92
|
6月前
|
存储 安全 Java
管理 Spring 微服务中的分布式会话
在微服务架构中,管理分布式会话是确保用户体验一致性和系统可扩展性的关键挑战。本文探讨了在 Spring 框架下实现分布式会话管理的多种方法,包括集中式会话存储和客户端会话存储(如 Cookie),并分析了它们的优缺点。同时,文章还涵盖了与分布式会话相关的安全考虑,如数据加密、令牌验证、安全 Cookie 政策以及服务间身份验证。此外,文中强调了分布式会话在提升系统可扩展性、增强可用性、实现数据一致性及优化资源利用方面的显著优势。通过合理选择会话管理策略,结合 Spring 提供的强大工具,开发人员可以在保证系统鲁棒性的同时,提供无缝的用户体验。
148 0
|
7月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1199 3
|
5月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
6月前
|
消息中间件 Java Kafka
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
本文深入解析了 Kafka 和 RabbitMQ 两大主流消息队列在 Spring 微服务中的应用与对比。内容涵盖消息队列的基本原理、Kafka 与 RabbitMQ 的核心概念、各自优势及典型用例,并结合 Spring 生态的集成方式,帮助开发者根据实际需求选择合适的消息中间件,提升系统解耦、可扩展性与可靠性。
464 1
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
|
6月前
|
消息中间件 存储 Java
RabbitMQ 和 Spring Cloud Stream 实现异步通信
本文介绍了在微服务架构中,如何利用 RabbitMQ 作为消息代理,并结合 Spring Cloud Stream 实现高效的异步通信。内容涵盖异步通信的优势、RabbitMQ 的核心概念与特性、Spring Cloud Stream 的功能及其与 RabbitMQ 的集成方式。通过这种组合,开发者可以构建出具备高可用性、可扩展性和弹性的分布式系统,满足现代应用对快速响应和可靠消息传递的需求。
376 2
RabbitMQ 和 Spring Cloud Stream 实现异步通信
|
10月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
334 32
|
10月前
|
人工智能 负载均衡 Java
Spring AI Alibaba 发布企业级 MCP 分布式部署方案
本文介绍了Spring AI Alibaba MCP的开发与应用,旨在解决企业级AI Agent在分布式环境下的部署和动态更新问题。通过集成Nacos,Spring AI Alibaba实现了流量负载均衡及节点变更动态感知等功能。开发者可方便地将企业内部业务系统发布为MCP服务或开发自己的AI Agent。文章详细描述了如何通过代理应用接入存量业务系统,以及全新MCP服务的开发流程,并提供了完整的配置示例和源码链接。未来,Spring AI Alibaba计划结合Nacos3的mcp-registry与mcp-router能力,进一步优化Agent开发体验。
3433 14
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
2533 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
1000 5

热门文章

最新文章