基于消息的事件驱动是一种常见的微服务架构设计模式,它将不同的微服务之间通过消息进行通信,实现松耦合、高可伸缩性和高可靠性。在这种架构下,每个微服务都是独立的,它们可以在消息传递的过程中进行异步操作,这使得整个系统的性能得到了很大的提升。
在 Spring Cloud 中,我们可以使用 Spring Cloud Bus 和 Spring Cloud Stream 集成来实现基于消息的事件驱动。Spring Cloud Bus 是一个消息总线,它可以在微服务之间传递消息,可以将所有微服务视为一个整体,向所有微服务广播消息或向指定的微服务发送消息。Spring Cloud Stream 是一个消息驱动的微服务框架,它可以轻松地将消息通道与微服务进行集成。
首先,我们需要在 pom.xml 文件中添加以下依赖:
(资料图片)
org.springframework.cloud spring-cloud-starter-bus-amqp org.springframework.cloud spring-cloud-stream-binder-rabbit
这些依赖将会引入 Spring Cloud Bus 和 Spring Cloud Stream 的相关库,并且使用 RabbitMQ 作为消息代理。如果你想使用其他消息代理,可以根据实际需求进行修改。
在这个例子中,我们将创建一个名为 myChannel 的消息通道,用于在微服务之间传递消息。在创建消息通道之前,我们需要在 application.yml 文件中添加以下配置:
spring: cloud: stream: bindings: myChannel: destination: myChannel
这个配置将创建一个名为 myChannel 的消息通道,并将它绑定到 RabbitMQ 的 myChannel 队列上。现在,我们可以在代码中使用 @Input 和 @Output 注解来定义输入和输出消息通道了。
public interface MyChannel { String INPUT = "myInput"; String OUTPUT = "myOutput"; @Input(INPUT) SubscribableChannel input(); @Output(OUTPUT) MessageChannel output();}
这个接口定义了一个名为 MyChannel 的消息通道,其中包括一个名为 myInput 的输入消息通道和一个名为 myOutput 的输出消息通道。
在这个例子中,我们将创建一个名为 MyController 的控制器类,该类将发布一个名为 MyMessage 的消息到 myOutput 消息通道上。
@RestControllerpublic class MyController { @Autowired private MessageChannel output; @PostMapping("/send") public void sendMessage(@RequestBody MyMessage message) { output.send(MessageBuilder.withPayload(message).build()); }}
这个控制器类注入了名为 output 的 MessageChannel,用于向 myOutput 消息通道发送消息。在 sendMessage 方法中,我们通过 MessageBuilder 创建一个名为 message 的 MyMessage 消息,然后通过 output.send 方法将这个消息发送到 myOutput 消息通道上。
在这个例子中,我们将创建一个名为 MyListener 的监听器类,该类将监听 myInput 消息通道上的消息,并将消息打印到控制台上。
@EnableBinding(MyChannel.class)public class MyListener { @StreamListener(MyChannel.INPUT) public void handleMessage(MyMessage message) { System.out.println("Received message: " + message); }}
这个监听器类使用 @EnableBinding 注解将 MyChannel 消息通道绑定到 Spring Cloud Stream 上。在 handleMessage 方法中,我们使用 @StreamListener 注解监听 myInput 消息通道上的消息,当有消息到来时,Spring Cloud Stream 将自动将消息转换为 MyMessage 类型,并将其传递给 handleMessage 方法进行处理。在这个例子中,我们只是简单地将消息打印到控制台上,你可以根据实际需求进行修改。
现在,我们已经创建了消息通道、发布了消息和处理了消息,我们可以启动应用程序并测试它了。首先,我们需要在终端窗口中启动 RabbitMQ,执行以下命令:
cssCopy codedocker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
这个命令将启动一个名为 rabbitmq 的容器,并将其映射到本地主机的 5672 和 15672 端口上。现在,我们可以启动应用程序并访问 http://localhost:8080/send发送消息了。在控制台中,你应该可以看到类似下面的输出:
Received message: MyMessage{id=1, content="Hello, world!"}
这表明消息已经成功传递到了 myInput 消息通道,并被 MyListener 监听到并处理了。
基于消息的事件驱动是一种常见的微服务架构设计模式,它将不同的微...
“最近的猪肉价格不高,蔬菜价格也便宜了点。”4月17日上午,每天负...
来源:环球时报【环球时报综合报道】英国一私立女子学校的教师称,...
鼠标怎么拆开鼠标最常见的故障就是按键失灵。当鼠标的按键不好或者...
记者从临泉交通运输局了解到,G220张新至滑集段改建工程计划今年年...
4月18日,华昌达(300278)融资买入577 03万元,融资偿还659 53万...
4月19日华夏基金管理有限公司发布《华夏基金管理有限公司关于限制华...
在苏丹武装部队和快速支援部队爆发武装冲突期间,苏丹通讯社记者哈...
新京报讯4月14日,国家知识产权局发布第五二七号公告,依据《特殊标...
4月18日,容知日新(688768)融资买入957 96万元,融资偿还484 36...
大家好,小乐来为大家解答以上的问题。注册监理工程师有哪几个专业,...
允中发自凹非寺量子位|公众号QbitAIChatGPT爆火,为何大模型却依然...
一季度GDP同比增长4 5%:需求回升预期改善,经济运行开局良好;电...
货币供应量方面,2月末,M2同比增速达12 9%,创2016年4月份以来新...
美元在此前连涨两个交易日后于周二隔夜收跌0 35%,隔夜内盘金属集...
4月18日,广发集丰债券A最新单位净值为1 137元,累计净值为1 381...
作为国内为数不多的国际A级车展,两年一度的上海国际汽车展览会(以...
欢迎观看本篇文章,小柴来为大家解答以上问题。天龙八部六博怎么升...
来源:视频号书香文山数字农家书屋公众号二维码 云端飘书香阅读进...
4月18日北向资金减持34 37万股仙坛股份。近5个交易日中,获北向资...
大风+沙尘+降温又来了!飞絮再入高发期——
1、欧布达大学(英语:ÓbudaUniversity,匈牙利语:ÓbudaiEgyetem...
4月18日,外交部发言人汪文斌主持例行记者会。有记者提问,18日,七...
4月18日北向资金减持8 84万股激智科技。近5个交易日中,获北向资金...
山西用系统思维重塑农村电商培育100个乡村e镇---中新网太原4月18日...
不负遇见,不谈亏欠作者|幽兰公主·朗诵|吉祥摄影|菲菲·编辑|绢子...
“2023年一季度民航经济运行持续恢复、逐步向好,实现全年工作的良...
2023年4月18日12时57分,丰台区消防救援支队接警:北京长峰医院住院...
青川县自然资源局党组书记、局长(兼青川县不动产登记局局长)刘福...
机会报从深圳证券交易所网站获悉,天山股份(000877)主板再融资(...