zl程序教程

您现在的位置是:首页 >  后端

当前栏目

图个源码系列 · 一步步注释eureka Server启动的核心初始化

servereureka源码 启动 系列 核心 一步步 注释
2023-06-13 09:15:32 时间

前文讲解了Eureka源码的项目结构,环境初始化以及配置相关的一些源码,本文我们将通过一步步注释,继续分析eureka server在容器启动之后一系列初始化相关的核心源码,本文主要将流程梳理清楚,细节代码将在后面文章中依次讨论。

1、初始化EurekaServerContext

先大概回忆一下,在容器启动之后,先是通过ConfigurationManager组件读取了一些配置,并且读取并初始化了一些环境和数据中心相关的配置信息。

接下来,就是比较很重要的一段初始化流程。入口就是下面的这个关键的一行代码,我们开始今天的源码分析。

顾名思义,初始化eureka server的上线文对象,对于任何系统或者中间件系统来说上下文对象都是最核心、最重要的,一般都会持有大量核心的组件,在系统运转的各个地方都可以随时获取,并且通过上下文获取到自己想要的组件或者一些对象。,这里也不例外。

分析

1.首先读取eureka-server.properties文件,创建了eureka-server配置对象,持有大量的配置属性的DefaultEurekaServerConfig类。

2.创建http通信编解码组件,server与server,client与server之间通信进行通信时,进行请求和响应的编解码处理。

//第一步 初始化eureka-server配置
EurekaServerConfig eurekaServerConfig = new DefaultEurekaServerConfig();
ServerCodecs serverCodecs = new DefaultServerCodecs(eurekaServerConfig);

3.创建并初始化服务实例管理器组件ApplicationInfoManager,传入服务实例配置信息,并且初始化创建了服务实例对象InstanceInfo对象传入。这个组件主要是管理服务实例的一些配置信息,状态,监听实例的状态变化。

applicationInfoManager = new ApplicationInfoManager(
  instanceConfig, 
new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get());

技术亮点InstanceInfo对象的构造使用了构造器模式,我们在源码的学习过程中去发现和学习一些设计比较好的实现。

4.创建持有大量客户端配置的client配置类,eurekaclient实现类DiscoveryClient,这个对象也就是后面进行注册,拉取注册表,心跳等发起者。

EurekaClientConfig eurekaClientConfig = new DefaultEurekaClientConfig();
eurekaClient = new DiscoveryClient(applicationInfoManager, eurekaClientConfig);

5.创建eureka server系统核心中的核心-注册中心表对象,注册表可以感知到所有服务实例的信息,针对客户端的注册,下线,故障,心跳等各种请求,最终,服务实例的变化都会体现到注册表中。

registry = new PeerAwareInstanceRegistryImpl(
eurekaServerConfig,
eurekaClient.getEurekaClientConfig(),
serverCodecs,
eurekaClient
);

6. 创建代表集群节点的对象,其中每一个PeerEurekaNode就代表一个eureka server.这个组件会去维护好整个集群中eureka server节点的生命周期,包括增加机器,减少机器的识别。

PeerEurekaNodes peerEurekaNodes = getPeerEurekaNodes(
registry,
eurekaServerConfig,
eurekaClient.getEurekaClientConfig(),
serverCodecs,
applicationInfoManager
);

7.最后,基于上面几步创建的对象来构建最终的终极boss-上下文对象EurekaServerContext。对上下文对象进行了初始化,这里我们简单说说,一旦初始化回去启动集群server同步的定时任务,还有注册表相关的一些初始化操作。这个我们后面会单独去看。

serverContext = new DefaultEurekaServerContext(
eurekaServerConfig,
serverCodecs,
registry,
peerEurekaNodes,
applicationInfoManager
);
serverContext.initialize();

8.注册表同步,监控注册等操作,这个我们后面看细节的时候讨论。

int registryCount = registry.syncUp();    
registry.openForTraffic(applicationInfoManager, registryCount);
EurekaMonitors.registerAllStats();    

02

总结

今日主要是分析了eureka server启动初始化中上下文对象的创建,对于其中的很多细节代码,核心流程,没有展开,我们后面会一个个单独剖开来讲解,学习eureka源码设计中一些比较好的机制,例如他的注册表缓存机制,他的server间数据同步采用异步三层队列批处理机制等等。最后,谢谢大家观看。