Eureka源码解析与配置

    Eureka只要分为2部分,一个server,一个是client(包含生产者和消费者)。

    Eureka client:

    ①从@EnableEurekaClient注解开始看

    ②查看@EnableDiscoveryClient


    ③EnableDiscoveryClient引用了EnableDiscoveryClientImportSelector类,查看该类


    ④看String[] imports = super.selectImports(metadata);这里引用了父类的selectImports方法,这里就不再截图这个方法主要就是引用META-INF/spring.factories文件里的类,这个文件里的类如下所示。


    ⑤可以看出来大部分是配置类,最主要的是EurekaClientAutoConfiguration类,继续追踪,它有2个最重要的方法。

    这两个方法就是eureka client的核心,我们接下来要讲的也就是围绕着这2个方法。第一张图所示的方法是完成注册、续租(心跳)、以及定时拉取注册信息的方法。第二张图是修改实例注册状态的方法。



    ⑥这张图是我从网上盗来的,乍看之下觉得啥玩意,名字还有重复的,其实左边的两个是spring封装过的,右边三个才是netflix的。所以在第⑤步spring用EurekaDiscoveryClient实现Discovery接口,EurekaDiscoveryClient类又引用了EurekaClient,EurekaClient又是由DicoveryClient类实现。十分拗口,总之一句话,真正工作的是右下角的DicoveryClient类,其余的只是对他的封装。

    


    ⑦好,现在开始讲核心类DiscoveryClient。首先它构造函数里会初始化一个任务。

    这个任务有3个作用:

      (1)开启获取服务列表定时任务


      (2)client端向server端续租(心跳)定时任务


      (3)client端向server端注册、状态修改监听器


    ⑧头两个只是开启定时任务没啥好说的,主要第三个比较复杂。这里它引用到了InstanceInfoReplicator(实例信息复制器)类的start和onDemandUpdate方法。


    这两个方法都调用了run方法。这里请各位仔细看一下他的逻辑,我们有时候写定时任务老喜欢用一些花里胡哨的框架,但是其实用j2se最基本的语法就可以实现定时任务。这里它采用ScheduledExecutorService的schedule方法,这个方法是延时启动,只启动一次,然后这里它不断调用自身,达到了定时任务的目的。

    在run方法调用了注册方法。


    registery方法:


    继续往下追踪,可以看到registery方法的底层实现——拼装http请求:


    ⑨在第⑤步我们说了有2个重要的方法,我们说完了第一个。如果你现在把第二个方法关掉(可以通过配置文件或者注解),此时你去看eureka控制台,可以发现实例虽然注册上去了,但是显示的是STRATING状态,并不能调用。这里就是第二个方法的作用,它可以把STARTING变成UP。

  ⑩到这里大家估计有点忘了第⑤步第二个方法了,可以回过头去看看,现在我们继续追踪进去。

该类实现了SmartLifecycle接口,该接口作用是在所有bean实例化完成之后执行start内容。

    ⑪这里有个register方法,点进去看看。我第一次看到,心里在想这不就是修改状态和注册健康检查,实际上注意看我红色标记部分,该方法会触发之前我们在第⑦步第三幅图的监听器。具体我就不截图,因为图太多大家容易晕。就是这里把STARTING转成UP,然后监听器调用onDemandUpdate方法,onDemandUpdate调用run方法,run方法调用register方法,register通过http最终通知eureka server状态修改。


    到此,eureka client的源码分析结束。

Eureka Server:

    server就比较简单,主要就是存储数据和集群同步。


    ①    ApplicationResource类里的addInstance会调用PeerAwareInstanceRegistryImpl的register方法

    ②PeerAwareInstanceRegistryImpl的register方法里有2个重要部分:

       super.register(info, leaseDuration, isReplication)是注册方法;

       replicateToPeers(Action.Register, info.getAppName(), info.getId(), info, null, isReplication)是同步集群方法。


   数据是存贮在concurrenthashmap里:


展开阅读全文

没有更多推荐了,返回首页