问题描述:

服务集成了websocket,集成spring cloud bus后,调用/bus/refresh端点发生异常,不仅实例无法读取最新的配置信息,实例也再也无法注册到eureka

环境:

jdk:1.8
spring cloud: Daltson.RELEASE

原因分析:

通过跟踪代码发现,是因为@EnableWebSocketMessageBroker会初始化CompositeMessageConverter类,并且这个类会在所有messageconverter的第一个,这个类中包含三个messageconverter,其中还包含MappingJackson2MessageConverter,MappingJackson2MessageConverter就是发生异常的罪魁祸首,MappingJackson2MessageConverter转换的时候会使用类的class,导致sping cloud bus通知实例去配置中心获取配置信息的消息无法被正确的转换成对象,并且抛出异常。

我尝试继承AbstractMessageBrokerConfiguration类,重写CompositeMessageConverter方法,使其不会把MappingJackson2MessageConverter加入到其中(messageconverters中会包含MappingJackson2MessageConverter,所以无需担心这里不加入就无法转换json对现象),虽然这样解决了消息转换类型不匹配的问题,但是又发生了新的问题。服务实例会先去取消注册,然后获取配置信息,重启上下文,然后重新注册。结果使用了@EnableWebSocketMessageBroker的实例又会去取消注册一次。导致调用后这个实例就从注册中心删除了。git上也有人反馈@EnableWebSocketMessageBroker与sping cloud bus冲突问题,但是作者并没有给出解决方案。这边后面还会继续跟踪解决一下,如果有解决会在这里更新解决办法。还是早点改造下把sc版本升到Finchley比较好。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐