前言

上篇文章已经介绍了 Eureka Server上下文创建相关的Eureka Client逻辑,这一部分还是比较复杂的。接下来就讲解下Eureka Server上下文初始化最后的部分,然后加上整个Eureka Server启动的总结。

如若转载 请标明来源:一枝花算不算浪漫

initEurekaServerContext

EurekaBootStrap.initEurekaServerContext

protected void initEurekaServerContext() throws Exception {
// 省略之前内容 // 3、处理注册相关的事情 下面是拆解单词加深理解:
// PeerAware:可以识别eureka server集群的。多个同样的东西组成一个集群,peers:集群,peer就是集群中的一个实例
// InstanceRegistry:实例注册,服务实例注册。注册表,这个里面放了所有的主车道这个eureka server上的服务实例,就是一个服务实例的注册表。
// PeerAwareInstanceRegistry:可以感知eureka server集群的服务实例注册表,eureka client(作为服务实例)过来注册的注册表,而且这个注册表是可以感知到eureka
// server集群的,假如有一个eureka server集群的话,这里包含了其他eureka server中的服务实例注册表信息的。
PeerAwareInstanceRegistry registry;
if (isAws(applicationInfoManager.getInfo())) {
registry = new AwsInstanceRegistry(
eurekaServerConfig,
eurekaClient.getEurekaClientConfig(),
serverCodecs,
eurekaClient
);
awsBinder = new AwsBinderDelegate(eurekaServerConfig, eurekaClient.getEurekaClientConfig(), registry, applicationInfoManager);
awsBinder.start();
} else {
// 创建PeerAwareInstanceRegistry。最近取消的实例,最近注册的实例都会保存到registry中
registry = new PeerAwareInstanceRegistryImpl(
eurekaServerConfig,
eurekaClient.getEurekaClientConfig(),
serverCodecs,
eurekaClient
);
} // 4、处理peer节点相关的事情
// peerEurekaNodes 代表了eureka server集群,peers大概来说是多个相同的实例组成的一个集群,peer就是peers中的一个实例
// PeerEurekaNodes,代表的是eureka server集群
PeerEurekaNodes peerEurekaNodes = getPeerEurekaNodes(
registry,
eurekaServerConfig,
eurekaClient.getEurekaClientConfig(),
serverCodecs,
applicationInfoManager
); // 5、完成eureka-server上下文(context)的构建及初始化
serverContext = new DefaultEurekaServerContext(
eurekaServerConfig,
serverCodecs,
registry,
peerEurekaNodes,
applicationInfoManager
); // 将上下文信息放到holder中
EurekaServerContextHolder.initialize(serverContext); // 将eureka server集群启动起来。里面会更新eureka server集群的信息,让当前的eureka server感知到所有的其他eureka server
// 然后搞一个定时调度任务,就是一个后台线程,每隔一段时间,更新eureka server集群的信息
// registry.init: 基于eureka server集群的信息,来初始化注册表,将eureka server集群中所有的eureka
// server的注册表信息抓取过来,放到自己本地的注册表中。都是跟eureka server集群中之间的注册表信息互换有关联的
serverContext.initialize();
logger.info("Initialized server context"); // Copy registry from neighboring eureka node
// 6、处理一些善后的事情,从相邻的eureka节点拷贝注册信息
// registry.syncUp(): 从相邻的一个eureka server节点拷贝注册表信息,如果拷贝失败,就找下一个
int registryCount = registry.syncUp();
registry.openForTraffic(applicationInfoManager, registryCount); // Register all monitoring statistics.
// 7、注册所有的监控统计项
EurekaMonitors.registerAllStats();
}

这里备注比较多,基本上是每个方法 实现的目的,并没有进一步跟踪细节问题,还是之前讲到的,看源码还是要抓大放小,我们尽量先把主流程搞清楚,然后再去一步步攻克细节。

EurekaServer启动流程总结

到这里 eureka server启动的相关代码就看完了,下面有一张流程图来总结一下的:

申明

本文章首发自本人博客:https://www.cnblogs.com/wang-meng 和公众号:壹枝花算不算浪漫,如若转载请标明来源!

感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫

【一起学源码-微服务】Nexflix Eureka 源码四:EurekaServer启动之完成上下文构建及EurekaServer总结的更多相关文章

  1. 【一起学源码-微服务】Eureka+Ribbon+Feign阶段性总结

    前言 想说的话 这里已经梳理完Eureka.Ribbon.Feign三大组件的基本原理了,今天做一个总结,里面会有一个比较详细的调用关系流程图. 说明 原创不易,如若转载 请标明来源! 博客地址:一枝 ...

  2. 【一起学源码-微服务】Ribbon源码五:Ribbon源码解读汇总篇~

    前言 想说的话 [一起学源码-微服务-Ribbon]专栏到这里就已经全部结束了,共更新四篇文章. Ribbon比较小巧,这里是直接 读的spring cloud 内嵌封装的版本,里面的各种config ...

  3. 【一起学源码-微服务】Ribbon 源码三:Ribbon与Eureka整合原理分析

    前言 前情回顾 上一篇讲了Ribbon的初始化过程,从LoadBalancerAutoConfiguration 到RibbonAutoConfiguration 再到RibbonClientConf ...

  4. 【一起学源码-微服务】Feign 源码一:源码初探,通过Demo Debug Feign源码

    前言 前情回顾 上一讲深入的讲解了Ribbon的初始化过程及Ribbon与Eureka的整合代码,与Eureka整合的类就是DiscoveryEnableNIWSServerList,同时在Dynam ...

  5. 【一起学源码-微服务】Feign 源码二:Feign动态代理构造过程

    前言 前情回顾 上一讲主要看了@EnableFeignClients中的registerBeanDefinitions()方法,这里面主要是 将EnableFeignClients注解对应的配置属性注 ...

  6. 【一起学源码-微服务】Ribbon 源码一:Ribbon概念理解及Demo调试

    前言 前情回顾 前面文章已经梳理清楚了Eureka相关的概念及源码,接下来开始研究下Ribbon的实现原理. 我们都知道Ribbon在spring cloud中担当负载均衡的角色, 当两个Eureka ...

  7. 【一起学源码-微服务】Ribbon 源码二:通过Debug找出Ribbon初始化流程及ILoadBalancer原理分析

    前言 前情回顾 上一讲讲了Ribbon的基础知识,通过一个简单的demo看了下Ribbon的负载均衡,我们在RestTemplate上加了@LoadBalanced注解后,就能够自动的负载均衡了. 本 ...

  8. 【一起学源码-微服务】Ribbon 源码四:进一步探究Ribbon的IRule和IPing

    前言 前情回顾 上一讲深入的讲解了Ribbon的初始化过程及Ribbon与Eureka的整合代码,与Eureka整合的类就是DiscoveryEnableNIWSServerList,同时在Dynam ...

  9. 【一起学源码-微服务】Feign 源码三:Feign结合Ribbon实现负载均衡的原理分析

    前言 前情回顾 上一讲我们已经知道了Feign的工作原理其实是在项目启动的时候,通过JDK动态代理为每个FeignClinent生成一个动态代理. 动态代理的数据结构是:ReflectiveFeign ...

随机推荐

  1. HZOJ matrix

    完全没有思路,状压到死没调出来……吐槽一下这题目描述的好不清楚啊好多人都理解错题了…… 题解: 真的挺神仙的,因为有每列最多放1个的限制,所以考虑按列dp,设f[i][j]表示考虑前i列在[1,i]中 ...

  2. JavaWeb项目结构和classpath:

    以tomcat为例 项目结构 开发时的项目结构 蓝框 : 存放java文件 绿框 : 存放配置文件 红框 : 存放前台代码 这个项目结构大家都很熟悉,那么当项目被部署到tomcat中时,项目的结构会发 ...

  3. oracle用WHERE替代ORDER BY

    ORDER BY 子句只在两种严格的条件下使用索引. ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. ORDER BY中所有的列必须定义为非空. WHERE子句使用的索引和 ...

  4. js切割字符串

    var time_str= '2019-9-10 13:18:20'; var t = time_str.substr(2,8);   console.log(t);   输出  19-9-10

  5. mysql-python安装

    操作系统:ubuntu16.04-gnome 首先要安装mysql数据 sudo apt install mysql-server 我们使用pip进行安装第三方模块 系统python版本为2.7.12 ...

  6. linux下C调用lua的第一个程序

    linux下C调用lua的第一个程序 linux的环境是Fedora 18,运行在VM workstation中,以开发模式安装,自带了lua 5.1.4,可以在命令行上直接用lua命令进入到lua环 ...

  7. H3C ACL包过滤的局限性

  8. H3C 配置二层ACL

  9. python3在pycharm中为什么导入random模块不能用? TypeError: 'module' object is not callable

    新手学python求大神指导,也用sys导入了random.py的路径,仍然不行. 刚刚排错貌似找到了问题的原因...那是因为我在pycharm中新建的python文件名就是random,所以当前目录 ...

  10. H3C 环路避免机制三:毒性逆转