• SpringCloud源码分析 (Eureka-Client-服务下架与服务下线) (四)


    在这里插入图片描述

    put请求, 有请求体的为服务下线, 称为服务的平滑下线。请求体为statusvalue
    delete请求没有请求体为服务下架。

    1.服务下架

    在这里插入图片描述

    1.1 shutdown
        /**
         * Shuts down Eureka Client. Also sends a deregistration request to the
         * eureka server.
         */
        @PreDestroy
        @Override
        public synchronized void shutdown() {
            if (isShutdown.compareAndSet(false, true)) {
                logger.info("Shutting down DiscoveryClient ...");
    
                if (statusChangeListener != null && applicationInfoManager != null) {
                    applicationInfoManager.unregisterStatusChangeListener(statusChangeListener.getId());
                }
                
    			// 取消定时任务
                cancelScheduledTasks();
    
                // 未注册情况
                if (applicationInfoManager != null
                        && clientConfig.shouldRegisterWithEureka()
                        && clientConfig.shouldUnregisterOnShutdown()) {
                    applicationInfoManager.setInstanceStatus(InstanceStatus.DOWN);
                    // 未注册情况
                    unregister();
                }
    
                if (eurekaTransport != null) {
                    eurekaTransport.shutdown();
                }
    
                heartbeatStalenessMonitor.shutdown();
                registryStalenessMonitor.shutdown();
    
                logger.info("Completed shut down of DiscoveryClient");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    首先把定时器去掉了, 然后 cancelScheduledTasks, 然后

    1.2 cancelScheduledTasks

    取消定时任务

        private void cancelScheduledTasks() {
        	// 定时更新Client信息给Server
            if (instanceInfoReplicator != null) {
                instanceInfoReplicator.stop();
            }
            // 定时续约, 更新心跳
            if (heartbeatExecutor != null) {
                heartbeatExecutor.shutdownNow();
            }
            // 定时更新客户端注册表
            if (cacheRefreshExecutor != null) {
                cacheRefreshExecutor.shutdownNow();
            }
            if (scheduler != null) {
                scheduler.shutdownNow();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里有定时更新Client信息给Server, 定时续约, 定时更新客户端注册表, 定时器, 和两个任务都取消了

    1.3 unregister

    未注册的情况

        void unregister() {
            // It can be null if shouldRegisterWithEureka == false
            if(eurekaTransport != null && eurekaTransport.registrationClient != null) {
                try {
                    logger.info("Unregistering ...");
                    EurekaHttpResponse<Void> httpResponse = eurekaTransport.registrationClient.cancel(instanceInfo.getAppName(), instanceInfo.getId());
                    logger.info(PREFIX + "{} - deregister  status: {}", appPathIdentifier, httpResponse.getStatusCode());
                } catch (Exception e) {
                    logger.error(PREFIX + "{} - de-registration failed{}", appPathIdentifier, e.getMessage(), e);
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    1.4 发送delete请求

    cancal() -> delete()
    在这里插入图片描述

    2.服务下线

    服务下线是调用的是spring-cloud-commons包中的ServiceRegistryAutoConfiguration

    在这里插入图片描述

    在这里插入图片描述

    Status 为 UP或OUT_OF_SERVICE

    2.1 入口

    在这里插入图片描述
    spring.factories:
    在这里插入图片描述

    2.2 ServiceRegistryAutoConfiguration

    在这里插入图片描述

    2.3 ServiceRegistryEndPoint

    在这里插入图片描述

    有设置状态和得到状态的到注册中心。

    	@Override
    	public void setStatus(EurekaRegistration registration, String status) {
    		InstanceInfo info = registration.getApplicationInfoManager().getInfo();
    
    		// TODO: howto deal with delete properly?
    		if ("CANCEL_OVERRIDE".equalsIgnoreCase(status)) {
    			registration.getEurekaClient().cancelOverrideStatus(info);
    			return;
    		}
    
    		// TODO: howto deal with status types across discovery systems?
    		InstanceInfo.InstanceStatus newStatus = InstanceInfo.InstanceStatus
    				.toEnum(status);
    		registration.getEurekaClient().setStatus(newStatus, info);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    2.4 方向一

    在这里插入图片描述
    在这里插入图片描述

    CANCEL_OVERRIDE

    Client会通过jersey向server提交delete请求, 用于在Server将InstanceInfo的overrideStatus
    修改为UNKNOWN, 此时Client发送的心跳server不接受, 返回为404。

    在这里插入图片描述

    在这里插入图片描述

    2.5 方向二

    setStatus() -> statusUpdate() -> put()
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    携带ValuelastDirtyTimestamp

    服务下架的话, 如果没有服务发现的功能的话会500

  • 相关阅读:
    Android 13.0 系统设置 app详情页默认关闭流量数据的开关
    详解JVM类加载
    前端工程师的摸鱼日常(17)
    做了这么多的请求和响应,你知道都干了些啥吗?
    SpringBoot进阶教程(七十三)整合elasticsearch
    C语言代码封装MQTT协议报文,了解MQTT协议通信过程
    Windows服务启动exe无界面终极解决方案
    Java中的基本数据类型
    Annotation-Based Configuration Configuring Beans for the Container
    快手自研Spark向量化引擎正式发布,性能提升200%
  • 原文地址:https://blog.csdn.net/qq_43141726/article/details/124527548