zoukankan      html  css  js  c++  java
  • 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上下文进行初始化包括扩集群拷贝、过期剔除等

  • 相关阅读:
    数据结构
    SpringBoot实战
    基于Redis的分布式资源锁
    计算机网络知识
    Dubbo学习使用
    css设置图片适配:显示中间部分(居中显示)
    document.ready和onload的区别
    JS的事件委托(事件代理)
    在vue-cli项目中使用echarts
    addEventListener的第三个参数
  • 原文地址:https://www.cnblogs.com/qsky/p/13834284.html
Copyright © 2011-2022 走看看