关于SpringCloud Bus RemoteApplicationEvent 使用注意事项

最近使用SpringCloud Bus 用于服务直接消息通信,遇到一些问题,记录下来给一样碰到问题的你一个解决方案

开发环境 :

  • springboot 2.3.9.RELEASE
  • spring-cloud-alibaba-starters 2.2.5.RELEASE
  • rabbitmq

问题一:消息publishEvent出去,监听服务收不到消息

  • 监听服务的类没有注入到spring容器中,未加RemoteApplicationEventScan注解扫描自定义的Event对象,配置加入以下即可

image


image

  • 消息发送的时候originService传入的服务id和springcloud bus的不一致

在spring-cloud-bus包中的BusAutoConfiguration配置信息可以看到,发送消息时会匹配serviceId,配置一致才发送,而默认情况下bus会自动生成一个serviceId,如果我们发送的时候用的是自己随便定义的id,则无法发送消息。

image

建议在配置文件中配置busId,然后从BusProperties类中获取。这样就保证了二者一致
image
获取配置的bus id
image

  • 消息发送者和接收者的rabbitmq消息序列化配置不一致

默认情况下,rabbitmq有自己的消息序列化规则,由于我在消息发送服务配置过rabbitmq的序列化为json格式,但是接收服务没有使用的默认的格式,导致消息发出去之后,接收服务无法正确反序列化,导致消息消费失败。所以要么就都不配置,要么所有服务都配置
image


问题二:消息发送成功,监听服务也收到消息,但是Event的source字段为空。

这个问题困扰了我很久,明明source字段传了值,但是别的服务就是拿不到,而且发送服务自己创建监听服务,是能拿到的。经过查询离职发现,RemoteApplicationEvent的烦序列化的时候忽略了source,也就是说就算你传值了,也不会处理,可能是怕使用者传的数据大?

image

解决办法,自定义Event的时候可以自定义参数进行传值。

image

结果如下,是可以拿到参数的

image

posted @ 2022-02-17 12:05  房东的Tom  阅读(1368)  评论(0编辑  收藏  举报