标签:自定义 Exchange Spring sms host Cloud 消息中间件 public Stream3.2
在项目中,我们经常会用到消息中间件来达到解耦或者削峰的目的。常用的消息中间件有RabbitMQ、Kafka等。虽然这些消息中间件之间的原理可能类似,但它们的使用方法却是大相径庭的,那如果我们要在项目中换一种消息中间件来实现原有的功能,那么我们需要花费大量的精力去修改原有的代码。
Spring Cloud Stream是一个构建消息驱动的微服务应用框架,它使用Binder和消息中间件建立联系,我们在使用的时候不需要关心我们到底是使用的是RabbitMQ还是Kafka,因此我们可以在消息中间件中随意切换。
1.实践环境
Spring Cloud Stream Rabbit 3.2.1
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<version>3.2.1</version>
</dependency>
Spring Cloud Stream从 3.1 开始支持函数式编程模型,因此我们的配置也是使用函数式编程模型来实现的。
2.生产者
2.1 yml配置文件
spring:
rabbitmq:
host: 192.168.1.2
port: 5672
username: guest
password: guest
virtual-host: /test
cloud:
stream:
bindings:
sms-out-0: # 自定义生产者通道名称
destination: sms-exchange# 自定义Exchange交换机名称,生产者和消费者需要配置同一个Exchange
2.2 生产者实现
@Component
public class SmsProducer{
@Resource
private StreamBridge streamBridge;
public void send(String message) {
// 生产者的通道名称须与yml中配置的属性一致
String SMS_OUTPUT = "sms-out-0";
streamBridge.send(SMS_OUTPUT , message);
}
}
3 .消费者
消费者使用函数式编程模型实现
3.1 yml配置文件
spring:
rabbitmq:
host: 192.168.1.2
port: 5672
username: guest
password: guest
virtual-host: /test
cloud:
stream:
bindings:
sms-in-0: # 自定义消费者通道名称
destination: sms-exchange# 自定义Exchange交换机名称,生产者和消费者需要配置同一个Exchange
3.2 消费者实现
@Component
public class SmsConsumer {
/**
* 方法名为sms,须与通道名称一致,sms-in-0通道名为sms
*/
@Bean
public Consumer<String> sms() {
return System.out::println;
}
}
4.测试
现在我们开始启动项目,会在RabbitMQ中创建一个Exchange以及与其绑定的一个临时队列(该队列会在应用停止运行时消失)
生成的Exchange
生成的临时队列
4.1 单元测试
@SpringBootTest(classes = StreamApplication.class)
public class StreamApplicationTest {
@Resource
private SmsProducer smsProducer;
@Test
public void testFunctionSend() {
smsProducer.send("测试函数式编程发送消息");
}
}
最后,欢迎关注微信公众号一起交流
标签:自定义,Exchange,Spring,sms,host,Cloud,消息中间件,public,Stream3.2 来源: https://blog.csdn.net/weixin_43834401/article/details/122269503
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。