基于消息的事件驱动是一种常见的微服务架构设计模式,它将不同的微服务之间通过消息进行通信,实现松耦合、高可伸缩性和高可靠性。在这种架构下,每个微服务都是独立的,它们可以在消息传递的过程中进行异步操作,这使得整个系统的性能得到了很大的提升。
(资料图片)
在 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 监听到并处理了。
基于消息的事件驱动是一种常见的微服务架构设计模式,它将不同的微...
当地时间22日,伊朗外长阿卜杜拉希扬同巴基斯坦外长比拉瓦尔通电话...
今年2月下旬,一场由“成功学大师”杨涛鸣主导、浙江吸引力文化传播...
山西国民师范旧址革命活动纪念馆入围,主流媒体,山西门户。山西新闻...
近日,湖北省教育厅公布了2023年普通专升本招生简章,武汉纺织大学...
本报讯(记者刘洋通讯员周相杜康靖蕊)4月20日,重庆市高级人民法院...
1、一汽大众是一汽与德国大众盒合资成立的,上汽大众是上汽与德国大...
1、重复性限r:一个数值r,在重复性条件下,两次测试结果之差的绝对...
广州最近这两个月的天气啊 实属不佳,前有半月阴雨,后有骤降...
走过非凡十年,海军航母建设实现了从无到有、从改装到国产的发展跨...
欢迎观看本篇文章,小柴来为大家解答以上问题。千门万户瞳瞳日总把...
主场3球不敌武汉,北京女足仍需在困难中坚持住
谷歌地图最近的更新达到了三倍,以更好地改善全年旅行时的共享位置...
谁缺席了上海车展?不想还是不能?,宝马,特斯拉,比亚迪,概念车,上海...
之前疯传已经润了的冯小刚,回来了。最近,他辟谣说,自己没有移民...
1、太平洋:面积最大,平均深度最深,平均水温最高。2、岛屿最多大...
从扩充军队到巨舰启航,从空间站到星系级别造船厂,既是旧联邦的历...
1、孔繁浩。2、河北省固安县农村信用合作联社客户经理。文章到此就...
1、如下图扩展资料:漏电开关,开关的一种,主要用于防止漏电事故的...
1、原因如下:雕牌肥皂的主要成分是脂肪酸钠和表面活性剂,此外还含...
1、亲,所需资源已上传附件或网盘链接。2、如果是rar或zip格式,右击...
峨眉山上有座玉女峰,玉女峰上有个玉女池。玉女池水清流得象镜子,...
1、没有,他说过他的工作很忙,微博FANS会有很多留言,看了会忙不过...
1、桔子树一年开一次花,开花没有固定的时间,一般在春季的三到四月...
证券代码:300490证券简称:华自科技公告编号:2023-041华自科技股...
巴东:世界地球日地质科普进校园---焦国斌、段冉丽)“在滑坡、崩塌...
共读《稻草人》,学做学习的主人!苏州市吴江区东联村开展“书香润...
本周(4月17日至4月21日),北交所新添2家企业:迪尔化工、旺成科技...
9天8个板,4个月涨幅超6倍,东方通讯炼成了本年首个“妖股”。6月10...
扑打明火6公里中蒙中俄边境草原火已初步得到控制