spring微服务之stream的介绍与使用

        SpringCloud Stream是一个构建消息驱动微服务的框架,应用程序通过inputs或者 outputs来与SpringCloud Stream中的binder进行交互。其实就是为了适配底层消息队列的一个抽象出来的中间件。

        使用 Stream 是为了 解决使用不同的消息队列技术所造成技术结构上的不同所带来的困扰。减少底层消息队列学习的一个成本,方便消息队列技术的迁移。

消息信道接口:
public interface MyTopic{

    String INPUT = "delayed-consumer";

    String OUTPUT = "delayed-producer";

//   消费者
    @Input(INPUT)
    SubscribableChannel input();

//   生产者
    @Output(OUTPUT)
    MessageChannel output();

}

生产者发送

@Autowired
private MyTopic producer;
// 简单广播消息
@PostMapping("send")
public void sendMessage(@RequestParam(value = "body") String body) {
    producer.output().send(MessageBuilder.withPayload(body).build());
}

消费者接受

@EnableBinding(value = {
        MyTopic.class
}
// 自定义消息广播
@StreamListener(MyTopic.INPUT)
public void consumeMyMessage(Object payload) {
    log.info("My message consumed successfully, payload={}", payload);
}

配置文件

spring.application.name=stream-sample
server.port=63003

# RabbitMQ连接字符串
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

# 绑定Channel到broadcast
spring.cloud.stream.bindings.myTopic-consumer.destination=broadcast
spring.cloud.stream.bindings.myTopic-producer.destination=broadcast

# 消息分组示例(消息分组后每个组都会收到发送的消息,每个组发一次消息,相当于广播)
spring.cloud.stream.bindings.group-consumer.destination=group-topic
spring.cloud.stream.bindings.group-producer.destination=group-topic
spring.cloud.stream.bindings.group-consumer.group=Group-A


## 消息分区配置(分区相当于组内划分,一个组里的分区中只有一个分区能够收到消息,且可以指定某个特定分区来接受消息)
## 打开消费者的消费分区功能
spring.cloud.stream.bindings.group-consumer.consumer.partitioned=true
## 两个消息分区
spring.cloud.stream.bindings.group-producer.producer.partition-count=2
# SpEL (Key resolver) 可以定义复杂表达式生成Key
# 我们这里用最简化的配置,只有索引参数为1的节点(消费者),才能消费消息
spring.cloud.stream.bindings.group-producer.producer.partition-key-expression=1
# 当前消费者实例总数
spring.cloud.stream.instanceCount=2
# 最大值instanceCount-1,当前实例的索引号
spring.cloud.stream.instanceIndex=1

# 延迟消息配置(需要在消息发送的时候设置消息header,添加“x-delay”,值为毫秒)
spring.cloud.stream.bindings.delayed-consumer.destination=delayed-topic
spring.cloud.stream.bindings.delayed-producer.destination=delayed-topic
spring.cloud.stream.rabbit.bindings.delayed-producer.producer.delayed-exchange=true

# 异常消息(单机版重试,相当于让本消费者再次尝试消费)
spring.cloud.stream.bindings.error-consumer.destination=error-out-topic
spring.cloud.stream.bindings.error-producer.destination=error-out-topic
# 重试次数(本机重试)
# 次数=1相当于不重试
spring.cloud.stream.bindings.error-consumer.consumer.max-attempts=2

# 异常消息(requeue重试,重新入队,相当于让生产者重新发送,可能是另外的消费者消费)
spring.cloud.stream.bindings.requeue-consumer.destination=requeue-topic
spring.cloud.stream.bindings.requeue-producer.destination=requeue-topic
# 必须把max-attempts设置为1,否则requeue不能生效
spring.cloud.stream.bindings.requeue-consumer.consumer.max-attempts=1
spring.cloud.stream.bindings.requeue-consumer.group=requeue-group
# 仅对当前requeue-consumer,开启requeue
spring.cloud.stream.rabbit.bindings.requeue-consumer.consumer.requeueRejected=true

# 默认全局开启requeue
# spring.rabbitmq.listener.default-requeue-rejected=true

# 死信队列配置(消费失败的消息集中转移到一个队列里,后续在处理,这个队列叫做死信队列)
spring.cloud.stream.bindings.dlq-consumer.destination=dlq-topic
spring.cloud.stream.bindings.dlq-producer.destination=dlq-topic
spring.cloud.stream.bindings.dlq-consumer.consumer.max-attempts=2
spring.cloud.stream.bindings.dlq-consumer.group=dlq-group
# 开启死信队列(默认 topic.dlq)
spring.cloud.stream.rabbit.bindings.dlq-consumer.consumer.auto-bind-dlq=true

# Fallback配置
spring.cloud.stream.bindings.fallback-consumer.destination=fallback-topic
spring.cloud.stream.bindings.fallback-producer.destination=fallback-topic
spring.cloud.stream.bindings.fallback-consumer.consumer.max-attempts=2
spring.cloud.stream.bindings.fallback-consumer.group=fallback-group
# input channel ->    fallback-topic.fallback-group.errors
// 降级流程
@ServiceActivator(inputChannel = "fallback-topic.fallback-group.errors")
public void fallback(Message<?> message) {
    log.info("fallback entered");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Stream 是一个构建消息驱动微服务的框架,它基于 Spring Boot 和 Spring Integration,通过简单声明式模型来实现消息的发送和接收。Spring Cloud Stream 可以与多种消息中间件集成,如 RabbitMQ、Kafka 等。 使用 Spring Cloud Stream 的步骤如下: 1. 添加依赖 在 pom.xml 中添加 Spring Cloud Stream 相关的依赖,如下: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream</artifactId> </dependency> ``` 2. 创建消息处理器 创建一个消息处理器,用于接收和处理消息,例如: ``` @Component public class MessageHandler { @StreamListener(Sink.INPUT) public void handleMessage(String message) { System.out.println("Received message: " + message); } } ``` 这个消息处理器使用 `@StreamListener` 注解来监听 `Sink.INPUT`,表示接收来自输入通道的消息,并打印出来。 3. 配置绑定器 在配置文件中配置绑定器,用于将应用程序与消息中间件连接起来。例如,如果要使用 RabbitMQ,可以这样配置: ``` spring.cloud.stream.bindings.input.destination=myQueue spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 这里配置了输入通道的目的地为 `myQueue`,以及 RabbitMQ 的连接信息。 4. 发送消息 使用 `MessageChannel` 来发送消息,例如: ``` @Autowired private MessageChannel output; public void sendMessage(String message) { output.send(MessageBuilder.withPayload(message).build()); } ``` 这里注入了一个 `output` 的 `MessageChannel`,通过它发送消息,例如: ``` sendMessage("Hello, world!"); ``` 这样就可以将一条消息发送到 `myQueue` 队列中。 以上就是使用 Spring Cloud Stream 的基本步骤。需要注意的是,消息的发送和接收是基于通道(Channel)的,而通道是由绑定器(Binder)来创建和管理的。因此需要在配置文件中配置绑定器相关的信息,才能正常发送和接收消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值