/**
* 1、关闭 EurekaClient,也会发送一个注销的请求到 eureka 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、移除 applicaion 状态改变的监听器(这个监听器在 new DiscoveryClient 的时候添加的)if(statusChangeListener !=null&& applicationInfoManager !=null){
applicationInfoManager.unregisterStatusChangeListener(statusChangeListener.getId());}// 2、取消定时任务cancelScheduledTasks();// 3、这里就是向 eureka server 发送的注销的请求// If APPINFO was registeredif(applicationInfoManager !=null&& clientConfig.shouldRegisterWithEureka()){// 3.1 设置应用管理的状态为 DOWN
applicationInfoManager.setInstanceStatus(InstanceStatus.DOWN);// 3.3 发送注销的网络请求unregister();}// 4、关闭网络组件if(eurekaTransport !=null){
eurekaTransport.shutdown();}// 5、监控服务关闭
heartbeatStalenessMonitor.shutdown();
registryStalenessMonitor.shutdown();
logger.info("Completed shut down of DiscoveryClient");}}
1.2 unregister(向eureka server 发送的注销请求)
/**
* unregister w/ the eureka service.
*/voidunregister(){// It can be null if shouldRegisterWithEureka == falseif(eurekaTransport !=null&& eurekaTransport.registrationClient !=null){try{
logger.info("Unregistering ...");// 调用的是 cancel 方法EurekaHttpResponse<Void> httpResponse = eurekaTransport.registrationClient.cancel(instanceInfo.getAppName(), instanceInfo.getId());
logger.info(PREFIX + appPathIdentifier +" - deregister status: "+ httpResponse.getStatusCode());}catch(Exception e){
logger.error(PREFIX + appPathIdentifier +" - de-registration failed"+ e.getMessage(), e);}}}