1.1、应用模型
一个Spring Cloud Stream应用程序由一个中间件中立的核心组成。该应用程序通过Spring Cloud Stream注入到其中的输入和输出通道与外界进行通信。应用程序通过 inputs 或者 outputs 来与 SpringCloud Stream 中的 binder(绑定器) 对象交互。通过我们配置来 binding(绑定),而SpringCloud Stream 的 binder 对象负责与消息中间件交互。具体如下:

| 应用模型中的各模块 | 模块说明 |
|---|---|
| Middleware | 消息中间件,目前只支持RabbitMQ和Kafka |
| Binder | 应用与消息中间件之间的封装,目前实现了Kafka和RabbitMQ的Binder,通过Binder可以很方便的连接中间件,可以动态的改变消息类型(对应于Kafka的topic,RabbitMQ的exchange),这些都可以通过配置文件来实现 |
| Application | 由Stream封装的消息机制,很少自定义开发 |
| @Input | 注解标识输入通道,通过该输入通道接收的消息进入应用程序,可以自定义开发 |
| @Output | 注解标识输出通道,发布的消息将通过该通道离开应用程序,可以自定义开发 |
| @StreamListener | 监听队列,用于消费者的队列的消息接收 |
| @EnableBinding | 指信道channel和exchange绑定在一起 |
如果将应用模型从消息层面做进一步细化,则可以分为三个模块,如下图所示:

- Source
当服务发布消息前的前置业务完成后会通过Source将消息发布出去。Source是一个Spring注解接口,它可以将代表消息主体的POJO对象发布到Channel中,发布之前会把该消息对象序列化(默认使用JSON)。 - Channel
Channel(消息通道)是消息队列的进一步抽象,它会保存Producer发布的或者Consumer接收的消息。Channel名称一般与目标队列名称相关联。然而,消息队列的名称不会直接在代码中暴露,相反Channel名称会被用在代码中,所以只能在配置文件中配置,为Channel选取正确的消息队列进行读和写,而不是在代码中体现。 - Binder
Binder是应用架构的一部分,用来与特殊的消息平台交互。我们可以在不暴露特殊消息平台的类库和API的情况下实现对消息的发布和消费。通过后面的源码介绍,你将会看到它的强大之处。 - Sink
在应用架构中,当从消息队列接收到一条消息后,需要Sink。Sink能监听进入Channel中的消息并将消息反序列化成一个POJO对象。之后,消息就能给业务逻辑使用了。
1.2、配置详解
以Kafka为例讲解spring-cloud-stream-binder-kafka绑定器的配置文件,具体如下:
1.2.1、Kafka Binder属性
- spring.cloud.stream.kafka.binder.brokers
Kafka绑定器连接到的代理列表,默认值:localhost。如果是Kafka集群可以配置集群中的所有broker主机IP并以“,”分隔,例如:172.16.20.5,172.16.20.6,172.16.20.7。同时也支持端口的设置,例如:172.16.20.5:9094,172.16.20.6:9094,172.16.20.7:9094。 - spring.cloud.stream.kafka.binder.defaultBrokerPort
代理允许指定有或没有端口信息的主机(例如,host1、host2:port2)。这将在代理列表中未配置端口时设置默认端口。默认值:9092。 - spring.cloud.stream.kafka.binder.configuration
传递给绑定器创建的所有客户端的客户端属性(生产者和消费者)的键/值集合。由于这些属性既被生产者使用,也被消费者使用,因此使用应仅限于常见属性 — 例如安全设置。通过此配置提供的未知Kafka生产者或消费者属性将被过滤掉,不允许传播。此处的属性将取代启动时设置的任何属性。默认值:空集合。以下是一些常见的Kafka配置属性及其作用,如下表所示:
| 配置项 | 作用说明 |
|---|---|
| acks | 指定生产者在考虑一个消息已经发送成功前,需要等待多少个副本的确认。 |
| retries | 指定生产者在发送失败时重试的次数。 |
| batch.size | 在发送请求之前,生产者将尝试发送更多消息以批量的方式来减少网络请求。 |
| linger.ms | 指定生产者在发送请求之前等待更多消息加入批次的最多时间。 |
| key.serializer | 指定键的序列化器。 |
| value.serializer | 指定值的序列化器。 |
| group.id | 指定消费者组的ID。 |
| group.idauto.offset.reset | 当消费者的偏移量不存在时,指定如何处理新启动的消费者。 |
yaml配置文件示例如下:

- spring.cloud.stream.kafka.binder.consumerProperties
任意Kafka客户端消费者属性的键/值映射。除了支持已知的Kafka消费者属性外,这里还允许未知的消费者属性。此处的属性将取代在引导和上述配置属性中设置的任何属性。默认值:空集合。
yaml配置文件示例如下:

- spring.cloud.stream.kafka.binder.headers
配置与Kafka绑定器相关的头部信息。这些头部信息可以是Kafka消息的元数据,例如消息的键、消息分区等信息。也可以是用户自定义的一些键值对。通常,这些头部信息用于传递消息处理过程中的一些上下文数据。默认值:空集合。
yaml配置文件示例如下:

- spring.cloud.stream.kafka.binder.healthTimeout
等待获取分区信息的时间(心跳时间),以秒为单位。 如果此计时器过期,则运行状况报告为 down。默认值:10。 - spring.cloud.stream.kafka.binder.requiredAcks
配置Kafka生产者在发送消息时需要等待的确认数。这个属性对应于Kafka客户端的 acks 配置,它决定了生产者在认为一条消息已经成功发送之前需要等待多少个副本的确认。默认值:1。具体参数含义如下:
| 参数值 | 说明 |
|---|---|
| ‘all’ 或 -1 | 生产者在消息被所有同步副本确认后才认为消息发送成功。 |
| ‘acks=1’ 或 1 | 生产者在消息被领导副本确认后即认为消息发送成功。 |
| ‘acks=0’ 或 0 | 生产者在消息从生产者缓冲区发送出去后就认为消息发送成功,不等待任何确认。 |
- spring.cloud.stream.kafka.binder.minPartitionCount
仅当设置了autoCreateTopics或autoAddPartitions时有效。绑定器在生成或使用数据的主题上配置的全局最小分区数。它可以被生产者的partitionCount设置或生产者的instanceCount*并发设置的值(如果两者中的任何一个更大)所取代。默认值:1。 - spring.cloud.stream.kafka.binder.producerProperties
任意Kafka客户端生产者属性的键/值映射。除了支持已知的Kafka生产者属性外,这里还允许使用未知的生产者属性。此处的属性将取代在引导和上述配置属性中设置的任何属性。默认值:空集合。 - spring.cloud.stream.kafka.binder.replicationFactor
如果autoCreateTopics处于活动状态,则自动创建的主题的副本数量。可以在每个绑定上覆盖。默认值:-1。
如果你使用的是2.4之前的Kafka代理版本,那么这个值应该至少设置为1。从3.0.8版本开始,绑定器使用-1作为默认值,这表示将使用代理的default.replication.factor属性来确定副本的数量。请与您的Kafka代理管理员联系,看看是否有需要最小副本数量的策略,如果是这样的话,通常,default.replication.factor将与该值匹配,并且应该使用-1,除非您需要大于最小值的副本数量。
- spring.cloud.stream.kafka.binder.autoCreateTopics
如果设置为true,绑定器将自动创建新主题。如果设置为false,则绑定器依赖于已配置的主题。在后一种情况下,如果主题不存在,绑定器将无法启动。默认值:true。
此设置独立于代理的auto.create.topics.enable设置,不会影响它。如果服务器设置为自动创建主题,则可以使用默认代理设置将其作为元数据检索请求的一部分创建。>
- spring.cloud.stream.kafka.binder.autoAddPartitions
如果设置为true,则绑定器会在需要时创建新的分区。如果设置为false,则绑定器依赖于已配置的主题的分区大小。如果目标主题的分区计数小于预期值,则绑定器无法启动。默认值:false。 - spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix
启用绑定器中的事务。请参阅Kafka文档中的transaction.id和Spring Kafka文档中的Transactions。启用事务时,单个生产者属性将被忽略,所有生产者都使用spring.cloud.stream.kafka.binder.transaction.producer.*属性。默认值:null。 - spring.cloud.stream.kafka.binder.transaction.producer.*
绑定器中为全局生产者配置事务,具体请参阅spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix和kafka生产者属性以及所有绑定器支持的一般生产者属性。默认值:请参阅单个生产者属性。 - spring.cloud.stream.kafka.binder.headerMapperBeanName
用于将spring消息头映射到Kafka头和从Kafka头映射到spring消息头的KafkaHeaderMapper的bean名称。例如,如果您希望在对标头使用JSON反序列化的BinderHeaderMapper bean中自定义受信任的包,请使用此选项。如果使用此属性的绑定器无法使用此自定义BinderHeaderMapper bean,则绑定器将查找名为kafkaBinderHeaderMapper的BinderHeaderMapper类型的标头映射器bean,然后再回退到绑定器创建的默认BinderHeaderMapping。默认值:none。 - spring.cloud.stream.kafka.binder.considerDownWhenAnyPartitionHasNoLeader
当发现主题上的任何分区(无论从中接收数据的消费者是谁)没有前导时,标记将绑定器运行状况设置为关闭。默认值:false。 - spring.cloud.stream.kafka.binder.certificateStoreDirectory
当信任库或密钥库证书位置作为非本地文件系统资源(org.springframework.core.io.resource支持的资源,如CLASSPATH、HTTP等)给出时,绑定器会将资源从路径(可转换为org.springfframework.core.io.resource)复制到文件系统上的某个位置。这适用于代理级证书(ssl.truststore.location和ssl.keystore.location)和用于架构注册表的证书(schema.register.ssl.truststore_location和schema.registerssl.keystore.location)。请记住,信任库和密钥库位置路径必须在spring.cloud.stream.cafka.binder.configuration下提供…. 例如,spring.cloud.stream.kafka.binder.configuration.ssl.truststore.location,spring.loud.stream.kaffka.binder.configuration.schema.register.ssl.tuststore.location等。文件将被复制到指定为此属性值的位置,该位置必须是运行应用程序的进程可写的文件系统上的现有目录。如果未设置此值,并且证书文件是非本地文件系统资源,则它将被复制到system.getProperty(“java.io.tmpdir”)返回的系统临时目录中。如果存在此值,但在文件系统上找不到目录或目录不可写,则也是如此。默认值:null。 - spring.cloud.stream.kafka.binder.metrics.defaultOffsetLagMetricsEnabled
当设置为true时,每当访问度量时,都会计算每个消费者主题的偏移滞后度量。当设置为false时,仅使用定期计算的偏移滞后。默认值:true。 - spring.cloud.stream.kafka.binder.metrics.offsetLagMetricsInterval
计算每个消费者主题的偏移滞后的间隔。每当禁用metrics.defaultOffsetLagMetricsEnabled或其计算时间过长时,都会使用此值。默认值:60秒。 - spring.cloud.stream.kafka.binder.enableObservation
在此绑定器中的所有绑定上启用千分尺观察注册表。默认值:false。
由于配置内容太多导致文章篇幅过长,更多详细的配置解释请关注后续文章。

2126

被折叠的 条评论
为什么被折叠?



