S p r i n g C l o u d + R a b b i t M Q 实现分布式消息总线 \color{#FF1493}{Spring Cloud + RabbitMQ 实现分布式消息总线} SpringCloud+RabbitMQ实现分布式消息总线
仰望天空,妳我亦是行人.✨
个人主页——微风撞见云的博客
《数据结构与算法》专栏的文章图文并茂生动形象简单易学!欢迎大家来踩踩~
《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~
《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~
希望本文能够给读者带来一定的帮助~文章粗浅,敬请批评指正!
Spring Cloud 是一个用于构建分布式系统的开发工具包,而 RabbitMQ 是一种功能强大的消息代理。结合使用 Spring Cloud 和 RabbitMQ,我们可以实现一个强大的分布式消息总线。本文将介绍如何使用 Spring Cloud Bus 和 RabbitMQ 实现以下功能:
在开始之前,确保您已经完成以下准备工作:
配置刷新是一种实现动态配置更新的功能。当配置发生变化时,我们希望能够自动刷新微服务的配置,而不需要重启服务。下面是实现配置刷新的步骤:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>
application.properties
文件中添加以下配置:spring.rabbitmq.host=
spring.rabbitmq.port=
spring.rabbitmq.username=
spring.rabbitmq.password=
@RefreshScope
注解,例如:@RestController
@RefreshScope
public class MyController {
// Controller code here
}
application.properties
文件中添加以下配置:management.endpoints.web.exposure.include=bus-refresh
启动您的微服务应用程序,并进行配置更改。
使用 POST 请求访问 /actuator/bus-refresh
端点,例如:http://localhost:8080/actuator/bus-refresh
。这将触发配置刷新并更新微服务的配置。
事件广播是一种将事件消息广播给所有微服务实例的功能。下面是实现事件广播的步骤:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>
application.properties
文件中添加以下配置:spring.rabbitmq.host=
spring.rabbitmq.port=
spring.rabbitmq.username=
spring.rabbitmq.password=
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);
}
}
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";
}
}
/trigger-event
路径。事件消息将被广播到所有微服务实例,每个实例都能接收到该事件并执行相应的操作。服务监控可以实现对微服务实例的监控和告警。下面是实现服务监控的步骤:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>
application.properties
文件中添加以下配置:spring.rabbitmq.host=
spring.rabbitmq.port=
spring.rabbitmq.username=
spring.rabbitmq.password=
application.properties
文件中添加以下配置:management.endpoints.web.exposure.include=bus-health, bus-env
启动您的微服务应用程序,并访问 /actuator/bus-health
和 /actuator/bus-env
端点,例如:http://localhost:8080/actuator/bus-health
和 http://localhost:8080/actuator/bus-env
。这将提供有关微服务实例的健康状态信息和环境变量信息。
配置监控系统以订阅并处理 RabbitMQ 发送的监控消息,实现实时监控和告警功能。
微服务间通信是通过消息传递实现解耦和异步处理的方式。下面是实现微服务间通信的步骤:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>
application.properties
文件中添加以下配置:spring.rabbitmq.host=
spring.rabbitmq.port=
spring.rabbitmq.username=
spring.rabbitmq.password=
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);
}
}
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);
}
}
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;
}
}
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";
}
}
/send-message
路径,发送消息给其他微服务。其他微服务的 MessageConsumer
将接收到消息并进行处理。通过完成上述步骤,你可以结合 Spring Cloud 和 RabbitMQ 实现配置刷新、事件广播、服务监控以及微服务间通信的功能。这些功能可以提供更强大的分布式系统能力,并帮助实现解耦、异步处理和实时监控的目标。
初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。
积少成多,滴水成河。文章粗浅,希望对大家有帮助!