SpringCloud注册中心之EurekaServer服务启动源码剖析

经过上一篇文章对注册中心有了大体了解之后,本文将对eurekaServer的源码进行分析。

大家肯定在想一个问题,咱们要看源码应该如何入手呢?可以想一想,咱们的eurekaServer项目都做了啥?

1、导入eureka服务端的坐标

2、添加@EnableEurekaServer注解到启动类上

这时候大家肯定就和我一样想去看看EnableEurekaServer里面都做了啥,接下来我们就来看看这个类做了啥

接下来我们看一下org.springframework.cloud.netflix.eureka.server.EnableEurekaServer注解里面都做了啥

 

 

 

 

我们可以看到这里面主要就是引入了org.springframework.cloud.netflix.eureka.server.EurekaServerMarkerConfiguration类,其他的啥也没做那么我们接下来看看org.springframework.cloud.netflix.eureka.server.EurekaServerMarkerConfiguration这个类里面又做了啥

 

 

 可以看到这里啥也没做,就直接注入了一个marker,而这个marker里面啥也没有。这就奇怪了,eureka是从哪里做事情的呢?咱们把目光回到第二张图里面的注释里面去,也就是回到org.springframework.cloud.netflix.eureka.server.EnableEurekaServer类中看看类的注释

 

 

 哦,好像知道了点什么,他是说org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration这个类是自动配置eurekaServer的类。其实咱们不看这个注释,仔细想想springboot自动装配bean的规则咱们也可以去看看他的老巢里面有没有配置相关的工厂信息。

 

 

 嗯,这里配置的类不就是作者注释中写的那个类吗?接下来我们就看看这个类里都做了啥

我们来到org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration类中

 来到这个类中我们从类声明头部分就能发现一些信息,接下来我们就把重点发到途中标红的数字对应的地方

一、EurekaServerAutoConfiguration本身的信息

那这个类都做了啥呢?接下来我们来看看

首先判断eureka.dashboard.enabled的配置是否为true,如果为true将开启eureka的仪表盘,也就是管理后台,方便查看server、注册中心的一些基本信息

接下来注入了一个对等节点注册器com.netflix.eureka.registry.PeerAwareInstanceRegistry,这个是集群模式下服务注册需要用到的注册器。我们都知道,在集群模式下eureka的server节点都是对等的,没有主从之分

 

回到EurekaServerAutoConfiguration,接下来又注入了一个com.netflix.eureka.cluster.PeerEurekaNodes这里面主要是存放server集群中的对等节点相关的操作

 

 

 

 

 

 

 

 这里面主要就是对对等节点的存储以及刷新

 回到EurekaServerAutoConfiguration,接下来又注入了eureka上下文com.netflix.eureka.EurekaServerContext

 

 

 接下来我们看看这个context里面又做了些啥

 

 

 可以看到在bean初始化完了之后会调用刚刚我们看到的com.netflix.eureka.cluster.PeerEurekaNodes#start方法进行对等节点的更新以及定时任务启动,然后在调用注册器的com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#init方法,这个方法里主要就是定期(默认60s)清理到时间还没(默认90s)发送心跳的服务列表

 

 

 回到EurekaServerAutoConfiguration,接下来就注入org.springframework.cloud.netflix.eureka.server.EurekaServerBootstrap

 接下来再注入一些与Jersey(类似springmvc,web层框架)相关的信息,目的是为了对外提供一些rest接口比如:注册、心跳、获取服务列表等接口

 到这里EurekaServerAutoConfiguration做的事情基本就完了,接下来我们看一下org.springframework.cloud.netflix.eureka.server.EurekaServerMarkerConfiguration.Marker里面又做了啥

 

二、org.springframework.cloud.netflix.eureka.server.EurekaServerMarkerConfiguration里面的信息

 从上图我们可以看到这里其实就是注入了一个marker,啥也没做,但是我们充作者注释汇总可以看出这个类的作用就是为了激活EurekaServerAutoConfiguration生效的而这个地方正是我们点org.springframework.cloud.netflix.eureka.server.EnableEurekaServer进来看到的类吗?

三、org.springframework.cloud.netflix.eureka.server.EurekaServerInitializerConfiguration里面的内容

 我们可以看到这类实现了org.springframework.context.SmartLifecycle接口,而这个接口的作用就是在spring容器加载和初始化完毕执行一些操作,接下来我们看看他到底需要做些什么

放眼望去,也就只有org.springframework.cloud.netflix.eureka.server.EurekaServerInitializerConfiguration#start方法有点内容,而这个start方法里面主要就做了两件事1、上线文初始化;2、事件发布

 那么我们就来看一下这个上下文初始化方法org.springframework.cloud.netflix.eureka.server.EurekaServerBootstrap#contextInitialized,额,EurekaServerBootstrap是不是很熟悉,这不是刚刚在org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration中注入的对象吗?

  可以看到这里面就做了两件事1、初始化环境信息;2、初始化上线文接下来我们就继续跟踪怎么初始化的

 

 我们重点关注一下上图标红的数字的地方

1、为非使用IOC的对象提供一个获取eureka上下文的接口

 

 2、从对等节点中获取已注册列表同步到自己的注册表中

 

 接下来我们看一下com.netflix.eureka.registry.AbstractInstanceRegistry#register这个方法是怎么注册的

 

 我们可以看到这个注册器其实内不就是一个currentHashMap,而从注释上我们可以知道,这个类就是用作处理客户端所有请求的,包括注册、续约、注销、过期以及状态变更操作。而注册主要就是判断是否存在当前实例如果不存在则创建一个,并更新续约时间

3、接下类我们再看一下com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#openForTraffic方法都做了啥

 

  这里也是主要做两件事1、把服务状态设置为UP;2、调用父类的postInit方法

接下来我们看看父类里面又做了啥

 可以看到这里也做了两件事:1、开启续约定时任务;2、开启过期剔除定时任务

到这里我们的服务端启动流程的源码就基本看完了。是不是感觉不是太乱乱的?我们再来梳理一下吧

总结:

  1、在Eureka服务端加上@EnableEurekaServer注解目的是为了注入Marker

  2、Eureka服务端配置了EurekaServerAutoConfiguration的自动装配信息。而在EurekaServerAutoConfiguration中注入了集群注册中心、集群管理节点、以及eureka上下文信息

  3、对外客户端提供rest api接口(注册、心跳等)

  4、EurekaServerInitializerConfiguration在bean都初始化玩之后对eureka上下文进行初始化包括扩集群拷贝、过期剔除等

 

posted @ 2020-10-18 11:38  十块腹肌的SuperMan  阅读(634)  评论(0编辑  收藏  举报