(1).官方demo代码
1.Motan支持在Consul、ZooKeeper集群环境下优雅的关闭节点,当需要关闭或重启节点时,可以先将待上线节点从集群中摘除,避免直接关闭影响正常请求。
2.待关闭节点需要调用以下代码,建议通过servlet或业务的管理模块进行该调用。
MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, false)
(2).我们的代码
(3).问题与解决
1.问题
在web项目中没有在contextDestroyed的监听中调用motan的销毁反注册钩子,导致motan服务已经下线,但是zk中依然保留服务的注册信息,客户端不能及时感知到服务的下线,导致下线后依然打过来大量的请求,造成客户端阻塞或者报错。
2.解决方案
(4) .源码解析
1.开关及监听
官方推荐我们优雅关闭是推荐这句代码
代码语言:javascript复制MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, false);
我们来看下Motan向MotanConstants.REGISTRY_HEARTBEAT_SWITCHER这个开关项注册了什么监听:
可见在Registry的抽象类中注册了这个开关的监听,当开关值变化后处理相应的动作,如果关闭,则触发unavailable方法,这个方法会注销所有的服务(在registry中删除所有的节点)。
2.这里我们以zookeeper的实现为例
监听触发后会注销所有的服务。
(5) .参考资料
1. motan source code:
https://github.com/weibocom/motan