Spring Cloud Stream

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<Date> 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<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);

}

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.<channleName>.

spring.cloud.stream.binding.<channleName>.consumer.

spring.cloud.stream.binding.<channleName>.producer.

rabbitMQ绑定器的配置(消费者、生产者)

spring.cloud.stream.rabbit.binder.

spring.cloud.stream.rabbit.binder.<channleName>.consumer.

spring.cloud.stream.rabbit.binder.<channleName>.producer.

kafka绑定器配置(生产者、消费组)

spring.cloud.stream.kafka.binder.

spring.cloud.stream.kafka.binder.<channleName>.consumer.

spring.cloud.stream.kafka.binder.<channleName>.producer.

具体可以参考springCloud本书、使用以自身boot版本实践测试为准

猜你喜欢

转载自blog.csdn.net/Zzhou1990/article/details/84205798