依赖

jersey,jersey 框架类似于 spring web mvc。
mocktio,mock 测试框架。
jetty,方便测试,作为 web 容器。

初始化环境 initEurekaEnvironment

  1. configurationManager 配置管理器,单例模式(double check)

getConfigInstance

  1. 创建一个 ConcurrentCompositeConfiguration 实例
  2. 初始化数据中心
  3. 初始化 eureka 运行的环境,如果你没有配置的话,默认就给你设置为 test 环境。

作业:

  1. 自己把ConfigurationManager的单例初始化的过程看一下
  2. 重点理解,ConfigurationnManager源码中体现的double chehck + volatile的单例实现模式的思想和技巧
  3. 理解initEurekaEnvironment,初始化环境的逻辑,数据中心 + 运行环境,没设置的话,都给你搞成默认的和测试的

    通过配置对象 与 eureka 通过接口管理配置区别

  4. 在一个常量类里搞一堆配置的常量,比如说下面:

    1. public class Configs {
    2. public static final String REMOTE_REGION_TOTAL_CONNECTIONS_PER_HOST = remote.region.total.connections.per.host”;
    3. }
    4. get(Configs.REMOTE_REGION_TOTAL_CONNECTIONS_PER_HOST);

通过这种方式去获取你这个框架配置的各种配置项
这种方式也不错,因为比如说流行的spark源码里面,就是大量的基于这种常量的方式来获取配置属性的

  1. eureka-server这里,使用了另外一种思想,人家没有用大量的常量,而是针对配置定义了一个接口,接口里通过方法暴露了大量的配置项获取的方法,你呢直接通过这个接口来获取你需要的配置项,即可。

总结: 上面那种适合,经常更新的配置项。下面这种适合,适合不常变化的配置项,而且大量使用这个方法,如果修改配置项,只用修改接口里的常量,不用改方法名,而上面那种常量方式,容易导致导出修改。

初始化配置 initEurekaServerContext

加载eureka-server.properties的过程:

  1. 创建了一个DefaultEurekaServerConfig对象
  2. 创建DefaultEurekaServerConfig对象的时候,在里面会有一个init方法
  3. 先是将eureka-server.properties中的配置加载到了一个Properties对象中,然后将Properties对象中的配置放到ConfigurationManager中去,此时ConfigurationManager中去就有了所有的配置了
  4. 然后DefaultEurekaServerConfig提供的获取配置项的各个方法,都是通过硬编码的配置项名称,从DynamicPropertyFactory中获取配置项的值,DynamicPropertyFactory是从ConfigurationManager那儿来的,所以也包含了所有配置项的值
  5. 在获取配置项的时候,如果没有配置,那么就会有默认的值,全部属性都是有默认值的

作业:
顺着上面的思路,创建DefaultEurekaServerConfig对象开始,把上面的思路给捋一遍,自己看一遍源码

重点体会一个东西,eureka-server的配置管理的机制和思想是什么?不是通过一大堆的常量类获取配置项的,提供了一个获取配置的接口,接口里包含大量的方法,每个方法可以获取一个配置,获取配置的方法里对配置的名称进行硬编码了

eureka实例的配置接口说明

  1. EurekaInstanceConfig 服务实例配置项接口
  2. InstanceInfo 服务实例的实例本身信息(使用构造器模式使用)
  3. ApplicationInfoManager 对服务实例进行管理

    读源码的思路

  4. 加载eureka-client.properties文件的配置,对外提供EurekaInstanceConfig接口的逻辑,去看一下,巩固一下基于接口的配置项读取的思路

  5. 基于构造器模式完成的InstanceInfo(服务实例)的构造的一个过程,精华,闪光点,设计模式是怎么用的,怎么玩儿的
  6. EurekaInstanceConfig(代表了一些配置),搞了InstanceInfo(服务实例),基于这俩玩意儿,搞了一个ApplicationInfoManager,作为服务实例的一个管理器

    eureka client 配置接口说明

  7. eurekaClientConfig eureka 客户端的一些配置项

    EurekaClient 构造过程

  8. 读取EurekaClientConfig,包括TransportConfig

  9. 保存EurekaInstanceConfig和InstanceInfo
  10. 处理了是否要注册以及抓取注册表,如果不要的话,释放一些资源
  11. 支持调度的线程池
  12. 支持心跳的线程池
  13. 支持缓存刷新的线程池
  14. EurekaTransport,支持底层的eureka client跟eureka server进行网络通信的组件,对网络通信组件进行了一些初始化的操作
  15. 如果要抓取注册表的话,在这里就会去抓取注册表了,但是如果说你配置了不抓取,那么这里就不抓取了
  16. 初始化调度任务:如果要抓取注册表的话,就会注册一个定时任务,按照你设定的那个抓取的间隔,每隔一定时间(默认是30s),去执行一个CacheRefreshThread,给放那个调度线程池里去了;如果要向eureka server进行注册的话,会搞一个定时任务,每隔一定时间发送心跳,执行一个HeartbeatThread;创建了服务实例副本传播器,将自己作为一个定时任务进行调度;创建了服务实例的状态变更的监听器,如果你配置了监听,那么就会注册监听器

课后的作业,你就把EurekaClient初始化的过程的源码,按照上面的思路,自己仔细去看一遍,但是注意,抓大放小,不要过度纠结于细节,把握大的流程就可以了

PeerAwareInstanceRegistry 初始化集群注册

Eureka Server 多级缓存

ResponseCache接口
先只读缓存,没有,读读写缓存,没有,读注册表。读完将数据放到上级缓存。

Eureka Server 多级缓存失效

主动过期
定时过期
被动过期