URL
date
slug
status
tags
summary
type

优雅停机之Dubbo

前言

本篇文章主要分析dubbo-2.6.5的停机流程,看看国内的微服务框架天花板是如何优雅停机的。
原本打算一篇文章讲完Dubbo、RocketMQ以及spring-cloud-gateway的优雅停机,奈何Dubbo的优雅停机实现路径较为坎坷,并且多个版本来回勾连。为了能把我研究的过程尽数分享给各位看官,篇幅可能较长。
从源码看 ,dubbo-2.6.5注册了单独的应用级ShutdownHook——DubboShutdownHook。如果应用运行在Spring容器中且注册了SpringShutdownHook,那么在停机过程中两个ShutdownHook会并行执行。但是从我们长期使用的经验来看,停机时并没有明显的异常信息。是真的没问题还是我们运气好?今天我们通过源码加日志来验证一下

DubboShutdownHook

DubboShutdownHook 代码如下,整体结构比较简单
public class DubboShutdownHook extends Thread { private static final Logger logger = LoggerFactory.getLogger(DubboShutdownHook.class); private static final DubboShutdownHook dubboShutdownHook = new DubboShutdownHook("DubboShutdownHook"); public static DubboShutdownHook getDubboShutdownHook() { return dubboShutdownHook; } private final AtomicBoolean destroyed; private DubboShutdownHook(String name) { super(name); this.destroyed = new AtomicBoolean(false); } @Override public void run() { if (logger.isInfoEnabled()) { logger.info("Run shutdown hook now."); } destroyAll(); } /** * Destroy all the resources, including registries and protocols. */ public void destroyAll() { if (!destroyed.compareAndSet(false, true)) { return; } // destroy all the registries AbstractRegistryFactory.destroyAll(); // destroy all the protocols ExtensionLoader<Protocol> loader = ExtensionLoader.getExtensionLoader(Protocol.class); for (String protocolName : loader.getLoadedExtensions()) { try { Protocol protocol = loader.getLoadedExtension(protocolName); if (protocol != null) { protocol.destroy(); } } catch (Throwable t) { logger.warn(t.getMessage(), t); } } } }
我不打算追踪源码来分析流程,阅读代码的枯燥过程交给我就行了。这里我直接给出总结:
  1. 处理registtry(注册中心)相关停机逻辑
    1. 移除注册中心相关的节点(这里是3个consumer节点和1个provider节点)
      1. 摘除自身provider信息
      2. 摘除自身consumer信息(作为consumer启动时会在对应provider节点下的consumers节点里注册)
    2. 停止监听
      1. 作为provider,应用会监听自身提供的provider对应的providers节点
      2. 作为consumer,应用会监听依赖provider对应的providers、configurators、routers节点
    3. 断开和注册中心的连接
  1. 处理protocol(协议)相关停机逻辑(主要是client和server之间的断连)
    1. 作为server,给所有client发送read_only数据包,告知client我们要停机了,并且等待所有client主动和自己断开连接,最后关闭server,不再监听对应服务端口。等待时间有个最大值(默认10s),超过之后就直接关闭server。
    2. 作为client,要主动断开和依赖provider对应server之间的连接
下面我们再通过日志来熟悉和加深一下印象

停机日志分析

下面是一个上下游依赖比较简单的应用的停机日志。为了防止存在偶然性,我们人为的在DubboShutdownHook里增加一个断点,让SpringShutdownHook先走完,再执行DubboShutdownHook,观察是否会有异常。如果你觉得日志过于冗长,也可以跳过直接看总结。

名词解释

这里可能会涉及到4个名词,提前解释一下
  • server:dubbo服务provider所在实例,一般监听20880端口,tcp连接的server端
  • client:dubbo服务consumer所在实例,tcp连接的client端
  • provider:dubbo服务的provider,一个服务可以有多个provider
  • consumer:dubbo服务的consumer,一个服务可以有多个consumer
# 先让 SpringShutdownHook 处理 2024-01-17 17:05:05,617 INFO [SpringContextShutdownHook|146] com.zhu.wireless.service.registration.ZookeeperAutoServiceRegistrationListener:onApplicationEvent:21 stop zookeeperAutoServiceRegistration first 2024-01-17 17:05:05,910 INFO [Curator-Framework-0|88] org.apache.curator.framework.imps.CuratorFrameworkImpl:backgroundOperationsLoop:955 backgroundOperationsLoop exiting 2024-01-17 17:05:06,064 INFO [SpringContextShutdownHook|146] org.apache.zookeeper.ZooKeeper:close:1422 Session: 0x10000003edd39ed closed 2024-01-17 17:05:06,064 INFO [main-EventThread|87] org.apache.zookeeper.ClientCnxn:run:524 EventThread shut down for session: 0x10000003edd39ed 2024-01-17 17:05:06,067 INFO [SpringContextShutdownHook|146] org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor:shutdown:218 Shutting down ExecutorService 'applicationTaskExecutor' 2024-01-17 17:05:06,314 INFO [NettyClientSelector_1|58] RocketmqRemoting:info:95 closeChannel: close the connection to remote address[192.168.101.208:9876] result: true 2024-01-17 17:05:06,326 INFO [NettyClientSelector_1|58] RocketmqRemoting:info:95 closeChannel: close the connection to remote address[192.168.101.208:10911] result: true 2024-01-17 17:05:06,445 INFO [NettyClientSelector_1|57] RocketmqRemoting:info:95 closeChannel: close the connection to remote address[192.168.101.208:9876] result: true 2024-01-17 17:05:06,446 INFO [NettyClientSelector_1|57] RocketmqRemoting:info:95 closeChannel: close the connection to remote address[192.168.101.208:10911] result: true 2024-01-17 17:05:06,467 INFO [SpringContextShutdownHook|146] com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor:destroy:286 class com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor was destroying! # 到这里 SpringShutdownHook 的停机逻辑已经处理完毕了,下面我们放开断点执行 DubboShutdownHook # DubboShutdownHook 流程开始 2024-01-17 17:05:10,550 INFO [DubboShutdownHook|37] com.alibaba.dubbo.config.DubboShutdownHook:run:56 [DUBBO] Run shutdown hook now., dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 1 先处理注册中心相关停机逻辑 2024-01-17 17:05:10,551 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.support.AbstractRegistryFactory:destroyAll:64 [DUBBO] Close all registries [zookeeper://192.168.101.208:2181/com.alibaba.dubbo.registry.RegistryService?application=file-service&dubbo=2.0.2&interface=com.alibaba.dubbo.registry.RegistryService&logger=slf4j&pid=42935&qos.enable=true&timestamp=1705482278556], dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 1.1 移除注册中心相关的节点(这里是3个consumers节点和1个providers节点) 2024-01-17 17:05:10,555 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:destroy:451 [DUBBO] Destroy registry:zookeeper://192.168.101.208:2181/com.alibaba.dubbo.registry.RegistryService?application=file-service&dubbo=2.0.2&interface=com.alibaba.dubbo.registry.RegistryService&logger=slf4j&pid=42935&qos.enable=true&timestamp=1705482278556, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,557 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:unregister:284 [DUBBO] Unregister: consumer://10.0.116.149/com.zhu.user.provider.AuthenticationProvider?application=file-service&category=consumers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.AuthenticationProvider&logger=slf4j&methods=resetPassword,loginWithXhZlbWx,loginWithDingInternal,loginWithXiaoChong,loginWithZjSx,loginWithWx,loginWithSt,loginWithHyuf,loginWithZLBV2,loginWithWxV2,loginWithJinanTianjian,loginWithBaoTou,loginWithPassword,loginWithDDQrCode,logout,loginWithUniqUserNameAndPassword,loginWithCaptcha,loginWithDD,loginWithZLB,loginWithYgzx,verify,loginWithZjYh4PubUser,loginWithGFT,obtainLoginCaptcha,loginWithHuBei,unbindOpenUser,loginWithYh,loginWithZjYh4Cockpit,loginWithQingTian,loginWithFastToken,setWxInfo,loginWithJn,bindWxOa,loginMobileAndPassword,loginWithHZBJ,loginWithJyYj,loginWithCswc,loginWithZLBWX,loginWithXjYh4Admin,loginWithXhZlb,loginWithZlbV2,obtainModifyPwdCaptcha,loginWithMerchantSocial,refreshToken&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=2000&timestamp=1705482278390&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,607 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:destroy:460 [DUBBO] Destroy unregister url consumer://10.0.116.149/com.zhu.user.provider.AuthenticationProvider?application=file-service&category=consumers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.AuthenticationProvider&logger=slf4j&methods=resetPassword,loginWithXhZlbWx,loginWithDingInternal,loginWithXiaoChong,loginWithZjSx,loginWithWx,loginWithSt,loginWithHyuf,loginWithZLBV2,loginWithWxV2,loginWithJinanTianjian,loginWithBaoTou,loginWithPassword,loginWithDDQrCode,logout,loginWithUniqUserNameAndPassword,loginWithCaptcha,loginWithDD,loginWithZLB,loginWithYgzx,verify,loginWithZjYh4PubUser,loginWithGFT,obtainLoginCaptcha,loginWithHuBei,unbindOpenUser,loginWithYh,loginWithZjYh4Cockpit,loginWithQingTian,loginWithFastToken,setWxInfo,loginWithJn,bindWxOa,loginMobileAndPassword,loginWithHZBJ,loginWithJyYj,loginWithCswc,loginWithZLBWX,loginWithXjYh4Admin,loginWithXhZlb,loginWithZlbV2,obtainModifyPwdCaptcha,loginWithMerchantSocial,refreshToken&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=2000&timestamp=1705482278390&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,608 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:unregister:284 [DUBBO] Unregister: consumer://10.0.116.149/com.zhu.user.provider.UserProvider?application=file-service&category=consumers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.UserProvider&logger=slf4j&methods=addSimpleUser,resetPassword,findByTraceId,batchFindOpenInfos,resetUserPassword,modifyPassword,addUser,batchModifyUserRolesV2,addMerchantUser,modifyUserMobile,searchUserLockList,findOpenInfoByUserId,modifyUserAndModifyMobile,addUserWithoutMobile,modifyUser,findById,findLastLoginRecord,batchFindLastLoginRecord,batchFindLastLoginRecordByUserIds,findByMobile,modifyUserRolesV2,batchFindByMobiles,batchFindOpenInfosByExternalIds,getForgetPasswordToken,addTenantUser,findByIds,batchFindByUniqUserNames,obtainModifyMobileCaptcha,unlockUser,addUsers,findByUniqUserName,addSimpleUsers,addUsersWithoutMobile,modifyUserRoles,addMerchantUserV2,batchFindOpenInfosByUserIds,addEmployee,checkNewMobileClient&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279734&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,630 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:destroy:460 [DUBBO] Destroy unregister url consumer://10.0.116.149/com.zhu.user.provider.UserProvider?application=file-service&category=consumers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.UserProvider&logger=slf4j&methods=addSimpleUser,resetPassword,findByTraceId,batchFindOpenInfos,resetUserPassword,modifyPassword,addUser,batchModifyUserRolesV2,addMerchantUser,modifyUserMobile,searchUserLockList,findOpenInfoByUserId,modifyUserAndModifyMobile,addUserWithoutMobile,modifyUser,findById,findLastLoginRecord,batchFindLastLoginRecord,batchFindLastLoginRecordByUserIds,findByMobile,modifyUserRolesV2,batchFindByMobiles,batchFindOpenInfosByExternalIds,getForgetPasswordToken,addTenantUser,findByIds,batchFindByUniqUserNames,obtainModifyMobileCaptcha,unlockUser,addUsers,findByUniqUserName,addSimpleUsers,addUsersWithoutMobile,modifyUserRoles,addMerchantUserV2,batchFindOpenInfosByUserIds,addEmployee,checkNewMobileClient&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279734&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,630 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:unregister:284 [DUBBO] Unregister: dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&pid=42935&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,650 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:destroy:460 [DUBBO] Destroy unregister url dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&pid=42935&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,657 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:unregister:284 [DUBBO] Unregister: consumer://10.0.116.149/com.zhu.user.provider.AuthorizationProvider?application=file-service&category=consumers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.AuthorizationProvider&logger=slf4j&methods=getDesensitizationRules,checkUriIgnore,bindDynamicPermission,checkPermissions,findAllEmployeeUsersByRoleCode,verifyUser,findRolesByUserIds,findRoles,findRolesByUserIdsForEmployee,findRolesByUserId,findUsersByRoleIdList,checkRoles,findUsersByRoleId,findAllEmployeeUsersByRoleIds,filterOwnPermissions,findRolesByIds,checkUriIgnoreV2,findUsers&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279418&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 上面移除 providers 节点后,consumer 监听到对应变更会主动和 provider 断开连接 2024-01-17 17:05:10,669 INFO [DubboServerHandler-10.0.116.149:20880-21|176] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.102:42086,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,669 INFO [DubboServerHandler-10.0.116.149:20880-25|180] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.29:57648,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,669 INFO [DubboServerHandler-10.0.116.149:20880-28|183] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.18:40974,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,669 INFO [DubboServerHandler-10.0.116.149:20880-31|186] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.65:33540,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,669 INFO [DubboServerHandler-10.0.116.149:20880-24|179] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.15:54016,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,670 INFO [DubboServerHandler-10.0.116.149:20880-27|182] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.10:52894,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,670 INFO [DubboServerHandler-10.0.116.149:20880-23|178] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.81:60240,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,669 INFO [DubboServerHandler-10.0.116.149:20880-30|185] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.64:56958,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,669 INFO [DubboServerHandler-10.0.116.149:20880-22|177] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.99.251:38474,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,670 INFO [DubboServerHandler-10.0.116.149:20880-20|175] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.146:40068,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,671 INFO [DubboServerHandler-10.0.116.149:20880-37|192] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.54:59952,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,671 INFO [DubboServerHandler-10.0.116.149:20880-29|184] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.30:50360,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,671 INFO [DubboServerHandler-10.0.116.149:20880-26|181] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.63:52120,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,671 INFO [DubboServerHandler-10.0.116.149:20880-36|191] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.95:53148,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,671 INFO [DubboServerHandler-10.0.116.149:20880-33|188] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.36:57220,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,671 INFO [DubboServerHandler-10.0.116.149:20880-38|193] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.37:57520,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,671 INFO [DubboServerHandler-10.0.116.149:20880-35|190] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.121:43320,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,671 INFO [DubboServerHandler-10.0.116.149:20880-34|189] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.139:51688,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,671 INFO [DubboServerHandler-10.0.116.149:20880-32|187] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.194:44438,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 所有的client端都成功断开连接,说明此时server关闭已经没有任何副作用了 2024-01-17 17:05:10,680 WARN [New I/O server worker #1-2|110] com.alibaba.dubbo.remoting.transport.AbstractServer:disconnected:205 [DUBBO] All clients has discontected from /10.0.116.149:20880. You can graceful shutdown now., dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,684 INFO [DubboServerHandler-10.0.116.149:20880-39|195] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.80:59424,url:dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&channel.readonly.sent=true&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,688 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:destroy:460 [DUBBO] Destroy unregister url consumer://10.0.116.149/com.zhu.user.provider.AuthorizationProvider?application=file-service&category=consumers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.AuthorizationProvider&logger=slf4j&methods=getDesensitizationRules,checkUriIgnore,bindDynamicPermission,checkPermissions,findAllEmployeeUsersByRoleCode,verifyUser,findRolesByUserIds,findRoles,findRolesByUserIdsForEmployee,findRolesByUserId,findUsersByRoleIdList,checkRoles,findUsersByRoleId,findAllEmployeeUsersByRoleIds,filterOwnPermissions,findRolesByIds,checkUriIgnoreV2,findUsers&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279418&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 1.2 移除对注册中心节点的订阅信息 2024-01-17 17:05:10,690 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:unsubscribe:317 [DUBBO] Unsubscribe: consumer://10.0.116.149/com.zhu.user.provider.AuthenticationProvider?application=file-service&category=providers,configurators,routers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.AuthenticationProvider&logger=slf4j&methods=resetPassword,loginWithXhZlbWx,loginWithDingInternal,loginWithXiaoChong,loginWithZjSx,loginWithWx,loginWithSt,loginWithHyuf,loginWithZLBV2,loginWithWxV2,loginWithJinanTianjian,loginWithBaoTou,loginWithPassword,loginWithDDQrCode,logout,loginWithUniqUserNameAndPassword,loginWithCaptcha,loginWithDD,loginWithZLB,loginWithYgzx,verify,loginWithZjYh4PubUser,loginWithGFT,obtainLoginCaptcha,loginWithHuBei,unbindOpenUser,loginWithYh,loginWithZjYh4Cockpit,loginWithQingTian,loginWithFastToken,setWxInfo,loginWithJn,bindWxOa,loginMobileAndPassword,loginWithHZBJ,loginWithJyYj,loginWithCswc,loginWithZLBWX,loginWithXjYh4Admin,loginWithXhZlb,loginWithZlbV2,obtainModifyPwdCaptcha,loginWithMerchantSocial,refreshToken&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=2000&timestamp=1705482278390&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,691 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:destroy:476 [DUBBO] Destroy unsubscribe url consumer://10.0.116.149/com.zhu.user.provider.AuthenticationProvider?application=file-service&category=providers,configurators,routers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.AuthenticationProvider&logger=slf4j&methods=resetPassword,loginWithXhZlbWx,loginWithDingInternal,loginWithXiaoChong,loginWithZjSx,loginWithWx,loginWithSt,loginWithHyuf,loginWithZLBV2,loginWithWxV2,loginWithJinanTianjian,loginWithBaoTou,loginWithPassword,loginWithDDQrCode,logout,loginWithUniqUserNameAndPassword,loginWithCaptcha,loginWithDD,loginWithZLB,loginWithYgzx,verify,loginWithZjYh4PubUser,loginWithGFT,obtainLoginCaptcha,loginWithHuBei,unbindOpenUser,loginWithYh,loginWithZjYh4Cockpit,loginWithQingTian,loginWithFastToken,setWxInfo,loginWithJn,bindWxOa,loginMobileAndPassword,loginWithHZBJ,loginWithJyYj,loginWithCswc,loginWithZLBWX,loginWithXjYh4Admin,loginWithXhZlb,loginWithZlbV2,obtainModifyPwdCaptcha,loginWithMerchantSocial,refreshToken&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=2000&timestamp=1705482278390&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,691 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:unsubscribe:317 [DUBBO] Unsubscribe: consumer://10.0.116.149/com.zhu.user.provider.UserProvider?application=file-service&category=providers,configurators,routers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.UserProvider&logger=slf4j&methods=addSimpleUser,resetPassword,findByTraceId,batchFindOpenInfos,resetUserPassword,modifyPassword,addUser,batchModifyUserRolesV2,addMerchantUser,modifyUserMobile,searchUserLockList,findOpenInfoByUserId,modifyUserAndModifyMobile,addUserWithoutMobile,modifyUser,findById,findLastLoginRecord,batchFindLastLoginRecord,batchFindLastLoginRecordByUserIds,findByMobile,modifyUserRolesV2,batchFindByMobiles,batchFindOpenInfosByExternalIds,getForgetPasswordToken,addTenantUser,findByIds,batchFindByUniqUserNames,obtainModifyMobileCaptcha,unlockUser,addUsers,findByUniqUserName,addSimpleUsers,addUsersWithoutMobile,modifyUserRoles,addMerchantUserV2,batchFindOpenInfosByUserIds,addEmployee,checkNewMobileClient&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279734&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,691 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:destroy:476 [DUBBO] Destroy unsubscribe url consumer://10.0.116.149/com.zhu.user.provider.UserProvider?application=file-service&category=providers,configurators,routers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.UserProvider&logger=slf4j&methods=addSimpleUser,resetPassword,findByTraceId,batchFindOpenInfos,resetUserPassword,modifyPassword,addUser,batchModifyUserRolesV2,addMerchantUser,modifyUserMobile,searchUserLockList,findOpenInfoByUserId,modifyUserAndModifyMobile,addUserWithoutMobile,modifyUser,findById,findLastLoginRecord,batchFindLastLoginRecord,batchFindLastLoginRecordByUserIds,findByMobile,modifyUserRolesV2,batchFindByMobiles,batchFindOpenInfosByExternalIds,getForgetPasswordToken,addTenantUser,findByIds,batchFindByUniqUserNames,obtainModifyMobileCaptcha,unlockUser,addUsers,findByUniqUserName,addSimpleUsers,addUsersWithoutMobile,modifyUserRoles,addMerchantUserV2,batchFindOpenInfosByUserIds,addEmployee,checkNewMobileClient&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279734&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,691 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:unsubscribe:317 [DUBBO] Unsubscribe: consumer://10.0.116.149/com.zhu.user.provider.AuthorizationProvider?application=file-service&category=providers,configurators,routers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.AuthorizationProvider&logger=slf4j&methods=getDesensitizationRules,checkUriIgnore,bindDynamicPermission,checkPermissions,findAllEmployeeUsersByRoleCode,verifyUser,findRolesByUserIds,findRoles,findRolesByUserIdsForEmployee,findRolesByUserId,findUsersByRoleIdList,checkRoles,findUsersByRoleId,findAllEmployeeUsersByRoleIds,filterOwnPermissions,findRolesByIds,checkUriIgnoreV2,findUsers&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279418&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,691 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:destroy:476 [DUBBO] Destroy unsubscribe url consumer://10.0.116.149/com.zhu.user.provider.AuthorizationProvider?application=file-service&category=providers,configurators,routers&check=false&dubbo=2.0.2&interface=com.zhu.user.provider.AuthorizationProvider&logger=slf4j&methods=getDesensitizationRules,checkUriIgnore,bindDynamicPermission,checkPermissions,findAllEmployeeUsersByRoleCode,verifyUser,findRolesByUserIds,findRoles,findRolesByUserIdsForEmployee,findRolesByUserId,findUsersByRoleIdList,checkRoles,findUsersByRoleId,findAllEmployeeUsersByRoleIds,filterOwnPermissions,findRolesByIds,checkUriIgnoreV2,findUsers&pid=42935&qos.enable=true&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279418&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,691 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:unsubscribe:317 [DUBBO] Unsubscribe: provider://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&category=configurators&check=false&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&pid=42935&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:10,691 INFO [DubboShutdownHook|37] com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry:destroy:476 [DUBBO] Destroy unsubscribe url provider://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&category=configurators&check=false&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&pid=42935&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 1.3 关闭和注册中心的连接 2024-01-17 17:05:10,692 INFO [Curator-Framework-0|74] org.apache.curator.framework.imps.CuratorFrameworkImpl:backgroundOperationsLoop:955 backgroundOperationsLoop exiting 2024-01-17 17:05:10,821 INFO [DubboShutdownHook|37] org.apache.zookeeper.ZooKeeper:close:1422 Session: 0x10000003edd39ea closed 2024-01-17 17:05:10,821 INFO [main-EventThread|73] org.apache.zookeeper.ClientCnxn:run:524 EventThread shut down for session: 0x10000003edd39ea # 2 处理协议相关的server和client的连接 # 2.1 处理dubbo协议 # 2.1.1 关闭dubbo server,关闭前需要确保调用端都已经断开连接 2024-01-17 17:05:10,823 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:destroy:432 [DUBBO] Close dubbo server: /10.0.116.149:20880, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:12,523 INFO [DubboShutdownHook|37] com.alibaba.dubbo.remoting.transport.AbstractServer:close:145 [DUBBO] Close NettyServer bind /0.0.0.0:20880, export /10.0.116.149:20880, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 2.1.2 关闭 client -> server 的连接 不过这里实际上并没有关闭物理连接 # client -> server 默认是共享连接的,所以要等到 server 上所有Invoker都destory之后才能关闭物理连接 2024-01-17 17:05:12,527 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:destroy:446 [DUBBO] Close dubbo connect: /10.0.116.149:52113-->/192.168.98.29:20880, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:12,528 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:destroy:446 [DUBBO] Close dubbo connect: /10.0.116.149:52122-->/192.168.98.30:20880, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 2.1.2.1 destory 所有关联的 Invoker 2024-01-17 17:05:12,528 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:destroy:63 [DUBBO] Destroy reference: dubbo://192.168.98.29:20880/com.zhu.user.provider.AuthenticationProvider?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.user.provider.AuthenticationProvider:1.0.0&check=false&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.user.provider.AuthenticationProvider&logger=slf4j&methods=loginWithXhZlbWx,resetPassword,loginWithXiaoChong,loginWithZjSx,loginWithDingInternal,loginWithSt,loginWithWx,loginWithHyuf,loginWithZLBV2,loginWithWxV2,loginWithJinanTianjian,loginWithBaoTou,loginWithPassword,loginWithDDQrCode,logout,loginWithCaptcha,loginWithUniqUserNameAndPassword,loginWithDD,verify,loginWithYgzx,loginWithZLB,loginWithZjYh4PubUser,loginWithGFT,obtainLoginCaptcha,loginWithHuBei,unbindOpenUser,loginWithYh,loginWithZjYh4Cockpit,loginWithQingTian,loginWithFastToken,loginWithJn,setWxInfo,bindWxOa,loginMobileAndPassword,loginWithJyYj,loginWithHZBJ,loginWithCswc,loginWithXjYh4Admin,loginWithZLBWX,loginWithXhZlb,loginWithZlbV2,obtainModifyPwdCaptcha,loginWithMerchantSocial,refreshToken&pid=42935&qos.enable=true&register.ip=10.0.116.149&remote.timestamp=1705480984343&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=2000&timestamp=1705482278390&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:12,528 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:destroy:63 [DUBBO] Destroy reference: dubbo://192.168.98.29:20880/com.zhu.user.provider.AuthorizationProvider?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.user.provider.AuthorizationProvider:1.0.0&check=false&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.user.provider.AuthorizationProvider&logger=slf4j&methods=getDesensitizationRules,checkUriIgnore,bindDynamicPermission,checkPermissions,findAllEmployeeUsersByRoleCode,verifyUser,findRolesByUserIds,findRoles,findRolesByUserIdsForEmployee,findRolesByUserId,findUsersByRoleIdList,checkRoles,findUsersByRoleId,findAllEmployeeUsersByRoleIds,findRolesByIds,filterOwnPermissions,checkUriIgnoreV2,findUsers&pid=42935&qos.enable=true&register.ip=10.0.116.149&remote.timestamp=1705480984643&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279418&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 2.1.2.2 同一个应用的所有Provider的引用都处理完了 就可以断开连接了 2024-01-17 17:05:12,530 INFO [DubboShutdownHook|37] com.alibaba.dubbo.remoting.transport.netty.NettyChannel:close:138 [DUBBO] Close netty channel [id: 0x197da701, /10.0.116.149:52113 => /192.168.98.29:20880], dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 在上面我们作为client主动断开和server的连接后,自身也会收到 disconnected 回调 2024-01-17 17:05:12,532 INFO [DubboSharedHandler-thread-1|196] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.29:20880,url:dubbo://192.168.98.29:20880/com.zhu.user.provider.AuthenticationProvider?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.user.provider.AuthenticationProvider:1.0.0&check=false&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.user.provider.AuthenticationProvider&logger=slf4j&methods=loginWithXhZlbWx,resetPassword,loginWithXiaoChong,loginWithZjSx,loginWithDingInternal,loginWithSt,loginWithWx,loginWithHyuf,loginWithZLBV2,loginWithWxV2,loginWithJinanTianjian,loginWithBaoTou,loginWithPassword,loginWithDDQrCode,logout,loginWithCaptcha,loginWithUniqUserNameAndPassword,loginWithDD,verify,loginWithYgzx,loginWithZLB,loginWithZjYh4PubUser,loginWithGFT,obtainLoginCaptcha,loginWithHuBei,unbindOpenUser,loginWithYh,loginWithZjYh4Cockpit,loginWithQingTian,loginWithFastToken,loginWithJn,setWxInfo,bindWxOa,loginMobileAndPassword,loginWithJyYj,loginWithHZBJ,loginWithCswc,loginWithXjYh4Admin,loginWithZLBWX,loginWithXhZlb,loginWithZlbV2,obtainModifyPwdCaptcha,loginWithMerchantSocial,refreshToken&pid=42935&qos.enable=true&register.ip=10.0.116.149&remote.timestamp=1705480984343&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=2000&timestamp=1705482278390&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 继续关闭 dubbo client -> server 的连接 2024-01-17 17:05:12,535 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:destroy:63 [DUBBO] Destroy reference: dubbo://192.168.98.30:20880/com.zhu.user.provider.UserProvider?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.user.provider.UserProvider:1.0.0&check=false&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.user.provider.UserProvider&logger=slf4j&methods=addSimpleUser,resetPassword,findByTraceId,resetUserPassword,batchFindOpenInfos,modifyPassword,addUser,batchModifyUserRolesV2,modifyUserMobile,addMerchantUser,searchUserLockList,findOpenInfoByUserId,modifyUserAndModifyMobile,addUserWithoutMobile,modifyUser,findById,findLastLoginRecord,batchFindLastLoginRecord,batchFindLastLoginRecordByUserIds,findByMobile,batchFindByMobiles,modifyUserRolesV2,batchFindOpenInfosByExternalIds,getForgetPasswordToken,addTenantUser,batchFindByUniqUserNames,findByIds,obtainModifyMobileCaptcha,unlockUser,addUsers,findByUniqUserName,addUsersWithoutMobile,addSimpleUsers,modifyUserRoles,addMerchantUserV2,batchFindOpenInfosByUserIds,addEmployee,checkNewMobileClient&pid=42935&qos.enable=true&register.ip=10.0.116.149&remote.timestamp=1705481065121&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279734&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 可以看到下面这一条以及往下数的第四条,它们其实都是在对应的dubbo连接关闭之后才destory,所以这里应该是个bug,可能是上面 2.2.1.2的close多减了一次,这里不深究 2024-01-17 17:05:12,535 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:destroy:63 [DUBBO] Destroy reference: dubbo://192.168.98.29:20880/com.zhu.user.provider.UserProvider?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.user.provider.UserProvider:1.0.0&check=false&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.user.provider.UserProvider&logger=slf4j&methods=addSimpleUser,resetPassword,findByTraceId,resetUserPassword,batchFindOpenInfos,modifyPassword,addUser,batchModifyUserRolesV2,modifyUserMobile,addMerchantUser,searchUserLockList,findOpenInfoByUserId,modifyUserAndModifyMobile,addUserWithoutMobile,modifyUser,findById,findLastLoginRecord,batchFindLastLoginRecord,batchFindLastLoginRecordByUserIds,findByMobile,batchFindByMobiles,modifyUserRolesV2,batchFindOpenInfosByExternalIds,getForgetPasswordToken,addTenantUser,findByIds,batchFindByUniqUserNames,obtainModifyMobileCaptcha,unlockUser,addUsers,findByUniqUserName,addUsersWithoutMobile,addSimpleUsers,modifyUserRoles,addMerchantUserV2,batchFindOpenInfosByUserIds,addEmployee,checkNewMobileClient&pid=42935&qos.enable=true&register.ip=10.0.116.149&remote.timestamp=1705480984536&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279734&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:12,535 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:destroy:63 [DUBBO] Destroy reference: dubbo://192.168.98.30:20880/com.zhu.user.provider.AuthenticationProvider?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.user.provider.AuthenticationProvider:1.0.0&check=false&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.user.provider.AuthenticationProvider&logger=slf4j&methods=loginWithXhZlbWx,resetPassword,loginWithXiaoChong,loginWithZjSx,loginWithDingInternal,loginWithSt,loginWithWx,loginWithHyuf,loginWithZLBV2,loginWithWxV2,loginWithJinanTianjian,loginWithBaoTou,loginWithPassword,loginWithDDQrCode,logout,loginWithUniqUserNameAndPassword,loginWithCaptcha,loginWithDD,loginWithYgzx,loginWithZLB,verify,loginWithZjYh4PubUser,loginWithGFT,obtainLoginCaptcha,loginWithHuBei,unbindOpenUser,loginWithYh,loginWithZjYh4Cockpit,loginWithQingTian,loginWithFastToken,loginWithJn,setWxInfo,bindWxOa,loginMobileAndPassword,loginWithHZBJ,loginWithJyYj,loginWithCswc,loginWithXjYh4Admin,loginWithZLBWX,loginWithXhZlb,loginWithZlbV2,obtainModifyPwdCaptcha,loginWithMerchantSocial,refreshToken&pid=42935&qos.enable=true&register.ip=10.0.116.149&remote.timestamp=1705481064854&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=2000&timestamp=1705482278390&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:12,537 INFO [DubboShutdownHook|37] com.alibaba.dubbo.remoting.transport.netty.NettyChannel:close:138 [DUBBO] Close netty channel [id: 0x235b4aea, /10.0.116.149:52122 => /192.168.98.30:20880], dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-17 17:05:12,538 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:destroy:63 [DUBBO] Destroy reference: dubbo://192.168.98.30:20880/com.zhu.user.provider.AuthorizationProvider?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.user.provider.AuthorizationProvider:1.0.0&check=false&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.user.provider.AuthorizationProvider&logger=slf4j&methods=getDesensitizationRules,checkUriIgnore,bindDynamicPermission,checkPermissions,findAllEmployeeUsersByRoleCode,verifyUser,findRolesByUserIds,findRoles,findRolesByUserIdsForEmployee,findRolesByUserId,findUsersByRoleIdList,findUsersByRoleId,checkRoles,findAllEmployeeUsersByRoleIds,findRolesByIds,filterOwnPermissions,checkUriIgnoreV2,findUsers&pid=42935&qos.enable=true&register.ip=10.0.116.149&remote.timestamp=1705481065276&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500&timestamp=1705482279418&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 在上面我们作为client主动断开和server的连接后,自身也会收到 disconnected 回调 2024-01-17 17:05:12,540 INFO [DubboSharedHandler-thread-1|196] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:disconnected:128 [DUBBO] disconnected from /192.168.98.30:20880,url:dubbo://192.168.98.30:20880/com.zhu.user.provider.AuthenticationProvider?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.user.provider.AuthenticationProvider:1.0.0&check=false&codec=dubbo&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&heartbeat=60000&interface=com.zhu.user.provider.AuthenticationProvider&logger=slf4j&methods=loginWithXhZlbWx,resetPassword,loginWithXiaoChong,loginWithZjSx,loginWithDingInternal,loginWithSt,loginWithWx,loginWithHyuf,loginWithZLBV2,loginWithWxV2,loginWithJinanTianjian,loginWithBaoTou,loginWithPassword,loginWithDDQrCode,logout,loginWithUniqUserNameAndPassword,loginWithCaptcha,loginWithDD,loginWithYgzx,loginWithZLB,verify,loginWithZjYh4PubUser,loginWithGFT,obtainLoginCaptcha,loginWithHuBei,unbindOpenUser,loginWithYh,loginWithZjYh4Cockpit,loginWithQingTian,loginWithFastToken,loginWithJn,setWxInfo,bindWxOa,loginMobileAndPassword,loginWithHZBJ,loginWithJyYj,loginWithCswc,loginWithXjYh4Admin,loginWithZLBWX,loginWithXhZlb,loginWithZlbV2,obtainModifyPwdCaptcha,loginWithMerchantSocial,refreshToken&pid=42935&qos.enable=true&register.ip=10.0.116.149&remote.timestamp=1705481064854&retries=0&revision=1.0.0-SNAPSHOT&side=consumer&timeout=2000&timestamp=1705482278390&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 2.1.3 dubbo协议 服务提供者相关的回收操作 2024-01-17 17:05:12,540 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol:destroy:76 [DUBBO] Unexport service: dubbo://10.0.116.149:20880/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&monitor=dubbo%3A%2F%2F192.168.101.208%3A2181%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dfile-service%26dubbo%3D2.0.2%26logger%3Dslf4j%26pid%3D42935%26protocol%3Dregistry%26qos.enable%3Dtrue%26refer%3Dapplication%253Dfile-service%2526dubbo%253D2.0.2%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526logger%253Dslf4j%2526pid%253D42935%2526qos.enable%253Dtrue%2526register.ip%253D10.0.116.149%2526timestamp%253D1705482282340%26registry%3Dzookeeper%26timestamp%3D1705482282215&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 # 2.2 处理injvm协议(因为injvm协议没有Invoker,使用的是exporterMap,所以没有 client -> server 的连接关闭日志,也不存在这种现实意义,因为本身就在jvm里内联属于本地调用) 2024-01-17 17:05:12,540 INFO [DubboShutdownHook|37] com.alibaba.dubbo.rpc.protocol.injvm.InjvmProtocol:destroy:76 [DUBBO] Unexport service: injvm://127.0.0.1/com.zhu.middleware.file.provider.FileTaskProviderV2?accesslog=true&anyhost=true&application=file-service&bean.name=ServiceBean:com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0&bind.ip=10.0.116.149&bind.port=20880&default.service.filter=-exception,-accesslog&dubbo=2.0.2&generic=false&interface=com.zhu.middleware.file.provider.FileTaskProviderV2&logger=slf4j&methods=fail,updateProgress,submitExportTask,start,submitImportTask,pageSearch,finish&pid=42935&qos.enable=true&revision=1.0.0&side=provider&threadpool=wirelessThreadPool&threads=50&timestamp=1705482282216&version=1.0.0, dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149
如果你逐行看懂了上面的日志,那么相信你对DubbShutdownHook的逻辑应该已经非常清晰了。

共享连接

默认情况下,consumer所在的实例和provider所在的实例是共享连接的,无论有多少个provider和consumer。所以在客户端准备关闭连接的时候,会存在一个计数器的概念,只有一个共享连接上的所有consumer→provider的关系都释放了,那才能关闭连接。

在途请求的双等待

在步骤1.1中,当我们从注册中心摘除自身provider信息的时候,有依赖此provider的consumer就会监听到provider下线的消息,从而主动关闭和provider之间的连接。不过这里存在一种特殊情况:就是此时consumer和对应provider之间还有已发起但未完成的请求。在这种场景下,consumer会等待请求完成后再断开连接(最大等待时间默认10s)。但是在这个等待的时间段里我们不希望consumer还能发起新的请求,所以才有了后面server给此类client发送read_only包:虽然连接没有关闭,但是client只能读数据而不能发起新请求了。当然这里也有可能是注册中心推送延迟或者网络原因导致的client未及时和server断开连接,这些场景这里就不展开细说了。
而server也会等待所有client都关闭连接后再关闭(最大等待时间默认10s)

dubbo-2.6.5版本优雅停机存在的问题

乍一看上面的日志,没有任何报错,并且已经是在我们人为的让SpringShutdownHook先执行的前提下。虽然没报错,但是在Spring容器关闭以后,服务还没从注册中心下线这段时间,如果有请求进来真的没有问题吗?
答案肯定是否定的,如果说请求里用到了已经被destory的Bean,并且对该Bean的方法调用里有做destory与否的判断逻辑,那么肯定是会报错的。比如
【dubbo优雅关机】关于spring管理的应用重复监听处理dubbo关闭。
Updated May 16, 2021
提到的Spring容器关闭导致了HikariDataSource的关闭,后续进来的请求需要查询数据库的地方就报错了。由此看来,SpringShutdownHookDubboShutdownHook并行执行肯定是存在问题的。
既然存在这样的可能性,那为什么我们一次都没碰到过?我又回溯了一下之前的日志,发现其实有碰到过,只是日志级别是WARN,并且数量不多,可能就没太在意。下面截取了我们在使用自研的基于Redis的分布式锁在停机过程中的异常日志:
java.lang.IllegalStateException: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@1ad282e0 has been closed already at org.springframework.context.support.AbstractApplicationContext.assertBeanFactoryActive(AbstractApplicationContext.java:1093) ~[spring-context-5.2.9.RELEASE.jar!/:5.2.9.RELEASE] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1126) ~[spring-context-5.2.9.RELEASE.jar!/:5.2.9.RELEASE] at com.zhu.fundamental.util.SpringUtils.getBean(SpringUtils.java:27) ~[fundamental-2.0.0-SNAPSHOT.jar!/:2.0.0-SNAPSHOT] at com.zhu.distributionlock.expire.SpringRedisLockV2.<init>(SpringRedisLockV2.java:37) ~[distribution-lock-2.0.0-SNAPSHOT.jar!/:2.0.0-SNAPSHOT] at com.zhu.distributionlock.expire.SpringRedisLockV2$SpringRedisLockV2Builder.build(SpringRedisLockV2.java:33) ~[distribution-lock-2.0.0-SNAPSHOT.jar!/:2.0.0-SNAPSHOT]

数据库连接池关闭之谜

但是怎么从来没碰到过数据库相关的异常呢?我们99%的接口里面至少都会包含一次数据库交互啊,这个理论上应该是最容易出现问题的地方。
我尝试在SpringShutdownHook执行完毕后,调用一个会查询数据库的方法,发现竟然可以成功返回。并且在SpringShutdownHook执行过程中,数据库连接池和数据库连接也并没有被关闭(我们的框架会打印连接关闭的日志)。
我们自研的框架没有使用SpringBoot自带的DataSourceAutoConfiguration,而是自定义了一套自动配置并且强制指定数据库连接池为tomcat-jdbc
于是我先尝试还原成SpringBoot官方的DataSourceAutoConfiguration。我们使用的2.3.4版本默认第一优先级是HikariDataSource。此时重复前面的步骤,发现在Spring容器关闭的时候有打印出连接池关闭的日志,并且在后续查数据库的时候会报错,也就是和前面的issues里一样:
2024-01-18 15:03:43,404 INFO [SpringContextShutdownHook|115] com.zaxxer.hikari.HikariDataSource:close:350 HikariPool-1 - Shutdown initiated... 2024-01-18 15:03:43,449 INFO [SpringContextShutdownHook|115] com.zaxxer.hikari.HikariDataSource:close:352 HikariPool-1 - Shutdown completed. 2024-01-18 15:04:35,052 INFO 65a8cd838702df29ce41698f [DubboServerHandler-10.0.116.149:20880-34|170] dubbo.accesslog.com.zhu.middleware.file.provider.FileTaskProviderV2:invoke:82 [DUBBO] [2024-01-18 15:04:35] hd-job(192.168.98.4:38830) -> file-service(10.0.116.149:20880) - com.zhu.middleware.file.provider.FileTaskProviderV2:1.0.0 test() , dubbo version: 2.6.5-wireless-1, current host: 10.0.116.149 2024-01-18 15:04:35,059 ERROR 65a8cd838702df29ce41698f [DubboServerHandler-10.0.116.149:20880-34|170] com.zhu.dubbo.filter.v2.BusinessExceptionFilter:invoke:85 Got unchecked and undeclared exception which called by null. service: com.zhu.middleware.file.provider.FileTaskProviderV2, method: $invoke, exception: com.alibaba.dubbo.rpc.service.GenericException: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed. ### The error may exist in file [/Users/zhuzhuchao/IdeaProjects/haoduo/file-service/file-service-mapper/target/classes/mapper/FileTaskMapper.xml] ### The error may involve com.zhu.middleware.file.mapper.FileTaskMapper.selectByPrimaryKey ### The error occurred while executing a query ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed. ### The error may exist in file [/Users/zhuzhuchao/IdeaProjects/haoduo/file-service/file-service-mapper/target/classes/mapper/FileTaskMapper.xml] ### The error may involve com.zhu.middleware.file.mapper.FileTaskMapper.selectByPrimaryKey ### The error occurred while executing a query ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
难道是tomcat-jdbc在停机的时候不会关闭连接池销毁连接吗?打开org.apache.tomcat.jdbc.pool.DataSource的源码,我们看到有定义close()方法。通过优雅停机——基础篇我们知道对于具有close()方法的单例Bean,Spring容器在停机过程中会调用其close()方法做destory。那么这里为什么没有调用呢?
public class DataSource extends DataSourceProxy implements javax.sql.DataSource, MBeanRegistration, ConnectionPoolMBean, ConnectionPoolDataSource { public void close() { this.close(false); } public void close(boolean all) { try { if (this.pool != null) { ConnectionPool p = this.pool; this.pool = null; if (p != null) { p.close(all); } } } catch (Exception var3) { log.warn("Error during connection pool closure.", var3); } } }
原来我们之前在实现动态数据源的时候,注入容器的并不是org.apache.tomcat.jdbc.pool.DataSource类型的Bean,而是我们包装过的DynamicDataSource,而DynamicDataSource并没有close()方法。
💡
动态数据源就是通过配置中心的改动可以实时的调整运行时数据源的功能。是结合我们自研的配置中心回调做的。动态替换过程就是使用新参数创建一个新的数据源,并关闭老数据源。
DynamicDataSource 的方法都委托给了内部真正的DataSource
public class DynamicDataSource implements DataSource { private DataSource dataSource; public DynamicDataSource(DataSource dataSource) { this.dataSource = dataSource; } public Connection getConnection() throws SQLException { return this.dataSource.getConnection(); } public Connection getConnection(String username, String password) throws SQLException { return this.dataSource.getConnection(username, password); } public <T> T unwrap(Class<T> iface) throws SQLException { return this.dataSource.unwrap(iface); } public boolean isWrapperFor(Class<?> iface) throws SQLException { return this.dataSource.isWrapperFor(iface); } public PrintWriter getLogWriter() throws SQLException { return this.dataSource.getLogWriter(); } public void setLogWriter(PrintWriter out) throws SQLException { this.dataSource.setLogWriter(out); } public void setLoginTimeout(int seconds) throws SQLException { this.dataSource.setLoginTimeout(seconds); } public int getLoginTimeout() throws SQLException { return this.dataSource.getLoginTimeout(); } public Logger getParentLogger() throws SQLFeatureNotSupportedException { return this.dataSource.getParentLogger(); } public void setDataSource(final DataSource dataSource) { this.dataSource = dataSource; } public DataSource getDataSource() { return this.dataSource; } }
我们修改DynamicDataSource类实现AutoCloseable接口,并实现了close()方法。终于在Spring容器关闭的时候打印出了连接关闭的日志。
@Override public void close() throws Exception { if (dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource) { ((org.apache.tomcat.jdbc.pool.DataSource) dataSource).close(); } }
不过此时我们再次调用了查询数据库的接口,发现仍然没有报错。因为tomcat-jdbc连接池关闭的时候并没有设置一个已经关闭的标志位,而是直接把pool设置为null了,下一次请求进来则会重新初始化连接池,并创建初始连接,而不会报错:
public Connection getConnection() throws SQLException { return this.pool == null ? this.createPool().getConnection() : this.pool.getConnection(); }

dubbo优雅停机的发展之路

既然dubbo-2.6.5的停机流程存在问题,那么我们看看在后续版本有没有做优化。在这个过程中,我翻看了dubbo-2.6.5版本前后关于优雅停机的所有issues。并按照时间顺序,整理出了下面的优化路线。

issue#1665 pull#1763(May 17, 2018)

  1. 去掉了之前的Application级的DubboShutdownHook
  1. 新增DubboApplicationListener监听Spring容器关闭事件来做优雅停机
  1. 增加DubboWebApplicationInitializer来注册ContextLoaderListener:主要逻辑是为了注册DubboApplicationListener
作者期望做到无感注册DubboApplicationListener监听器来监听ContextClosedEvent事件,依托于SpringShutdownHook来完成优雅停机。另外,作者还调整了一下代码结构
1. Introduce a Bootstrap class to easily start/stop Dubbo when running without Spring. 2. Introduce DubboApplicationListener to listen to the Spring lifecycle event to start/stop Dubbo under Spring.
但是,这个优化存在不少问题
  1. 去掉了之前的应用级的DubboShutdownHook,会导致一些不依赖Spring运行的dubbo应用无法优雅停机
  1. 由于DubboWebApplicationInitializer注册了一个ContextLoaderListener,这种做法对于本身已经配置了ContextLoaderListener的用户是不兼容的。
  1. 更糟糕的是,SpringBoot应用部署到外部容器的启动流程虽然没有用到ContextLoaderListener,但是由于SpringBoot启动过程中会创建ROOT_WEB_APPLICATION_CONTEXT,所以也是不兼容的。
  1. 更扎心的是,对于SpringBoot内嵌容器启动的应用,虽然不会报错,但是SpringBoot内嵌容器启动是不会加载DubboWebApplicationInitializer类的。所以也不会注册DubboApplicationListener

pull#1820(May 31, 2018)

人们很快发现了问题1。于是有了这个pr:
  1. 修复了pull#1763产生的问题1:重新注册DubboShutdownHook。并且注释了这仅仅只是为了兼容性。这是什么意思呢?看看第二点改动你就明白了
    1. notion image
  1. 如果是通过Spring容器启动,并且注册了SpringShutdownHook的场景,那么就会移除前面注册的DubboShutdownHook这就是所谓的兼容性:防止在Spring容器中,SpringShutdownHookDubboShutdownHook并行执行可能会带来的问题。(这里似乎已经在解决我们碰到的问题了)
    1. notion image
  1. 如果是通过SpringContainer启动,也走这一套(移除DubboShutdownHook
    1. notion image
不过遗憾的是,由于后三个问题都没有得到解决,所以这个版本在SpringBoot下依然没法正常工作。

issue#1998 pull#2126(Jul 26, 2018)

pull#2126主要就是为了解决pull#1763带来的问题2
作者去掉了DubboWebApplicationInitializer,增加了web-fragment.xml文件。web-fragment.xml依旧定义了一个ContextLoaderListener,不过我个人感觉并没有解决问题。
所以后续还有人提出了类似问题
spring boot with dubbo 2.6.3, cause ‘ Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml’
Updated Mar 5, 2019
使用JavaConfig搭建框架时报错。 Throw Error:BeanDefinitionStoreException when build by JavaConfig
Updated Oct 8, 2018

pull#2725(Nov 5, 2018)

终于有人碰到了问题3问题4。这个pr的作者直接把前面3个pr的大部分改动还原了。这样,相关issues的问题直接迎刃而解了。
这个改动被合并到了2.6.6版本,但是不知道为什么在更新说明里没有写出来。
notion image
不过这个pr也没解决ShutdownHook并行执行的问题。所以后面也有小伙伴提出了相关issues
Summary of several issues of graceful shutdown
Updated Nov 5, 2018
Problems of graceful shutdown in 2.6.3 and some recommendations
Updated Nov 5, 2018

issue#2901(Dec 7, 2018)

终于要来解决两个ShutdownHook并行的问题了。不过此版本的优化还是没考虑全面:因为使用Spring容器,并不能保证一定注册了SpringShutdownHook。而这里并没有考虑未注册的场景,一股脑的在Spring场景下,把DubboShutdownHook移除了。所以有了后面#3008的优化。
这个改动2.6.x上不存在,只合并到了2.7.x

issue#3008(Dec 18, 2018)

public class SpringExtensionFactory implements ExtensionFactory { private static final ApplicationListener shutdownHookListener = new ShutdownHookListener(); public static void addApplicationContext(ApplicationContext context) { contexts.add(context); if (context instanceof ConfigurableApplicationContext) { ((ConfigurableApplicationContext) context).registerShutdownHook(); DubboShutdownHook.getDubboShutdownHook().unregister(); } BeanFactoryUtils.addApplicationListener(context, shutdownHookListener); } }
该版本保证了只要在Spring环境下,那么会主动注册SpringShutdownHook,不依赖用户手动注册。这样就可以愉快的移除DubboShutdownHook了。
至此,已经解决我们说的并行ShutdownHook问题了。
不过当时有2.6.x2.7.x两个版本在并行迭代,关于并行ShutdownHook的问题在2.7.5版本又被改错了,直到2.7.12版本才被修复,具体可见
【dubbo优雅关机】关于spring管理的应用重复监听处理dubbo关闭。
Updated May 16, 2021
另外,关于ShutdownHook还有一个值得注意的地方,可能存在内存泄漏,具体可见
Fix DubboShutdownHook Memory Leak
Updated Dec 10, 2018

总结

Dubbo的优雅停机之路真的是不平坦,反反复复,并且很多版本的优化和改动都存在一些明显的问题,但是最终还是愉快的合并了。这要造成了不少我在回溯过程中的困扰。不过好在我觉得当下我应该是理清楚了。
Dubbo的优雅停机确实是有不少场景需要考虑的,比如非Spring、Spring without SpringShutdownHook、SpringBoot内嵌容器、SpringBoot外部容器、Spring应用外部容器等等。在设计之初可能很难考虑全面。这也有点前端机型适配的意思,优先解决90%的主流问题也不失为一种好的方案。
文章的篇幅以及花费的时间真的是有点超出预期了~当然,也希望你看完之后会有收获。

参考

  1. 深入Spring Boot (十五):web.xml去哪了
  1. web-fragment使用
  1. Allow the embedded web server to be shut down gracefully
    Updated Mar 18, 2022
  1. howto.traditional-deployment
  1. Dubbo 优雅停机
  1. 一文聊透 Dubbo 优雅停机
Docker端口映射的实现机制优雅停机(上)