https://github.com/spring-cloud/spring-cloud-stream
org.springframework.cloud:spring-cloud-stream 是由spring integration整合boot
对不同的MQ进行抽象出,绑定器binding和channle,用于MQ的通用实现,方便无缝集成和替换,屏蔽消息中间件对应用的复杂性
不用的MQ搭配不同的,MQ start/binder,目前实现了RabbitMQ和Kafka
spring-cloud-start-stream-rabbit等价于spring-cloud-stream-binder-rabbit
spring-cloud-start-stream-kafka等价于spring-cloud-stream-binder-kafka
核心概念:
rabbitMQ绑定器:用Exchange来实现Stream中的主题,消息通道的输入和输出映射一个具体的Exchange交换器,对于每个消费组,会为对于的exchange交换器绑定一个Queue
kafka绑定器:照搬设计,topic对应主题。
基本运用:
@EnableBinding @EnableBinding(Sink.class) 在类上用于定义一个或者多个@input @ouput ,以来实现对消息通道channel的绑定
Sink、Source、Processor
Sink接口定义了input的相关信息,通过@input注解,以及一个String类型来定义消息通道channle名称,@input定义的(输入通道)方法必须返回SubscribableChannel
Source接口定义了output的相关信息,通过@output注解,以及一个String类型来定义消息通道channle名称,@output定义的(输出通道)方法必须返回MessageChannel
Processor继承了input、output两个接口;也可以仿照此接口自己定义相关的输入或者输出信息
public interface Sink {
String INPUT = "input";
@Input("input")
SubscribableChannel input();
}
public interface Source {
String OUTPUT = "output";
@Output("output")
MessageChannel output();
}
输出消息:单个实例可以通过@Autowired来引入,引入@EnableBinding修饰的输出实例或者MessageChannel实例和多个实例通过@Qualifier来区分
@StreamListener @StreamListener(Sink.INPUT) 定义在方法上,将方法注册为消息中间件上数据流的事件监听器,注解中的属性名对应监听的消息通道名。通过下面的属性,做消息转换。
spring.cloud.stream.bindngs.input.content-type = application/json
@SendTo @SendTo(Processer.OUTPUT) sendTo绑定输出通道,和@StreamListener 结合使用可以把处理完的消息返回到指定的消息通道。
integration原生支持
@ServiceActivator @ServiceActivator(inputChannel=Sink.INPUT),和StreamListener
注解差不多,但是StreamLintener比ServiceActivator 多了一些消息之间默认实现的类型转换功能。使用@ServiceActivator的时候,做消息类型转换可以配合@Transformer注解。
@InboundChannelAdapter:定义对output的绑定,4秒的频率发送时间到输出通道
@Bean
@InboundChannelAdapter(value = MySink.OUTOUT, poller = @Poller(fixedRate = "4000", maxMessagesPerPoll = "1"))
public MessageSource timerMessageSource() {
return () -> new GenericMessage<>(new Date());
}
响应式编程:???
spring-cloud-stream-rxjava
@EnableRxJavaProcessor 里面包含 @EnableBinding(Processer.class),通过响应式编程来继续实现消息的处理和再次发送。通过消息式默写操作会更加灵活,比如接收了五条消息再一次性输出等等。
**通过设置消费组,可以避免在多实例中,消息被重复消费,默认不设置消费组
消息分区:控制消费分布、特定服务处理特定消息(未实践)
消费者配置:
spring.cloud.stream.bindngs.input.consumer.partitioned 开启消费者消息分区
spring.cloud.stream.instanceCount 消费者实例数量
spring.cloud.stream.instanceIndex 实例索引号,从0开始,-1最大
生产者配置:
spring.cloud.stream.bindings.output.producer.partitionKeyExpression 分区整则
spring.cloud.stream.bindings.output.producer.partitionCount 消息分区数量
绑定器SPI:
public interface Binder {
Binding bindConsumer(String name, String group, T inboundBindTarget, C consumerProperties);
Binding bindProducer(String name, T outboundBindTarget, P producerProperties);
}
bindConsumer(): 消息中间件目标名称、消费组、接收消息的本地实例、配置属性
bindProducer(): 消息中间件目标名称、发送消息的本地通道实例、创建通道的配置
可以仿照rabbitMQ或者kafka来编写,其他的MQ绑定器。
绑定器名称定义:META-INF/spring.binders
多绑定器配置:
比如配置rabbitMQ为默认绑定器、kafka为通道channel iput的绑定器配置如下
spring.cloud.stream.defaultBinder = rabbit
spring.cloud.stream.bindings.input.binder = kafka
或者配置两个不同的rabbitMQ绑定器
spring.cloud.stream.bindings.input.binder = rabbit1
spring.cloud.stream.bindings.output.binder = rabbit2
spring.cloud.stream.bindings.rabbit1.type = rabbit
spring.cloud.stream.bindings.rabbit1.environment.spring.rabbitmq.host
spring.cloud.stream.bindings.rabbit1.environment.spring.rabbitmq.port
spring.cloud.stream.bindings.rabbit1.environment.spring.rabbitmq.username
spring.cloud.stream.bindings.rabbit1.environment.spring.rabbitmq.password
spring.cloud.stream.bindings.rabbit2.type = rabbit
spring.cloud.stream.bindings.rabbit2.environment.spring.rabbitmq.host
spring.cloud.stream.bindings.rabbit2.environment.spring.rabbitmq.port
spring.cloud.stream.bindings.rabbit2.environment.spring.rabbitmq.username
spring.cloud.stream.bindings.rabbit2.environment.spring.rabbitmq.password
https://blog.csdn.net/supper10090/article/details/78295682
基本消息配置:
input/output是stream默认的channel,输入输出的channle不能重复
重复报错: Dispatcher has no subscribers
destination 对应kafka的topic或者rabbitMQ的exchange
group对应kafka的消费组或者rabbitMQ的queue
spring.cloud.stream.bindings.input.group 消费组/queue
spring.cloud.stream.bindings.output.group
spring.cloud.stream.binding.input.destination 设置输入topic/exchange
spring.cloud.stream.binding.output.destination 设置输出topic/exchange
消息类型转换配置:
spring.cloud.stream.bindngs.input.content-type
默认实现的类型转换:对象和json、json和tuple、object和byte[]、String和byte[]、对象和toSting.
也可以自定义消息类型转换器、
#rabbit的配置信息
spring.rabbitmq.addresses=amqp://127.0.0.1:5672
spring.rabbitmq.username=user_admin
spring.rabbitmq.password=12345678
#下面这个配置优先级太高,在配置中心分模块(分文件)的场景下后面的binder属性无法被覆盖,如果有存在多个vhost的情况下建议将该属性注释掉
spring.rabbitmq.virtual-host=boss
具体的通用配置、消费者配置、生产者配置
spring.cloud.stream.binding.
spring.cloud.stream.binding.
spring.cloud.stream.binding.
rabbitMQ绑定器的配置(消费者、生产者)
spring.cloud.stream.rabbit.binder.
spring.cloud.stream.rabbit.binder.
spring.cloud.stream.rabbit.binder.
kafka绑定器配置(生产者、消费组)
spring.cloud.stream.kafka.binder.
spring.cloud.stream.kafka.binder.
spring.cloud.stream.kafka.binder.
具体可以参考springCloud本书、使用以自身boot版本实践测试为准