SpringCloud-Stream实战快速入门,Java面试题及答案整理

image

它定义了一个OUTPUT类型的Binding,名称为output,当不通过@Output指定Binding的名称时,默认会使用方法名作为Binding的名称。

Sink内置接口

Sink的定义如下,它定义了一个INPUT类型的Binding,名称为input,当不通过@Input指定Binding的名称时,默认会使用方法名作为Binding的名称。image

在一个接口中可以同时定义多个Binding,只需要定义多个@Input或@Output标注的方法。Processor接口同时继承了Source和Sink接口,所以当@EnableBinding指定了Processor接口时相当于同时应用了两个Binding。

public interface Processor extends Source, Sink {
}
@EnableBinding({ Processor.class })

生产者

我们来定义一个output类型的Bindingimage

在上面代码中我们指定了@EnableBinding接口为Source接口,即启用了名称为output的OUTPUT类型的Binding。Spring Cloud会自动实现该Binding的实现,也会提供Binding接口的实现,并注册到bean容器中。即可以在程序中自动注入Source类型的bean,也可以注入MessageChannel类型的bean

image

上面定义了一个生产发布服务,直接注入Source类型的bean,然后通过Source的output()获取MessageChannel实例,通过它的send()方法进行消息发送。

另一种使用方式,就是直接获取MessageChannel,如下代码,效果是一样的。

image

那发送的消息究竟会发送到哪里呢?这就需要我们来定义对应的Binding和实际消息容器的生产者的映射了。可以通过spring.cloud.stream.bindings..*的形式定义Binding的一些属性。

具体有什么属性可查看org.springframework.cloud.stream.config.BindingProperties

这里我们通过其destination属性指定该Binding对应的实际的目的地对应于RocketMQ就是一个Topic。

spring.cloud.stream.bindings.output.destination=test-topic

即我们上面发送的消息将发到RocketMQ的名为test-topic的Topic。
RocketMQ是需要指定NameServer的,所以在发送消息前,还需要基于RocketMQ这个Binder配置其NameServer的地址。

spring.cloud.stream.rocketmq.binder.namesrv-addr=192.168.31.153:9876

在启动了RocketMQ的NameServer和Broker之后,就可以利用上面的代码进行消息发送了。测试代码如下。

在测试的时候可以在启动RocketMQ时指定autoCreateTopicEnable=true以开启自动创建Topic的功能,如mqbroker -n localhost:9876 autoCreateTopicEnable=true。

image

继承CommandLineRunner接口,启动就会执行run方法,就是调用ProviderService发送消息。到Rocketmq控制台查看消息image

image

消费者

消费者接收消息和生产者类似,也需要定义相应的Binding,也需要通过@EnableBinding进行指定。Spring Cloud的Sink接口中已经定义好一个名为input的Binding,如果只需要一个接收Binding,可以直接拿来用。

image

作为消费者的Binding也必须指定对应的目的地,还必须指定一个消费者分组group相同group的消费者可以共同消费相同destination的消息,分担压力。

比如一个作为消费者的应用部署了三份它们的group都是一样的,如果来了三条消息,那么可能三台应用都分别消费了其中的一条消息。而如果部署三份的group都不一样,则每台应用都将消费全部的三条消息

spring.cloud.stream.bindings.input.destination=test-topic
spring.cloud.stream.bindings.input.group=test-group

一般生产中group的名字用项目工程的名字

spring.cloud.stream.bindings.input.group=${spring.application.name}

作为消费者的应用也需要定义Binder的相关信息,如spring.cloud.stream.rocketmq.binder.namesrv-addr=127.0.0.1:9876

消费者需要在方法上通过@StreamListener进行标注,表示它将监听消费某个Binding的消息对应的Binding可以通过@StreamListener的value或target属性进行指定

技术学习总结

学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。

最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

一波!

[外链图片转存中…(img-kpoVkSkv-1628501464239)]

[外链图片转存中…(img-7bp4c4xW-1628501464240)]

最后,若需要完整pdf版,可以点赞本文后点击这里免费领取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值