在ddd设计中,聚合根之间的调用主要使用事件来实现。在单服务内部,可以使用Spring的事件来实现(很方便地支持事务或非事务异步)。而在微服务架构中,跨微服务的事件是常见的需求,而Spring的事件机制不支持跨微服务事件。
由于实际开发中,跨微服务事件执行过程中可能出现异常,需要对事件进行临时存储(或持久化),选择rabbitmq(标准amqp)作为中间件可以解决这些问题。
思路:
使用ChannelAwareMessageListener来适配ampq,创建自己的eventHandler。
使用后处理器创建eventHandler。
使用后处理器借用Spring的rabbitListenerContainerFactory实现自动rabbitmq接入
默认定义为DirectExchange,队列名为【全类名+方法名】
结构:
RemoteEventListener 注解,模拟Spring的EventListener,作为使用入口
RemoteEventHandler 定义EventHandler
RemoteEventHandlerFactory 为每一个RemoteEventListener生产EventHandler
RemoteEventListenerProcessor 后处理器,遍历bean,找到所有RemoteEventListener 注解的方法,注册成bean
RemoteMessageListenerProcessor 后处理器,借用Spring的rabbitListenerContainerFactory实现自动rabbitmq接入。
使用时,直接使用 RemoteEventListener 代替Spring的EventListener(指定目标exchange),即可实现跨微服务事件异步调用。