本文来Spring Cloud Stream,做一个知识点盘点和总结,包括:
概念
Stream注解
Spring Integration(Spring Cloud Stream的底层)注解
Spring Messaging(Spring消息编程模型)注解
Spring Cloud Stream API
概念
群
组内只有1个实例消费。如果不设置group,则stream会自动为每个实例创建匿名且独立的group——于是每个实例都会消费。
组内单次只有1个实例消费,并且会轮询负载均衡。通常,在将应用程序绑定到给定目标时,最好始终指定consumer group。
目标绑定器
与外部消息系统通信的组件,为构造 提供了 2 个方法,分别是 和 ,它们分别用于构造生产者和消费者。Binder使Spring Cloud Stream应用程序可以灵活地连接到中间件,目前spring为kafka、rabbitmq提供binder。BindingbindConsumerbindProducer
目标绑定
Binding是连接应用程序跟消息中间件的桥梁,用于消息的消费和生产,由binder创建。
分区 技巧
严格来说这个不是概念,而是一种Stream提高伸缩性、吞吐量的一种方式。不过不想另起标题了,写在这里吧。
一个或多个生产者将数据发送到多个消费者,并确保有共同特征标识的数据由同一个消费者处理。默认是对消息进行hashCode,然后根据分区个数取余,所以对于相同的消息,总会落到同一个消费者上。
注解
输入(流)
示例:
public interface Barista {
@Input("inboundOrders")
SubscribableChannel orders();
}
作用:
用于接收消息
为每个binding生成channel实例
指定channel名称
在spring容器中生成一个名为inboundOrders,类型为订阅Channel的bean
在spring容器中生成一个类,实现Barista接口。
输出(流)
示例:
public interface Source {
@Output
MessageChannel output();
}
作用:
类似Input,只是用来生产消息。
流列表(流)
示例:
@StreamListener(value = Sink.INPUT, condition = "headers['type']=='dog'")
public void handle(String body) {
System.out.println("Received: " + body);
}
@Bean
@InboundChannelAdapter(value =