实时

您的位置:首页>资讯 >

使用 Spring Cloud Bus 和 Spring Cloud Stream 集成实现基于消息的事件驱动 环球速递

基于消息的事件驱动是一种常见的微服务架构设计模式,它将不同的微服务之间通过消息进行通信,实现松耦合、高可伸缩性和高可靠性。在这种架构下,每个微服务都是独立的,它们可以在消息传递的过程中进行异步操作,这使得整个系统的性能得到了很大的提升。

在 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 监听到并处理了。

关键词:

推荐阅读
基于消息的事件驱动是一种常见的微服务架构设计模式,它将不同的微服务之间通过消息进行通信,实现松耦合、

2023-04-20 17:47:47

2023 04 19周三文 南篱各位好,我是南篱,一个财经人。人一生能做的事情不多,无论做成几件,都是值得满意

2023-04-20 17:48:59

新京报贝壳财经讯(记者张冰)4月19日,基于坦克平台打造的2023款乘用炮于2023上海车展上市,汽油版车型售

2023-04-20 17:06:27

寒武纪涨13 29%

2023-04-20 16:58:24

上海2023年4月20日 美通社 --4月19日,毕得医药(证券代码:688073)披露上市后首份年度报告。经营业绩稳健增

2023-04-20 16:28:41

持有足够长的时间看到比特币(BTC-USD)回到30,000美元大关上方的钻石手HODLers再次实现了他们的心愿。但比

2023-04-20 15:47:34

中国网财经4月19日讯(记者魏国旭)中化岩土近日发布的年报显示,公司2022年实现营业收入21 77亿元,同比下滑

2023-04-20 15:45:27

今天来聊聊关于网易有道词典英文翻译,网易有道字典在线翻译的文章,现在就为大家来简单介绍下网易有道词典

2023-04-20 15:23:43

杰威:想知道哈登面对斯玛特时会怎样那将说明他是否是冠军球员,杰威,斯玛特,恩比德,76人队,美国篮球,莫·威

2023-04-20 14:33:55

本报讯(记者谭鹏文 图)为积极搭建创业青年与政府部门、金融机构交流互动平台,4月19日下午,2023年“乡村

2023-04-20 14:35:57

南京高科:一季度实现合同销售金额73189 56万元-4月18日,南京高科发布2023年第一季度房地产业务主要经营数据。

2023-04-20 14:36:58

4月20日,国家统计局发布2021年《中国妇女发展纲要(2021—2030年)》统计监测报告。报告显示,高等教育女生

2023-04-20 13:47:49

拜登夫妇去年收入近58万美元,公布当天他还在“哭穷”---拜登和妻子吉尔·拜登过去一年赚了57 95万美元,缴

2023-04-20 13:48:20

4月19日,恒生指数夜期(4月)开市报20306点。截至北京时间17:21,恒指夜期(4月)报20322点,升4点或0 02%,低

2023-04-20 13:13:04

图灵看市4 20-黄金探底回升、多头开启新反弹黄金周三黄金结束反弹再次进入下行走势,新低已经出现,多头也

2023-04-20 12:57:40

解答:1、韩非子五符咒,读作杜。2、韩非子的文章《五苦录》(D),指的是当时社会上的五种人:3、(1)学者(指

2023-04-20 12:32:35

盐湖股份(000792)04月20日在投资者关系平台上答复了投资者关心的问题。

2023-04-20 11:48:32

你们好,最近小未来发现有诸多的小伙伴们对于黑暗收割符文有什么用,黑暗收割符文这个问题都颇为感兴趣的,

2023-04-20 11:17:57

想必现在有很多小伙伴对于求一个天龙八部的自动挂机脚本方面的知识都比较想要了解,那么今天小好小编就为大

2023-04-20 11:00:32

首先是拿下去年威尼斯电影节地平线单元“最佳影片”和“最佳男主角”奖的伊朗黑色犯罪片《第三次世界大战》

2023-04-20 11:10:33