Binders
Spring Cloud Stream提供了一个Binder抽象,用于连接到外部中间件的物理目标。本节提供有关Binder SPI,其主要组件和实现特定详细信息背后的主要概念的信息。
生产者和消费者
甲生产者是将消息发送到信道的任何组分。该通道可以通过该代理的Binder实现绑定到外部消息代理。当调用bindProducer()
方法时,第一个参数是代理中目标的名称,第二个参数是生产者将发送消息的本地通道实例,第三个参数包含属性(如分区键表达式)在为该通道创建的适配器中使用。
甲消费者的是,从一个信道接收的消息的任何组分。与生产者一样,消费者的频道可以绑定到外部消息代理。当调用bindConsumer()
方法时,第一个参数是目标名称,第二个参数提供消费者逻辑组的名称。由给定目的地的消费者绑定表示的每个组接收生产者发送到该目的地的每个消息的副本(即,发布 - 订阅语义)。如果有多个使用相同组名称的消费者实例绑定,那么消息将在这些消费者实例之间进行负载平衡,以便生产者发送的每个消息仅由每个组中的单个消费者实例消耗(即排队语义)。
Binder SPI
Binder SPI由许多接口组成,即开即用的实用程序类和发现策略,可提供连接到外部中间件的可插拔机制。
SPI的关键点是Binder
接口,这是将输入和输出连接到外部中间件的策略。
public interface Binder<T, C extends ConsumerProperties, P extends ProducerProperties> {
Binding<T> bindConsumer(String name, String group, T inboundBindTarget, C consumerProperties);
Binding<T> bindProducer(String name, T outboundBindTarget, P producerProperties);
}
界面参数化,提供多个扩展点:
-
输入和输出绑定目标 - 从版本1.0开始只支持
MessageChannel
,但这是打算在将来用作扩展点; -
扩展的消费者和生产者属性 - 允许特定的Binder实现来添加可以以类型安全的方式支持的补充属性。
典型的绑定实现包括以下内容
-
一个实现
Binder
接口的类; -
一个Spring
@Configuration
类,与中间件连接基础架构一起创建上述类型的bean; -
在类路径中找到的包含一个或多个绑定器定义的
META-INF/spring.binders
文件,例如
kafka:\
org.springframework.cloud.stream.binder.kafka.config.KafkaBinderConfiguration
Binder检测
Spring Cloud Stream依赖于Binder SPI的实现来执行将通道连接到消息代理的任务。每个Binder实现通常连接到一种类型的消息系统。Spring Cloud Stream开箱即用,为Kafka,RabbitMQ和Redis提供绑定。
类路径检测
默认情况下,Spring Cloud Stream依赖于Spring Boot的自动配置来配置绑定过程。如果在类路径中找到单个Binder实现,则Spring Cloud Stream将自动使用。例如,一个旨在仅绑定到RabbitMQ的Spring Cloud Stream项目可以简单地添加以下依赖关系:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
Classpath上有多个Binders
当类路径中存在多个绑定器时,应用程序必须指明每个通道绑定将使用哪个绑定器。每个binder配置包含一个META-INF/spring.binders
,它是一个简单的属性文件:
rabbit:\
org.springframework.cloud.stream.binder.rabbit.config.RabbitServiceAutoConfiguration
对于其他提供的绑定实现(例如Kafka),存在类似的文件,并且预期自定义绑定实现也可以提供它们。键代表binder实现的标识名,而该值是以逗号分隔的配置类列表,每个配置类都包含唯一一个类型为org.springframework.cloud.stream.binder.Binder
的bean定义。
可以通过在每个通道绑定上配置绑定器,使用spring.cloud.stream.defaultBinder
属性(例如,spring.cloud.stream.defaultBinder=rabbit
)或单独执行Binder选择。例如,从Kafka读取并写入RabbitMQ的处理器应用程序可以指定以下配置:
spring.cloud.stream.bindings.input.binder=kafka
spring.cloud.stream.bindings.output.binder=rabbit
连接到多个系统
默认情况下,绑定器共享应用程序的Spring Boot自动配置,以便创建类路径中找到的每个绑定器的一个实例。如果您的应用程序连接到同一类型的多个代理,则可以指定多个绑定器配置,每个具有不同的环境设置。
打开显式绑定器配置将完全禁用默认绑定器配置过程。如果这样做,所有使用的绑定器都必须包含在配置中。打算透明使用Spring Cloud Stream的框架可能会创建可以通过名称引用的绑定器配置,但不会影响默认的绑定器配置。为此,绑定器配置可能将其
defaultCandidate
标志设置为false,例如spring.cloud.stream.binders.<configurationName>.defaultCandidate=false
。这表示将独立于默认binder配置过程存在的配置。
例如,这是连接到两个RabbitMQ代理实例的处理器应用程序的典型配置:
spring:
cloud:
stream:
bindings:
input:
destination: foo
binder: rabbit1
output:
destination: bar
binder: rabbit2
binders:
rabbit1:
type: rabbit
environment:
spring:
rabbitmq:
host: <host1>
rabbit2:
type: rabbit
environment:
spring:
rabbitmq:
host: <host2>
Binder配置属性
创建自定义绑定器配置时,以下属性可用。它们必须以spring.cloud.stream.binders.<configurationName>
为前缀。
类型
粘合剂类型。它通常引用在类路径中找到的绑定器之一,特别是META-INF/spring.binders
文件中的键。
默认情况下,它具有与配置名称相同的值。
inheritEnvironment
配置是否会继承应用程序本身的环境。
默认true
。
环境
一组可用于自定义绑定环境的属性的根。配置此配置后,创建绑定器的上下文不是应用程序上下文的子级。这允许粘合剂组分和应用组分之间的完全分离。
默认empty
。
defaultCandidate
粘合剂配置是否被认为是默认的粘合剂的候选者,或者仅在明确引用时才能使用。这允许添加binder配置,而不会干扰默认处理。
默认true
。
实施策略
这里详细介绍了Kafka和Rabbit MQ的绑定实施策略,将Spring Cloud Stream概念映射到中间件概念上的任务。
Kafka Binder
Kafka Binder实现将目的地映射到Kafka主题。消费群体直接映射到相同的Kafka概念。Spring Cloud Stream不使用高级消费者,而是为简单的消费者实现类似的概念。
RabbitMQ Binder
RabbitMQ Binder实现将目标映射到TopicExchange
。对于每个消费群体,Queue
将被绑定到TopicExchange
。绑定的每个消费者实例将触发为其组的Queue
创建相应的RabbitMQ Consumer
实例。