apache / dubbo

The java implementation of Apache Dubbo. An RPC and microservice framework.
https://dubbo.apache.org/
Apache License 2.0
40.4k stars 26.42k forks source link

Directory of type RegistryDirectory already destroyed for service xxx while dubbo graceful shutdown #13081

Closed chaoyoung closed 6 months ago

chaoyoung commented 1 year ago

Environment

Steps to reproduce this issue

  1. Consumer开启优雅下线:server.shutdown=graceful, spring.lifecycle.timeout-per-shutdown-phase=30s, dubbo.service.shutdown.wait=20000
  2. 停止Consumer的同时,不断地像Consumer的SpringMVC接口发送请求
  3. 在Consumer的Web容器还没有完全关闭的时候,部分请求进来后由于无法向Provider发送请求而报错

Expected Behavior

Dubbo消费者能在Spring Web容器关闭后再关闭,这样才能做到流量无损

Actual Behavior

Dubbo消费者调用出错:Directory of type RegistryDirectory already destroyed for service xxx.

不知是否跟这个有关:[DubboShutdownHook] org.apache.dubbo.config.DubboShutdownHook Line:130 - [DUBBO] Dubbo wait for application(Dubbo Application[1.1](crm-dubbo)) managed by Spring to be shutdown failed, time usage: 33ms

2023-09-19 20:34:23.307 INFO  [DubboShutdownHook] org.apache.dubbo.config.DubboShutdownHook Line:77  -  [DUBBO] Run shutdown hook now., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:23.308 WARN  [Thread-6] com.alibaba.nacos.common.notify.NotifyCenter Line:136 - [NotifyCenter] Start destroying Publisher
2023-09-19 20:34:23.309 WARN  [Thread-6] com.alibaba.nacos.common.notify.NotifyCenter Line:153 - [NotifyCenter] Destruction of the end
2023-09-19 20:34:23.309 WARN  [Thread-2] com.alibaba.nacos.common.http.HttpClientBeanHolder Line:102 - [HttpClientBeanHolder] Start destroying common HttpClient
2023-09-19 20:34:23.313 INFO  [DubboShutdownHook] org.apache.dubbo.config.DubboShutdownHook Line:109 -  [DUBBO] Waiting for modules(Dubbo Application[1.1](crm-dubbo)) managed by Spring to be shutdown., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:23.314 WARN  [Thread-2] com.alibaba.nacos.common.http.HttpClientBeanHolder Line:111 - [HttpClientBeanHolder] Destruction of the end
2023-09-19 20:34:23.336 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.deploy.DefaultModuleDeployer Line:368 -  [DUBBO] Dubbo Module[1.1.1] is stopping., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:23.342 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.registry.nacos.NacosRegistry Line:400 -  [DUBBO] Unregister: tri://10.244.23.158:50051/com.example.cmc.console.api.service.IOperateResultService?application=crm-dubbo&check.serializable=true&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.example.cmc.console.api.service.IOperateResultService&methods=saveOperateResult,selectOperateResultById,updateOperateResult&prefer.serialization=hessian2,fastjson2&release=3.2.6&retries=0&revision=5.15.4-SNAPSHOT&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&shutwait=30000&side=provider&timestamp=1695125300156&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:23.346 INFO  [DubboShutdownHook] org.apache.dubbo.config.DubboShutdownHook Line:130 -  [DUBBO] Dubbo wait for application(Dubbo Application[1.1](crm-dubbo)) managed by Spring to be shutdown failed, time usage: 33ms, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:23.346 INFO  [DubboShutdownHook] org.apache.dubbo.config.DubboShutdownHook Line:136 -  [DUBBO] Dubbo shutdown hooks execute now. Dubbo Application[1.1](crm-dubbo), dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:25.017 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.registry.nacos.NacosRegistry Line:430 -  [DUBBO] Unsubscribe: consumer://10.244.23.158/com.example.cmc.user.api.service.ICompositeEmployeeService?application=crm-dubbo&background=false&category=providers,configurators,routers&check=false&check.serializable=true&dubbo=2.0.2&executor-management-mode=isolation&file-cache=true&interface=com.example.cmc.user.api.service.ICompositeEmployeeService&methods=getEmployeeDepartment,getEmployeeDeptAndSubDeptIds,listEmployeeByIds,listEmployeeByRole,queryEmployeeRoleScope,queryEmployeeWithinDepartmentByKeyword&pid=1&register-mode=all&release=3.2.6&retries=0&revision=1.1.0-SNAPSHOT&serialize.check.status=WARN&shutwait=30000&side=consumer&sticky=false&timestamp=1695125308709&unloadClusterRelated=false&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:25.033 WARN  [NettyServerWorker-13-2] org.apache.dubbo.remoting.transport.AbstractServer Line:?   -  [DUBBO] All clients has disconnected from 0.0.0.0/0.0.0.0:20880. You can graceful shutdown now., dubbo version: 3.2.6, current host: 10.244.23.158, error code: 99-0. This may be caused by unknown error in remoting module, go to https://dubbo.apache.org/faq/99/0 to find instructions.
2023-09-19 20:34:25.036 INFO  [NettyServerWorker-13-2] org.apache.dubbo.remoting.transport.netty4.NettyServerHandler Line:90  -  [DUBBO] The connection of /10.244.23.220:54952 -> 0.0.0.0/0.0.0.0:20880 is disconnected., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:25.996 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.deploy.DefaultModuleDeployer Line:378 -  [DUBBO] Dubbo Module[1.1.1] has stopped., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:25.996 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.model.FrameworkModel Line:308 -  [DUBBO] Reset global default application from Dubbo Application[1.1](crm-dubbo) to null, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:25.996 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.deploy.DefaultApplicationDeployer Line:1242 -  [DUBBO] Dubbo Application[1.1](crm-dubbo) is stopping., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:25.998 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol Line:543 -  [DUBBO] Destroying protocol [DubboProtocol] ..., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:25.998 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol Line:556 -  [DUBBO] Closing dubbo server: /10.244.23.158:20880, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:26.001 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.remoting.transport.AbstractServer Line:122 -  [DUBBO] Close NettyServer bind /0.0.0.0:20880, export /10.244.23.158:20880, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:29.476 ERROR [XNIO-1 task-7] com.example.cmc.console.aop.GlobalExceptionHandler Line:177 - Directory of type RegistryDirectory already destroyed for service com.example.cmc.user.api.service.ICompositeEmployeeService:1.0 from registry nacos://nacos-0.nacos-headless.nacos.svc.cluster.local:8848,nacos-1.nacos-headless.nacos.svc.cluster.local:8848,nacos-2.nacos-headless.nacos.svc.cluster.local:8848/org.apache.dubbo.registry.RegistryService?application=crm-dubbo&check=true&check.serializable=true&dubbo=2.0.2&executor-management-mode=isolation&file-cache=true&password=nacos&pid=1&register=true&register-mode=all&release=3.2.6&serialize.check.status=WARN&shutwait=30000&subscribe=true&timeout=5000&timestamp=1695125308719&username=nacos
org.apache.dubbo.rpc.RpcException: Directory of type RegistryDirectory already destroyed for service com.example.cmc.user.api.service.ICompositeEmployeeService:1.0 from registry nacos://nacos-0.nacos-headless.nacos.svc.cluster.local:8848,nacos-1.nacos-headless.nacos.svc.cluster.local:8848,nacos-2.nacos-headless.nacos.svc.cluster.local:8848/org.apache.dubbo.registry.RegistryService?application=crm-dubbo&check=true&check.serializable=true&dubbo=2.0.2&executor-management-mode=isolation&file-cache=true&password=nacos&pid=1&register=true&register-mode=all&release=3.2.6&serialize.check.status=WARN&shutwait=30000&subscribe=true&timeout=5000&timestamp=1695125308719&username=nacos
    at org.apache.dubbo.rpc.cluster.directory.AbstractDirectory.list(AbstractDirectory.java:194)
    at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.list(AbstractClusterInvoker.java:423)
    at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:334)
    at org.apache.dubbo.rpc.cluster.router.RouterSnapshotFilter.invoke(RouterSnapshotFilter.java:46)
    at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:334)
    at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:108)
    at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:334)
    at org.apache.dubbo.rpc.cluster.filter.support.MetricsClusterFilter.invoke(MetricsClusterFilter.java:56)
    at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:334)
    at org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:52)
    at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:334)
    at org.apache.dubbo.spring.security.filter.ContextHolderParametersSelectedTransferFilter.invoke(ContextHolderParametersSelectedTransferFilter.java:41)
    at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:334)
    at org.apache.dubbo.metrics.filter.MetricsFilter.invoke(MetricsFilter.java:73)
    at org.apache.dubbo.rpc.cluster.filter.support.MetricsConsumerFilter.invoke(MetricsConsumerFilter.java:37)
    at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:334)
    at org.apache.dubbo.rpc.cluster.filter.support.ConsumerClassLoaderFilter.invoke(ConsumerClassLoaderFilter.java:40)
    at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:334)
    at org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter.invoke(ConsumerContextFilter.java:116)
    at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:334)
    at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CallbackRegistrationInvoker.invoke(FilterChainBuilder.java:196)
    at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$ClusterFilterInvoker.invoke(AbstractCluster.java:91)
    at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:103)
    at org.apache.dubbo.rpc.cluster.support.wrapper.ScopeClusterInvoker.invoke(ScopeClusterInvoker.java:169)
    at org.apache.dubbo.registry.client.migration.MigrationInvoker.invoke(MigrationInvoker.java:284)
    at org.apache.dubbo.rpc.proxy.InvocationUtil.invoke(InvocationUtil.java:61)
    at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:75)
    at com.example.cmc.user.api.service.ICompositeEmployeeServiceDubboProxy0.queryEmployeeRoleScope(ICompositeEmployeeServiceDubboProxy0.java)
    at sun.reflect.GeneratedMethodAccessor769.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.dubbo.config.spring.util.LazyTargetInvocationHandler.invoke(LazyTargetInvocationHandler.java:58)
    at com.example.cmc.user.api.service.ICompositeEmployeeServiceDubboProxy0.queryEmployeeRoleScope(ICompositeEmployeeServiceDubboProxy0.java)
    at com.example.cmc.console.aop.PermissionAop.setPermissionQuery(PermissionAop.java:65)
    at com.example.cmc.console.aop.PermissionAop.lambda$doBeforeAdvice$0(PermissionAop.java:43)
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at com.example.cmc.console.aop.PermissionAop.doBeforeAdvice(PermissionAop.java:41)
    at sun.reflect.GeneratedMethodAccessor499.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:617)
    at org.springframework.aop.aspectj.AspectJMethodBeforeAdvice.before(AspectJMethodBeforeAdvice.java:44)
    at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:57)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
    at com.example.cmc.console.controller.CallTaskController$$EnhancerBySpringCGLIB$$3cd9409c.listByTemplateCode(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:645)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
    at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at com.example.common.http.filter.AbstractHttpRequestLoggingFilter.doFilterInternal(AbstractHttpRequestLoggingFilter.java:228)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at com.example.common.http.filter.XssFilter.doFilter(XssFilter.java:22)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)
    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:79)
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:100)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)
    at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
    at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)
    at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
    at java.lang.Thread.run(Thread.java:748)
2023-09-19 20:34:30.051 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.qos.server.Server Line:133 -  [DUBBO] qos-server stopped., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.057 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol Line:124 -  [DUBBO] Unexport service: injvm://127.0.0.1/org.apache.dubbo.metadata.MetadataService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=0&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&exporter.listener=injvm&file-cache=true&generic=false&getAndListenInstanceMetadata.1.callback=true&getAndListenInstanceMetadata.return=true&getAndListenInstanceMetadata.sent=true&group=crm-dubbo&interface=org.apache.dubbo.metadata.MetadataService&methods=exportInstanceMetadata,getAndListenInstanceMetadata,getExportedServiceURLs,getExportedURLs,getInstanceMetadataChangedListenerMap,getMetadataInfo,getMetadataInfos,getMetadataURL,getServiceDefinition,getSubscribedURLs,isMetadataService,serviceName,toSortedStrings,version&pid=1&prefer.serialization=hessian2,fastjson2&register=false&register-mode=all&release=3.2.6&retries=0&revision=3.2.6&serialization=hessian2&serialize.check.status=WARN&service.filter=-default&shutwait=30000&side=provider&timestamp=1695125322905&version=1.0.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.058 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.qos.server.Server Line:133 -  [DUBBO] qos-server stopped., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.062 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.qos.server.Server Line:133 -  [DUBBO] qos-server stopped., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.064 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.qos.server.Server Line:133 -  [DUBBO] qos-server stopped., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.065 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:181 -  [DUBBO] Destroying protocol [TripleProtocol] ..., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.066 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:110 -  [DUBBO] Destroy reference: tri://10.244.23.158:50051/com.example.cmc.console.api.service.IDemonstrationCenterService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=com.example.cmc.console.api.service.IDemonstrationCenterService&methods=addIndustry,delIndustry,selectAll,updateIndustry&pid=1&prefer.serialization=hessian2,fastjson2&register-mode=all&release=3.2.6&retries=0&revision=5.15.4-SNAPSHOT&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&shutwait=30000&side=provider&timestamp=1695125285116&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.067 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:110 -  [DUBBO] Destroy reference: tri://10.244.23.158:50051/com.example.cc.dispatcher.api.service.ICallProcessService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&group=public_crm&interface=com.example.cc.dispatcher.api.service.ICallProcessService&methods=processPhoneParamBeforeCall,processTtsParamBeforeCall&pid=1&prefer.serialization=hessian2,fastjson2&register-mode=all&release=3.2.6&retries=0&revision=4.7.4-SNAPSHOT&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&shutwait=30000&side=provider&timeout=30000&timestamp=1695125298321&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.068 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:110 -  [DUBBO] Destroy reference: tri://10.244.23.158:50051/com.example.cmc.console.api.service.ICustomerService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=com.example.cmc.console.api.service.ICustomerService&methods=getCustomerBelongsToAgentGroup&pid=1&prefer.serialization=hessian2,fastjson2&register-mode=all&release=3.2.6&retries=0&revision=5.15.4-SNAPSHOT&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&shutwait=30000&side=provider&timestamp=1695125296519&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.068 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:110 -  [DUBBO] Destroy reference: tri://10.244.23.158:50051/com.example.cmc.console.api.service.ILogService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=com.example.cmc.console.api.service.ILogService&methods=saveLog&pid=1&prefer.serialization=hessian2,fastjson2&register-mode=all&release=3.2.6&retries=0&revision=5.15.4-SNAPSHOT&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&shutwait=30000&side=provider&timestamp=1695125286490&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.069 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:110 -  [DUBBO] Destroy reference: tri://10.244.23.158:50051/com.example.cmc.console.api.service.INotifyMessageService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=com.example.cmc.console.api.service.INotifyMessageService&methods=insertNotifyMessage&pid=1&prefer.serialization=hessian2,fastjson2&register-mode=all&release=3.2.6&retries=0&revision=5.15.4-SNAPSHOT&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&shutwait=30000&side=provider&timestamp=1695125287425&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.070 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:110 -  [DUBBO] Destroy reference: tri://10.244.23.158:50051/com.example.cmc.console.api.service.ITaskImportBatchService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=com.example.cmc.console.api.service.ITaskImportBatchService&methods=listCallTaskImportBatch,saveTaskImportBatch&pid=1&prefer.serialization=hessian2,fastjson2&register-mode=all&release=3.2.6&retries=0&revision=5.15.4-SNAPSHOT&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&shutwait=30000&side=provider&timestamp=1695125297434&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.070 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:110 -  [DUBBO] Destroy reference: tri://10.244.23.158:50051/com.example.cmc.console.api.service.ICallRecordService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&getAnswerNumberCallItemCount.return=true&getAnswerNumberCallItemCount.sent=true&getAnswerNumberCallItemCount.timeout=60000&getCallTaskItemCount.return=true&getCallTaskItemCount.sent=true&getCallTaskItemCount.timeout=60000&interface=com.example.cmc.console.api.service.ICallRecordService&methods=getAgentCallStatistics,getAnswerNumberCallItemCount,getAudio,getAudioURL,getCallDialogRecords,getCallStatistics,getCallTaskItemCount,getEntCallTaskByTemplateCode,queryCallRecordList&pid=1&prefer.serialization=hessian2,fastjson2&register-mode=all&release=3.2.6&retries=0&revision=5.15.4-SNAPSHOT&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&shutwait=30000&side=provider&timeout=10000&timestamp=1695125299237&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.071 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:110 -  [DUBBO] Destroy reference: tri://10.244.23.158:50051/org.apache.dubbo.metadata.MetadataService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=0&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&getAndListenInstanceMetadata.1.callback=true&getAndListenInstanceMetadata.return=true&getAndListenInstanceMetadata.sent=true&group=crm-dubbo&interface=org.apache.dubbo.metadata.MetadataService&methods=exportInstanceMetadata,getAndListenInstanceMetadata,getExportedServiceURLs,getExportedURLs,getInstanceMetadataChangedListenerMap,getMetadataInfo,getMetadataInfos,getMetadataURL,getServiceDefinition,getSubscribedURLs,isMetadataService,serviceName,toSortedStrings,version&pid=1&prefer.serialization=hessian2,fastjson2&register=false&register-mode=all&release=3.2.6&retries=0&revision=3.2.6&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&service.filter=-default&shutwait=30000&side=provider&timestamp=1695125322905&version=1.0.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.072 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:110 -  [DUBBO] Destroy reference: tri://10.244.23.158:50051/com.example.cmc.console.api.service.ICallTaskService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=com.example.cmc.console.api.service.ICallTaskService&methods=addCalledPhonesToTask,getCallTaskById,getCallTaskVarDTOById,getExportVarNames,selectCallRecordByCallId,selectCountCallTaskByDepartmentId,tryCall&pid=1&prefer.serialization=hessian2,fastjson2&register-mode=all&release=3.2.6&retries=0&revision=5.15.4-SNAPSHOT&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&shutwait=30000&side=provider&timestamp=1695125291799&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.072 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:110 -  [DUBBO] Destroy reference: tri://10.244.23.158:50051/com.example.cmc.console.api.service.IOperateResultService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&check.serializable=true&delay=-1&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=com.example.cmc.console.api.service.IOperateResultService&methods=saveOperateResult,selectOperateResultById,updateOperateResult&pid=1&prefer.serialization=hessian2,fastjson2&register-mode=all&release=3.2.6&retries=0&revision=5.15.4-SNAPSHOT&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&shutwait=30000&side=provider&timestamp=1695125300156&version=1.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.073 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.qos.server.Server Line:133 -  [DUBBO] qos-server stopped., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.074 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.protocol.tri.TripleProtocol Line:181 -  [DUBBO] Destroying protocol [TripleProtocol] ..., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.074 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.deploy.DefaultModuleDeployer Line:368 -  [DUBBO] Dubbo Module[1.1.0] is stopping., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.081 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.deploy.DefaultModuleDeployer Line:378 -  [DUBBO] Dubbo Module[1.1.0] has stopped., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.086 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.registry.support.RegistryManager Line:101 -  [DUBBO] Close all registries [nacos://nacos-0.nacos-headless.nacos.svc.cluster.local:8848,nacos-1.nacos-headless.nacos.svc.cluster.local:8848,nacos-2.nacos-headless.nacos.svc.cluster.local:8848/org.apache.dubbo.registry.RegistryService?REGISTRY_CLUSTER=internal-metadata-registry&application=crm-dubbo&check=true&check.serializable=true&dubbo=2.0.2&executor-management-mode=isolation&file-cache=true&interface=org.apache.dubbo.registry.RegistryService&password=nacos&pid=1&register=true&register-mode=all&release=3.2.6&serialize.check.status=WARN&shutwait=30000&subscribe=true&timeout=5000&username=nacos, nacos://nacos-0.nacos-headless.nacos.svc.cluster.local:8848,nacos-1.nacos-headless.nacos.svc.cluster.local:8848,nacos-2.nacos-headless.nacos.svc.cluster.local:8848/org.apache.dubbo.registry.RegistryService?application=crm-dubbo&check=true&check.serializable=true&dubbo=2.0.2&executor-management-mode=isolation&file-cache=true&interface=org.apache.dubbo.registry.RegistryService&password=nacos&pid=1&register=false&register-mode=all&release=3.2.6&serialize.check.status=WARN&shutwait=30000&subscribe=true&timeout=5000&username=nacos, nacos://nacos-0.nacos-headless.nacos.svc.cluster.local:8848,nacos-1.nacos-headless.nacos.svc.cluster.local:8848,nacos-2.nacos-headless.nacos.svc.cluster.local:8848/org.apache.dubbo.registry.RegistryService?application=crm-dubbo&check=true&check.serializable=true&dubbo=2.0.2&executor-management-mode=isolation&file-cache=true&interface=org.apache.dubbo.registry.RegistryService&password=nacos&pid=1&register=true&register-mode=all&release=3.2.6&serialize.check.status=WARN&shutwait=30000&subscribe=true&timeout=5000&username=nacos, nacos://nacos-0.nacos-headless.nacos.svc.cluster.local:8848,nacos-1.nacos-headless.nacos.svc.cluster.local:8848,nacos-2.nacos-headless.nacos.svc.cluster.local:8848/org.apache.dubbo.registry.RegistryService?application=crm-dubbo&check=true&check.serializable=true&dubbo=2.0.2&executor-management-mode=isolation&file-cache=true&interface=org.apache.dubbo.registry.RegistryService&password=nacos&pid=1&register=false&register-mode=all&release=3.2.6&serialize.check.status=WARN&shutwait=30000&subscribe=true&timeout=5000&username=nacos], dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.142 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.registry.nacos.NacosRegistry Line:576 -  [DUBBO] Destroy registry:nacos://nacos-0.nacos-headless.nacos.svc.cluster.local:8848,nacos-1.nacos-headless.nacos.svc.cluster.local:8848,nacos-2.nacos-headless.nacos.svc.cluster.local:8848/org.apache.dubbo.registry.RegistryService?application=crm-dubbo&check=true&check.serializable=true&dubbo=2.0.2&executor-management-mode=isolation&file-cache=true&interface=org.apache.dubbo.registry.RegistryService&password=nacos&pid=1&register=false&register-mode=all&release=3.2.6&serialize.check.status=WARN&shutwait=30000&subscribe=true&timeout=5000&username=nacos, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.144 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.registry.nacos.NacosRegistry Line:430 -  [DUBBO] Unsubscribe: provider://10.244.23.158:50051/org.apache.dubbo.metadata.MetadataService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&category=configurators&check=false&check.serializable=true&delay=0&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&getAndListenInstanceMetadata.1.callback=true&getAndListenInstanceMetadata.return=true&getAndListenInstanceMetadata.sent=true&group=crm-dubbo&interface=org.apache.dubbo.metadata.MetadataService&methods=exportInstanceMetadata,getAndListenInstanceMetadata,getExportedServiceURLs,getExportedURLs,getInstanceMetadataChangedListenerMap,getMetadataInfo,getMetadataInfos,getMetadataURL,getServiceDefinition,getSubscribedURLs,isMetadataService,serviceName,toSortedStrings,version&pid=1&prefer.serialization=hessian2,fastjson2&register=false&register-mode=all&release=3.2.6&retries=0&revision=3.2.6&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&service.filter=-default&shutwait=30000&side=provider&timestamp=1695125322905&version=1.0.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.181 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.registry.nacos.NacosRegistry Line:603 -  [DUBBO] Destroy unsubscribe url provider://10.244.23.158:50051/org.apache.dubbo.metadata.MetadataService?anyhost=true&application=crm-dubbo&background=false&bind.ip=10.244.23.158&bind.port=50051&category=configurators&check=false&check.serializable=true&delay=0&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&getAndListenInstanceMetadata.1.callback=true&getAndListenInstanceMetadata.return=true&getAndListenInstanceMetadata.sent=true&group=crm-dubbo&interface=org.apache.dubbo.metadata.MetadataService&methods=exportInstanceMetadata,getAndListenInstanceMetadata,getExportedServiceURLs,getExportedURLs,getInstanceMetadataChangedListenerMap,getMetadataInfo,getMetadataInfos,getMetadataURL,getServiceDefinition,getSubscribedURLs,isMetadataService,serviceName,toSortedStrings,version&pid=1&prefer.serialization=hessian2,fastjson2&register=false&register-mode=all&release=3.2.6&retries=0&revision=3.2.6&serialization=hessian2&serialize.check.status=WARN&service-name-mapping=true&service.filter=-default&shutwait=30000&side=provider&timestamp=1695125322905&version=1.0.0, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.200 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.common.threadpool.manager.DefaultExecutorRepository Line:403 -  [DUBBO] destroying application executor repository .., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.212 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.deploy.DefaultApplicationDeployer Line:1256 -  [DUBBO] Dubbo Application[1.1](crm-dubbo) has stopped., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.218 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.model.FrameworkModel Line:115 -  [DUBBO] Destroying default framework model: Dubbo Framework[1], dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.219 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.model.FrameworkModel Line:120 -  [DUBBO] Dubbo Framework[1] is destroying ..., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.220 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.deploy.DefaultApplicationDeployer Line:1242 -  [DUBBO] Dubbo Application[1.0](DUBBO_INTERNAL_APPLICATION) is stopping., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.221 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.deploy.DefaultModuleDeployer Line:368 -  [DUBBO] Dubbo Module[1.0.0] is stopping., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.221 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.deploy.DefaultModuleDeployer Line:378 -  [DUBBO] Dubbo Module[1.0.0] has stopped., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.222 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.registry.support.RegistryManager Line:101 -  [DUBBO] Close all registries [], dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.223 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.common.threadpool.manager.DefaultExecutorRepository Line:403 -  [DUBBO] destroying application executor repository .., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.224 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.deploy.DefaultApplicationDeployer Line:1256 -  [DUBBO] Dubbo Application[1.0](DUBBO_INTERNAL_APPLICATION) has stopped., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.226 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.model.FrameworkModel Line:135 -  [DUBBO] Dubbo Framework[1] is destroyed, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.227 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.rpc.model.FrameworkModel Line:327 -  [DUBBO] Reset global default framework from Dubbo Framework[1] to null, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.227 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.common.resource.GlobalResourcesRepository Line:107 -  [DUBBO] Destroying global resources ..., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.257 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.common.resource.GlobalResourcesRepository Line:145 -  [DUBBO] Dubbo is completely destroyed, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.258 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository Line:189 -  [DUBBO] destroying framework executor repository .., dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.278 INFO  [SpringApplicationShutdownHook] org.apache.dubbo.config.spring.context.DubboSpringInitializer Line:80  -  [DUBBO] Unbind Dubbo Module[1.1.1] from spring container: org.springframework.beans.factory.support.DefaultListableBeanFactory@2287395, dubbo version: 3.2.6, current host: 10.244.23.158
2023-09-19 20:34:30.569 INFO  [SpringApplicationShutdownHook] org.springframework.boot.web.embedded.undertow.UndertowWebServer Line:295 - Commencing graceful shutdown. Waiting for active requests to complete
2023-09-19 20:34:30.576 INFO  [SpringApplicationShutdownHook] org.springframework.boot.web.embedded.undertow.UndertowWebServer Line:305 - Graceful shutdown complete
2023-09-19 20:34:30.662 INFO  [SpringApplicationShutdownHook] org.springframework.scheduling.quartz.SchedulerFactoryBean Line:847 - Shutting down Quartz Scheduler
chaoyoung commented 1 year ago

目前通过外部先摘除后端入口HTTP流量解决了此问题。

Spring Boot application.yml 配置graceful shutdown

server:
  shutdown: graceful
spring:
  lifecycle:
    timeout-per-shutdown-phase: 30s

应用程序提供实例下线的接口

@RestController
@RequiredArgsConstructor
@Slf4j
public class GracefulShutdownController {

    private final NacosAutoServiceRegistration nacosAutoServiceRegistration;

    @PostMapping("/instance/deregister")
    public void deregisterInstance() {
        nacosAutoServiceRegistration.stop();
        log.info("instance deregistered from nacos.");
    }
}

通过k8s lifecycle.preStop 执行curl命令调用实例下线的接口,将入口http流量先摘除,然后等Spring和Dubbo graceful shutdown,最多等待30s。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: xxx-backend
  namespace: default
  labels:
    app: xxx-backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: xxx-backend
  template:
    metadata:
      labels:
        app: xxx-backend
    spec:
      containers:
      - name: xxx-backend
        image: registry.cn-hangzhou.aliyuncs.com/namespace/xxx-backend:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "curl -X POST localhost:8080/instance/deregister"]
      terminationGracePeriodSeconds: 30

因为使用了Spring Cloud Gateway作为后端微服务网关,所以Gateway这边也需要在实例下线的时候清理缓存的操作。

/**
 * 订阅Nacos通知
 * 接收Nacos推送的微服务上下线实例信息
 */
@Component
@Slf4j
public  class NacosInstancesChangeEventListener extends Subscriber<InstancesChangeEvent> {
    @Resource
    private CacheManager caffeineLoadBalancerCacheManager;
    @PostConstruct
    public void registerToNotifyCenter() {
        NotifyCenter.registerSubscriber(this);
    }
    @Override
    public void onEvent(InstancesChangeEvent event) {
        log.info("Spring Gateway 接收实例刷新事件:{}, 开始刷新缓存", JacksonUtils.toJson(event));
        Cache cache = caffeineLoadBalancerCacheManager.getCache(SERVICE_INSTANCE_CACHE_NAME);
        if (cache != null) {
            cache.evict(event.getServiceName());
        }
        log.info("Spring Gateway 实例刷新完成");
    }
    @Override
    public Class<? extends com.alibaba.nacos.common.notify.Event> subscribeType() {
        return InstancesChangeEvent.class;
    }
}
chaoyoung commented 1 year ago

实测通过preStop hook直接调用Nacos APIcurl -X PUT "http://nacos-headless.nacos.svc.cluster.local:8848/nacos/v1/ns/instance?serviceName=xxx-backend&namespaceId=&clusterName=DEFAULT&groupName=DEFAULT_GROUP&ip=$POD_IP&port=8080&ephemeral=true&enabled=false&username=$NACOS_USERNAME&password=$NACOS_PASSWORD"完成服务下线,避免每个微服务还需要单独增加服务下线接口。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: xxx-backend
  namespace: default
  labels:
    app: xxx-backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: xxx-backend
  template:
    metadata:
      labels:
        app: xxx-backend
    spec:
      containers:
      - name: xxx-backend
        image: registry.cn-hangzhou.aliyuncs.com/namespace/xxx-backend:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        env:
        - name: NACOS_SERVER_ADDR
          valueFrom:
            configMapKeyRef:
              name: common-cm
              key: nacos.server-addr
        - name: NACOS_USERNAME
          valueFrom:
            configMapKeyRef:
              name: common-cm
              key: nacos.username
        - name: NACOS_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: common-cm
              key: nacos.password
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        lifecycle:
          preStop:
            exec:
              command:
              - bash
              - -c
              - curl -X PUT "http://nacos-headless.nacos.svc.cluster.local:8848/nacos/v1/ns/instance?serviceName=xxx-backend&namespaceId=&clusterName=DEFAULT&groupName=DEFAULT_GROUP&ip=$POD_IP&port=8080&ephemeral=true&enabled=false&username=$NACOS_USERNAME&password=$NACOS_PASSWORD"
      terminationGracePeriodSeconds: 30
AlbumenJ commented 12 months ago
  1. 应用下线的时候,需要把入口流量现摘除(包括 Http、Dubbo 等)
  2. Dubbo 的下线可以通过调用 http://127.0.0.1:22222/offine 实现
AlbumenJ commented 6 months ago

No news is good news. Please feel free to create a new issue if you have any question.