前文讲解了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间数据同步采用异步三层队列批处理机制等等。最后,谢谢大家观看。