2023-08-07
原文作者:Ressmix 原文地址:https://www.tpvlog.com/article/239

EurekaServerContext,代表了当前这个Eureka-Server的服务上下文,包含了服务需要的所有东西。可以这么说,整个Eureka-Server的初始化过程,最终的目的其实就是构建这个服务上下文:

    serverContext = new DefaultEurekaServerContext(
        eurekaServerConfig,
        serverCodecs,
        registry,
        peerEurekaNodes,
        applicationInfoManager
    );
    
    // 将EurekaServerContext保存到EurekaServerContextHolder中,方便使用
    EurekaServerContextHolder.initialize(serverContext);
    // 初始化EurekaServerContext
    serverContext.initialize();

通过上述EurekaBootStrap启动流程的代码也可以知道,EurekaServerContext的构造依赖了我们之前讲过的EurekaServerConfig、PeerAwareInstanceRegistry、PeerEurekaNodes、ApplicationInfoManager等。

一、EurekaServerContext

1.1 接口

EurekaServerContext是一个接口,通过方法名,我们可以知道,除了一些get方法获取内部的属性信息外,它的核心部分是initializeshutdown

    public interface EurekaServerContext {
    
        /**
         * 执行初始化上下文
         */
        void initialize() throws Exception;
    
        /**
         * 关闭上下文
         */
        void shutdown() throws Exception;
    
        EurekaServerConfig getServerConfig();
    
        PeerEurekaNodes getPeerEurekaNodes();
    
        ServerCodecs getServerCodecs();
    
        PeerAwareInstanceRegistry getRegistry();
    
        ApplicationInfoManager getApplicationInfoManager();
    }

1.2 实现类

EurekaServerContext的实现类是DefaultEurekaServerContext,它的构造函数纯粹就是设置属性:

    public class DefaultEurekaServerContext implements EurekaServerContext {
        private final EurekaServerConfig serverConfig;
        private final ServerCodecs serverCodecs;
        private final PeerAwareInstanceRegistry registry;
        private final PeerEurekaNodes peerEurekaNodes;
        private final ApplicationInfoManager applicationInfoManager;
    
        @Inject
        public DefaultEurekaServerContext(EurekaServerConfig serverConfig,
                                   ServerCodecs serverCodecs,
                                   PeerAwareInstanceRegistry registry,
                                   PeerEurekaNodes peerEurekaNodes,
                                   ApplicationInfoManager applicationInfoManager) {
            this.serverConfig = serverConfig;
            this.serverCodecs = serverCodecs;
            this.registry = registry;
            this.peerEurekaNodes = peerEurekaNodes;
            this.applicationInfoManager = applicationInfoManager;
        }
    }

二、initialize初始化

我们重点看下EurekaServerContext的初始化方法——initialize,它的内部其实就是调用了PeerEurekaNodes.start()PeerAwareInstanceRegistry.init()进行初始化:

    public void initialize() throws Exception {
        logger.info("Initializing ...");
        // 启动 Eureka-Server 集群节点集合(复制)
        peerEurekaNodes.start();
        // 初始化 应用实例信息的注册表
        registry.init(peerEurekaNodes);
        logger.info("Initialized");
    }
  • PeerEurekaNodes.start():初始化集群节点信息;创建定时任务,自动更新集群节点信息。
  • PeerAwareInstanceRegistry.init():就是开启一些定时调度任务,对集群的实例注册表进行初始化。

三、总结

本章,我对EurekaServerContext进行了介绍,它其实就代表了当前这个Eureka-Server的服务上下文,包含了服务需要的所有东西。EurekaServerContext的初始化其实就内部的PeerEurekaNodesPeerAwareInstanceRegistry的初始化。

阅读全文