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取消服务注册
目录
相关文章
|
5月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
925 3
|
3月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
10月前
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
|
11月前
|
Cloud Native Java Nacos
springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析
通过本文,我们详细介绍了如何在 Spring Cloud 和 Spring Boot 中集成 Nacos 进行服务注册和配置管理,并对 Nacos 的源码进行了初步分析。Nacos 作为一个强大的服务注册和配置管理平台,为微服务架构提供
4335 14
|
11月前
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
1927 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
10月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
266 0
|
12月前
|
人工智能 安全 Java
AI 时代:从 Spring Cloud Alibaba 到 Spring AI Alibaba
本次分享由阿里云智能集团云原生微服务技术负责人李艳林主讲,主题为“AI时代:从Spring Cloud Alibaba到Spring AI Alibaba”。内容涵盖应用架构演进、AI agent框架发展趋势及Spring AI Alibaba的重磅发布。分享介绍了AI原生架构与传统架构的融合,强调了API优先、事件驱动和AI运维的重要性。同时,详细解析了Spring AI Alibaba的三层抽象设计,包括模型支持、工作流智能体编排及生产可用性构建能力,确保安全合规、高效部署与可观测性。最后,结合实际案例展示了如何利用私域数据优化AI应用,提升业务价值。
1165 4
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
473 7
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
767 5

热门文章

最新文章