Spring Cloud — 消息驱动 Stream

Spring Cloud Stream 是让微服务更容易在应用中实现消息的发布和订阅处理的框架。Stream 支持与多种消息中间件整合,如Kafka、RibbitMQ等。

本文使用的是Kafka消息中间件,依赖文件为:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-kafka</artifactId>
    <version>1.2.1.RELEASE</version>
</dependency>

1 Stream 应用模型

图 Spring Cloud Stream 的应用模式

通道接口与监听接口:用于定于消息的输入和输出通道的接口,通过注解(@Input或@Output)标记方法。该注解的参数为通道名称。而通道名称与消息中间件的主题一对一绑定。

消息通道:对消息队列的一种抽象,用来存放消息发布者发布的消息或消费者所要消费的信息及信息的发送与接收。

消息绑定器:实现应用程序与消息中间件之间交互的隔离。封装了交互细节。

1.1 消息发送和监听步骤

负责发送消息的微服务称为生产者,负责接收消息的微服务称为消费者。

1.1.1 生产者的消息发送

1)添加@EnableBinding注解。例如,@EnableBinding(Source.class)

该注解会触发Spring Cloud Stream进行基本配置,将应用升级为一个Spring Cloud Stream 应用。其可以声明一个或多个(发送或监听)通道接口参数。

2)访问消息通道及发送消息。

发送消息通道用于发送消息(MessageChannel的send方法)。通过上面声明的发送通道接口的方法获取通道。

1.1.2 消费者的消息监听

1)添加@EnableBinding注解。例如,@EnableBinding(Sink.class)

2)@StreamListener 注解方法来实现消息的监听。

@StreamListener(Sink.INPUT)
public void onUserMsgSink(UserMsg userMsg) {
    System.out.println("收到消息:" + userMsg);
}

1.1.3 相关配置

还需要配置Kafka的连接信息,及消息通道对应的主题。

spring.cloud.stream.kafka.binder.brekers=Kafka的Host

spring.cloud.stream.kafka.binder.zkNodes=zookeeper的Host

生产者的配置:

spring.cloud.bindings.[通道名称].destination= 发送通道对应的主题

消费者的配置:

spring.cloud.bindings.[通道名称].destination= 监听通道对应的主题

spring.cloud.bindings.[通道名称].group= 消费者组名

1.2 通道接口 Channel Interfaces

public interface Source {
    String OUTPUT = "output";

    @Output("output")
    MessageChannel output();
}

public interface Sink {
    String INPUT = "input";

    @Input("input")
    SubscribableChannel input();
}

Source 及Sink 为Spring Cloud Stream 框架定义的发送消息通道接口及监听通道接口。@EnableBinding注解的参数就是通道接口的class。@Output来标注获取发送消息通道的方法。其中返回值要是MessageChannel及其子类。@Input来标注获取监听消息通道的方法,返回值要是SubscribableChannel及其子类。

1.2.1 通道接口的注入及使用

@Component
public class UserMsgSender {
    private final Source source;
    public UserMsgSender(Source source) {
        this.source = source;
    }
}

获取通道,调用Source接口的output()方法。也可以直接在Bean中注入消息通道。

@Component
public class UserMsgSender {
    private final MessageChannel channel;
    public UserMsgSender(@Qualifier("output") MessageChannel channel) {
        this.channel = channel;
    }
}

如果在服务中定义了多个消息通道,可以通过@Qualifier(“通道名称”)来明确具体的通道。

1.2.2 自定义消息通道

Source定义的发送通道名称为output,Sink定义的监听通道名称为input。我们可以自定义通道。步骤如下:

1)定义通道接口。

public interface ConsumerStreamChannel {
    @Input("consumerUserMsg")
    SubscribableChannel userMsg();
}

2)@EnableBinding中声明这个接口。

@EnableBinding(ConsumerStreamChannel.class)

3)在配置文件中为该通道配置相应的主题(或消费组名)。

spring.cloud.bindings.consumerUserMsg.destination= 监听通道对应的主题

spring.cloud.bindings.consumerUserMsg.group= 消费者组名

注意,在使用@StreamListener注解来标注监听方法时,该注解的参数为通道名称。例如,@StreamListener("consumerUserMsg")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值