Eureka Server启动过程分析
1.首先,SpringCloud充分利用了SpringBoot的自动装配特点
eureka-server的jar包,发现在META-INF下面的配置文件spring.factories,里面记录了Spring Boot启动的时候会加载EurekaServerAutoConfiguration自动配置类

2.其次,分析EurekaServerAutoConfiguration类的源码,我们发现该类的类头中存在@ConditionalOnBean的注解,如图

他代表的意思是,如果想要装配EurekaServerAutoConfigration,Spring容器中必须要有一个Marker的类的实例。
EurekaServerMarkerConfigration.Marker类:

我们通过Find Usages功能查询,在什么样的情况下,我们会向Spring容器中注入这个Marker对象

我们发现,如果在Spring Cloud启动过程中添加@EnableEurekaServer注解,我们就会向容器中添加这个Marker的实例对象。也就是说,@EnableEurekaServer注解是Spring Cloud自动加载EurekaServerAutoConfiguration的控制开关。
3.再次,我们需要研究加载EurekaServerAutoConfigration类后,会向容器中注入那些Bean,有那些操作

通过structure结构图,我们发现,EurekaServer类有一些自动逸的Codec实现,PeerEurekaNodes的回调接口。但是主要的,与EurekaServer启动相关的Bean有6个:EurekaController、PeerAuareInstanceRegistry、PeerEurekaNodes、EurekaServerContext、EurekaServerBootstrap、FilterRegistationBean。
3.1 EurekaController

注入一个对外的接口——仪表盘/后台界面,EurekaController。可以在配置文件中关闭它,但是默认是开启的状态。eureka.dashboard.enabled=true
3.2 PeerAuareInstanceRegistry 和 PeerEurekaNodes

PeerAwareInstanceRegistry是一个对等节点感知实例注册器(集群模式下注册服务使用到的注册器)。并且值得注意的是,EurekaServer集群模式中各个节点是对等的,没有主从之分。(这一点和Zookeeper不一样,zk通过ZAB协议实现了分布式一致性,但是EurekaServer并没有实现任何分布式算法)
PeerEurekaNodes是用来辅助封装对等节点相关的信息和操作,比如更新集群中的对等节点。
这里我们稍微看下RefreshablePeerEurekaNodes的源码,我们发现它是在继承PeerEurekaNodes的基础上实现了ApplicationListener接口,该接口只定义了一个回调方法,处理事件的回调


实际上,实例化RefreshablePeerEurekaNodes对象还是通过父类的构造方法完成的,这个在代码的200行中有体现。
**3.3 **EurekaServerContext

向容器中注入了EurekaServerContext的对象,具体为DefaultEurekaServerContext。翻阅DefaultEurekaServerContext源码中,我们发现它通过Spring的@PostConstruct注解调用了peerEurekaNodes对象的start()方法

具体在看一下64行调用的peerEurekaNodes.start()方法做了哪些操作

首先,定义了一个线程池Eureka-PeerNodesUpdater——Eureka的更新对等节点线程,最终start方法会开启这个线程,不停调用93行所指向的updatePeerEurekaNodes()方法。
这个updatePeerEurekaNodes()方法会更新对等节点信息,因为EurekaServer节点可能会不断的变化(比如,Eureka集群中某个节点的上下线)
而updatePeerEurekaNodes()方法主要做了什么呢?

其实就是Removing no longer available peer nodes和Adding new peer nodes。
至此,总结一下,EurekaServerContext的实例化过程,会启动更新远程对等节点的线程,不时的刷新远程对等节点的信息。
3.4 EurekaServerBootstrap

注入EurekaServerBootstrap对象,后续的EurekaServer应用的启动要依靠这个对象
3.5 FilterRegistrationBean

在Jersey框架下添加一个拦截器ServletContainer对象,拦截所有的/eureka/的请求,是的Jersey框架开始管理所有的/eureka/的请求
4.分析完EurekaServerAutoConfiguration具体注入哪些事情后,我们在返回EurekaServerAutoConfiguration的类头分析

它利用的Spring的@Import注解,在EurekaServerAutoConfigration注入完所有的Bean后,再次调用了EurekaServerInitializerConfigration对象,装配了它。

由于EurekaServerInitializerConfiguration实现了SmartLifecycle接口,所有Spring容器的Bean创建完成后会回调start()方法。(顺便说一下,EurekaServerInitializerConfiguration类没有显式的无参方法,所以它的初始化会调用默认的无参构造方法,且几乎不会做什么操作)

而start()方法会开启一个后台线程去使用eurekaServerBootstrap对象初始化Context。
4.1 分析eurekaServerBootstrap对象的contextInitialized()方法(在3.4步骤时实例化的)

初始化上下文实际上就是初始化环境变量方法的调用和初始化EurekaServerContext()方法。其中initEurekaEnvironment()方法就是读取配置,如果没有配置则设置成默认配置

再看看initEurekaServerContext()方法

这个方法中大体分为5步,1.注册序列化的转化器;2.对aws的情况进行特殊处理;3.为非IOC容器提供获取serverContext对象接口;4.从其他注册中心复制注册新信息;5.改变EurekaServer的状态,EurekaServer启动完成的标志
这里值得关注的是步骤4,如何复制其他节点的注册信息到本EurekaServer上。
4.2 registry.syncUp()方法

这里224行的register()方法是做把远程获得过来的注册信息注册到自己的注册表中(map中)

register()方法中具体就是在保证线程安全的情况下对registry对象进行操作

综上所述,registry.syncUp()方法就是拷贝其他对等节点的注册信息到自己的注册表map中
4.3 registry.openForTraffic()方法

这里,我们肯定选择Peer的实现,因为Eureka Server的启动一般都是集群模式

openForTraffic()方法里,具体就是设置实例状态为UP,并调用父类的postInit()方法

在com.netflix.eureka.registry.AbstractInstanceRegistry#postInit()方法中,主要是启动失效剔除定时任务的,具体的任务逻辑在EvicationTask中定义。

这里调用了 AbstractInstanceRegistry的evict()方法

这个方法就是根据失效时常剔除失效的服务
综上所属,registry.syncUp()就是开启一个服务失效剔除线程
所以,
Eureka Server启动过程就是在@EnableEurekaServer开关的基础上,创建了一些后台进程去同步注册信息,并发布一个Jersey的web服务。它充分利用了Spring Boot的自动装配功能和spring的一些回调接口实现。
Eureka Server启动过程分析的更多相关文章
- Eureka Server启动过程
前面对Eureka的服务端及客户端的使用均已成功实践,对比Zookeeper注册中心的使用区别还是蛮大的: P:分区容错性(⼀定的要满⾜的)C:数据⼀致性 A:⾼可⽤:CAP不可能同时满⾜三个,要么是 ...
- Spring Cloud Eureka(五):Eureka Server 启动流程分析
启用EurekaServer @SpringBootApplication @EnableEurekaServer public class EurekaApplication { public st ...
- 【SpringCloud Eureka源码】从Eureka Client发起注册请求到Eureka Server处理的整个服务注册过程(下)
目录 一.Spring Cloud Eureka Server自动配置及初始化 @EnableEurekaServer EurekaServerAutoConfiguration - 注册服务自动配置 ...
- springcloud eureka server 检测 eureka client 状态
import com.netflix.discovery.shared.Applications; import com.netflix.eureka.EurekaServerContextHolde ...
- Eureka Server项目启动报错处理
Eureka Server项目启动报错处理 Eureka是一个服务发现组件,提供服务注册.发现等注册中心功能,使用spring boot启动eureka应用时出现报错: 20:36:17.646 [r ...
- SpringCloud升级之路2020.0.x版-20. 启动一个 Eureka Server 集群
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们的业务集群结构 ...
- SpringCloud启动Eureka server时报错 java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present
SpringBoot打开Eureka server时出现以下错误: java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext ...
- 【转载】一起来学Spring Cloud | Eureka Client注册到Eureka Server的秘密
LZ看到这篇文章感觉写得比较详细,理解以后,便转载到自己博客中,留作以后回顾学习用,喝水不忘挖井人,内容来自于李刚的博客:http://www.spring4all.com/article/180 一 ...
- ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]
入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...
随机推荐
- 微服务注册到Nacos的IP私网172.x.x.x网段无法访问的问题
解决方案一 显示声明注册服务实例的外网IP,默认就是使用私网的IP造成无法访问的,配置如下: spring: cloud: nacos: discovery: ip: 101.37.6.8 解决方案二 ...
- Java数据结构(十四)—— 平衡二叉树(AVL树)
平衡二叉树(AVL树) 二叉排序树问题分析 左子树全部为空,从形式上看更像一个单链表 插入速度没有影响 查询速度明显降低 解决方案:平衡二叉树 基本介绍 平衡二叉树也叫二叉搜索树,保证查询效率较高 它 ...
- 老猿学5G:融合计费的Nchf和Nchf‘服务化接口消息Nchf_ConvergedCharging_Create、Update、Release和Notify
☞ ░ 老猿Python博文目录░ 一.引言 在<老猿学5G扫盲贴:中国移动的5G计费架构解读>介绍了5G融合计费的服务化接口包括: CHF提供给CTF使用的Nchf接口 OCF提供给CH ...
- 安卓学习02---room
title: 安卓学习02---room date: 2020-02-02 18:20:13 tags: room是jetpack的组件,可以使程序流畅的访问sqlite. <!--more - ...
- Oracle命令管理账户和权限
方式一.登陆数据库SQL PLUS: 步骤:Oracle - OraDb10g_home1 =>应用程序开发=>SQL PLUS 用户名:system 密码:tiger/admin 退出数 ...
- Flask框架登录日志模块编写
web扫描器网站的框架搭建逐渐进入尾声,边搭建框架的时候负责前端的小姐姐也在完善页面设计,过两天就可以进行功能点的完善了. 在扫描器中我们用到了用户登录模块,想法是初始化一个账户和密码,比如说admi ...
- 【科技】位运算(bitset)优化最长公共子序列算法
最长公共子序列(LCS)问题 你有两个字符串 \(A,B\),字符集为 \(\Sigma\),求 \(A, B\) 的最长公共子序列. 简单动态规划 首先有一个广为人知的 dp:\(f_{i,j}\) ...
- 【题单】最近遇见的 SHIT DP题 三连
Hint: 本题单适合用于自虐和消磨时间. CF-Gym101620E https://codeforces.com/gym/101620 ARC109F https://atcoder.jp/con ...
- AcWing 180. 排书
AStar 最坏情况\(O(log_2560 ^ 4)\) 用\(AStar\)算法做了这题,程序跑了\(408ms\). 相比于\(IDA*\)的\(100ms\)左右要慢上不少. 且\(A*\)由 ...
- POWER BI 基于 ODBC 数据源的配置刷新-以Amazon Redshift为例
POWER BI 基于 ODBC 数据源的配置刷新-以Amazon Redshift为例 Powerbi 有多种数据源连接,可以使用它们连接到不同数据源. 如果在 Power BI Desktop 的 ...