最近使用SpringCloud Bus 用于服务直接消息通信,遇到一些问题,记录下来给一样碰到问题的你一个解决方案
开发环境 :
- springboot 2.3.9.RELEASE
- spring-cloud-alibaba-starters 2.2.5.RELEASE
- rabbitmq
问题一:消息publishEvent出去,监听服务收不到消息
-
监听服务的类没有注入到spring容器中,未加RemoteApplicationEventScan注解扫描自定义的Event对象,配置加入以下即可
-
消息发送的时候originService传入的服务id和springcloud bus的不一致
在spring-cloud-bus包中的BusAutoConfiguration配置信息可以看到,发送消息时会匹配serviceId,配置一致才发送,而默认情况下bus会自动生成一个serviceId,如果我们发送的时候用的是自己随便定义的id,则无法发送消息。
建议在配置文件中配置busId,然后从BusProperties类中获取。这样就保证了二者一致
获取配置的bus id
-
消息发送者和接收者的rabbitmq消息序列化配置不一致
默认情况下,rabbitmq有自己的消息序列化规则,由于我在消息发送服务配置过rabbitmq的序列化为json格式,但是接收服务没有使用的默认的格式,导致消息发出去之后,接收服务无法正确反序列化,导致消息消费失败。所以要么就都不配置,要么所有服务都配置
问题二:消息发送成功,监听服务也收到消息,但是Event的source字段为空。
这个问题困扰了我很久,明明source字段传了值,但是别的服务就是拿不到,而且发送服务自己创建监听服务,是能拿到的。经过查询离职发现,RemoteApplicationEvent的烦序列化的时候忽略了source,也就是说就算你传值了,也不会处理,可能是怕使用者传的数据大?
解决办法,自定义Event的时候可以自定义参数进行传值。
结果如下,是可以拿到参数的