背景:
开发中我们往往需要用到mq中间件进行消息处理,但是市面上的mq中间件实在太多了,导致我们在集成过程中困难重重,尤其在微服务当中,比如我们有一个订单模块、物流模块 他们都用到了mq,订单用的是rabbitmq 物流用的是kafka 导致当我们需要向这两个模块推送mq消息时,需要考虑两种mq的对接方式,非常麻烦。由此当我们学习了springcloud-mq-stream后,这个问题就不算问题了。废话不多说,直接上代码
我们创建两个服务:服务A 生产者、服务B消费者
服务A 和服务B依赖与配置
pom依赖:项目中我用的是rabbitmq
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
<optional>true</optional>
</dependency>
yaml:
spring:
cloud:
stream:
function:
definition: myTopicC #函数 bean
bindings:
myTopicC-in-0:
destination: myTopic
group: my_input_group
myTopicC-out-0:
destination: myTopic
服务B消费消息 这里的
myTopicC对应于配置文件中的function中配置的函数bean
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.Message;
import java.util.function.Consumer;
/**
* @author yangjie
* @date 13/2/2025 下午 3:58
* @description
*/
@Configuration
public class MeaageReceiver {
@Bean
public Consumer<Message<String>> myTopicC() {
return (data) -> {
System.out.println("收到消息:" + data.getPayload());
System.out.println("收到消息 getHeaders :" + data.getHeaders());
};
}
}
服务A发送消息
/**
* @author yangjie
* @date 2024/12/31 17:35
* @description
*/
@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {
@Autowired
private StreamBridge streamBridge;
@PostMapping("/sendStreamMessage")
public Results sendStreamMessage(@RequestBody Map<String,Object> map) {
streamBridge.send("myTopicC-out-0", MessageBuilder.withPayload(JSONUtil.toJsonStr(map)).setHeader("for","这是一个请求头!!").build());
return Results.ok("hello");
}
}
以上代码就写完了,进行测试 调用服务A的接口
服务B收到消息进行消费哦
我们在看看 rabbitmq management
消息消费