SpringCloud源码剖析-Eureka Client取消注册

简介: 取消注册(服务下线)指的是EureakClient正常关闭之前,微服务会主动向EurekaServer发送下线请求,EureakServer接收到请求从注册表中剔除下线的服务DiscoveryClient.shutdown 方法DiscoveryClient是服务发现最核心的实现,DiscoveryClient通过shutdown 方法取消服务注册,方法上通过@PreDestroy标记该方法是实例的销毁方法,当应用关闭,容器正常关闭,Bean的销毁方法执行,

取消注册

取消注册(服务下线)指的是EureakClient正常关闭之前,微服务会主动向EurekaServer发送下线请求,EureakServer接收到请求从注册表中剔除下线的服务

DiscoveryClient.shutdown 方法

DiscoveryClient是服务发现最核心的实现,DiscoveryClient通过shutdown 方法取消服务注册,方法上通过@PreDestroy标记该方法是实例的销毁方法,当应用关闭,容器正常关闭,Bean的销毁方法执行,源码如下:

@SingletonpublicclassDiscoveryClientimplementsEurekaClient {
    ....省略部分代码...
/**//关闭Eureak Client,从Eureak Server中取消服务的注册* Shuts down Eureka Client. Also sends a deregistration request to the* eureka server.*/@PreDestroy@Overridepublicsynchronizedvoidshutdown() {
if (isShutdown.compareAndSet(false, true)) {
logger.info("Shutting down DiscoveryClient ...");
//1.移除掉服务状态监听器if (statusChangeListener!=null&&applicationInfoManager!=null) {
applicationInfoManager.unregisterStatusChangeListener(statusChangeListener.getId());
            }
//2.注销定时任务cancelScheduledTasks();
// If APPINFO was registered//如果开启了shouldUnregisterOnShutdown 取消注册(默认true),if (applicationInfoManager!=null&&clientConfig.shouldRegisterWithEureka()
&&clientConfig.shouldUnregisterOnShutdown()) {
//3.修改实例的注册状态为 DOWNapplicationInfoManager.setInstanceStatus(InstanceStatus.DOWN);
//4.取消注册unregister();
            }
//5.注销eurekaTransportif (eurekaTransport!=null) {
eurekaTransport.shutdown();
            }
//6.注销心跳状态监视器heartbeatStalenessMonitor.shutdown();
//7.注销注册表状态监视器registryStalenessMonitor.shutdown();
logger.info("Completed shut down of DiscoveryClient");
        }
    }
//注销定时任务privatevoidcancelScheduledTasks() {
if (instanceInfoReplicator!=null) {
instanceInfoReplicator.stop();
        }
if (heartbeatExecutor!=null) {
heartbeatExecutor.shutdownNow();
        }
if (cacheRefreshExecutor!=null) {
cacheRefreshExecutor.shutdownNow();
        }
if (scheduler!=null) {
scheduler.shutdownNow();
        }
    }
//注销EurekaTransport ,privatestaticfinalclassEurekaTransport {
privateClosableResolverbootstrapResolver;
privateTransportClientFactorytransportClientFactory;
privateEurekaHttpClientregistrationClient;
privateEurekaHttpClientFactoryregistrationClientFactory;
privateEurekaHttpClientqueryClient;
privateEurekaHttpClientFactoryqueryClientFactory;
voidshutdown() {
if (registrationClientFactory!=null) {
registrationClientFactory.shutdown();
            }
if (queryClientFactory!=null) {
queryClientFactory.shutdown();
            }
if (registrationClient!=null) {
registrationClient.shutdown();
            }
if (queryClient!=null) {
queryClient.shutdown();
            }
if (transportClientFactory!=null) {
transportClientFactory.shutdown();
            }
if (bootstrapResolver!=null) {
bootstrapResolver.shutdown();
            }
        }
    }

总结一下,在shutdown方法中做了如下事情

  • 通过 applicationInfoManager.unregisterStatusChangeListener移除服务实例状态监听器StatusChangeListener
  • 调用DiscoveryClient.cancelScheduledTasks();取消定时任务
  • 修改applicationInfoManager.setInstanceStatus(InstanceStatus.DOWN);状态为DOWN,调用unregister方法取消注册
  • eurekaTransport.shutdown(); 注销和EurekaServer交互的Http客户端
  • 注销心跳状态监视器,注册表状态监视器

我们重点跟踪一下 unregister方法源码

/**向eureka发送取消注册请求* unregister w/ the eureka service.*/voidunregister() {
// It can be null if shouldRegisterWithEureka == falseif(eurekaTransport!=null&&eurekaTransport.registrationClient!=null) {
try {
logger.info("Unregistering ...");
//向eureka发送取消注册的http请求EurekaHttpResponse<Void>httpResponse=eurekaTransport.registrationClient.cancel(instanceInfo.getAppName(), instanceInfo.getId());
logger.info(PREFIX+"{} - deregister  status: {}", appPathIdentifier, httpResponse.getStatusCode());
        } catch (Exceptione) {
logger.error(PREFIX+"{} - de-registration failed{}", appPathIdentifier, e.getMessage(), e);
        }
    }
}

这里依然通过eurekaTransport.registrationClient得到EureakHttpClient客户端发请求,最终会调用AbstractJerseyEurekaHttpClient.cancel方法发送Delete取消注册请求

@OverridepublicEurekaHttpResponse<Void>cancel(StringappName, Stringid) {
StringurlPath="apps/"+appName+'/'+id;
ClientResponseresponse=null;
try {
BuilderresourceBuilder=jerseyClient.resource(serviceUrl).path(urlPath).getRequestBuilder();
addExtraHeaders(resourceBuilder);
//发送Delete请求response=resourceBuilder.delete(ClientResponse.class);
returnanEurekaHttpResponse(response.getStatus()).headers(headersOf(response)).build();
    } finally {
if (logger.isDebugEnabled()) {
logger.debug("Jersey HTTP DELETE {}/{}; statusCode={}", serviceUrl, urlPath, response==null?"N/A" : response.getStatus());
        }
if (response!=null) {
response.close();
        }
    }
}

总结

  1. Eureak服务取消注册,通过 @PreDestroy标记DiscoveyClient.shutdown销毁方法,当容器正常关闭,Bean的销毁执行
  2. 在shutdown方法中注销了服务注册状态监听器,注销定时任务执行器,修改服务注册状态为下线,调用unregister方法取消注册等等
  3. unregister方法中通过eurekaTransport 得到HttpClient,使用AbstractJerseyEurekaHttpClient发送delete请求到Eureak Server取消服务注册
目录
相关文章
|
18天前
|
Java 应用服务中间件 Nacos
Spring Cloud 常用各个组件详解及实现原理(附加源码+实现逻辑图)
Spring Cloud 常用各个组件详解及实现原理(附加源码+实现逻辑图)
31 0
|
2月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
191 0
|
2月前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
117 0
|
17天前
|
负载均衡 监控 容灾
【SpringCloud】详解Eureka注册中心
【SpringCloud】详解Eureka注册中心
23 0
|
17天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
22天前
|
Java Maven Nacos
Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)
Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)
31 0
|
23天前
|
人工智能 监控 安全
Java+Spring Cloud +Vue+UniApp微服务智慧工地云平台源码
视频监控系统、人员实名制与分账制管理系统、车辆管理系统、环境监测系统、大型设备监测(龙门吊、塔吊、升降机、卸料平台等)、用电监测系统、基坑监测系统、AI算法分析(安全帽佩戴、火焰识别、周界报警、人员聚众报警、升降机超载报警)、安全培训、设备监测。
28 4
|
24天前
|
人工智能 监控 安全
Spring Cloud+Uniapp 智慧工地云平台源码 智慧工地云平台AI视频分析应用
AI视频分析包括行为分析,即人员安全帽佩戴检测、反光衣穿戴检测、人员出入检测、区域入侵监测,以及烟火监测、人数统计、人脸识别、车辆识别、人体测温等。
17 0
|
27天前
|
人工智能 监控 安全
Springcloud数字化物联网智慧工地综合平台源码 劳务管理、设备管理、绿色施工
Springcloud数字化物联网智慧工地综合平台源码 劳务管理、设备管理、绿色施工
42 3
|
1月前
|
传感器 数据采集 监控
基于Springcloud可视化项目:智慧工地可视化大数据云平台源码
终端层,充分利用物联网技术和移动应用提高现场管控能力。通过传感器、摄像头等终端设备,实现对项目建设过程的实时监控、智能感知、数据采集和高效协同,提高作业现场的管理能力。
31 5