Binders
Spring Cloud Stream提供了一个Binder抽象,用于连接到外部中间件的物理目标。本节提供有关Binder SPI,其主要组件和实现特定详细信息背后的主要概念的信息。
生产者和消费者
图9.生产者和消费者甲生产者是将消息发送到信道的任何组分。该通道可以通过该代理的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依赖于Spring Boot的自动配置来配置绑定过程。如果在类路径中找到单个Binder实现,则Spring Cloud Stream将自动使用。例如,一个旨在绑定到RabbitMQ的Spring Cloud Stream项目可以简单地添加以下依赖项:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
对于其他绑定依赖关系的特定maven坐标,请参阅该binder实现的文档。
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选择,或通过在每个通道绑定上配置binder来单独执行。例如,从Kafka读取并写入RabbitMQ的处理器应用程序(分别具有用于读/写的名称为input
和output
的通道)可以指定以下配置:
spring.cloud.stream.bindings.input.binder=kafka spring.cloud.stream.bindings.output.binder=rabbit
连接到多个系统
默认情况下,绑定器共享应用程序的Spring Boot自动配置,以便在类路径中找到每个绑定器的一个实例。如果您的应用程序连接到同一类型的多个代理,则可以指定多个绑定器配置,每个具有不同的环境设置。
注意 | 打开显式绑定器配置将完全禁用默认绑定器配置过程。如果这样做,所有使用的绑定器都必须包含在配置中。打算透明使用Spring Cloud Stream的框架可能会创建可以通过名称引用的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
。