依赖
jersey,jersey 框架类似于 spring web mvc。
mocktio,mock 测试框架。
jetty,方便测试,作为 web 容器。
初始化环境 initEurekaEnvironment
- configurationManager 配置管理器,单例模式(double check)
getConfigInstance
- 创建一个 ConcurrentCompositeConfiguration 实例
- 初始化数据中心
- 初始化 eureka 运行的环境,如果你没有配置的话,默认就给你设置为 test 环境。
作业:
- 自己把ConfigurationManager的单例初始化的过程看一下
- 重点理解,ConfigurationnManager源码中体现的double chehck + volatile的单例实现模式的思想和技巧
理解initEurekaEnvironment,初始化环境的逻辑,数据中心 + 运行环境,没设置的话,都给你搞成默认的和测试的
通过配置对象 与 eureka 通过接口管理配置区别
在一个常量类里搞一堆配置的常量,比如说下面:
public class Configs {
public static final String REMOTE_REGION_TOTAL_CONNECTIONS_PER_HOST = “remote.region.total.connections.per.host”;
}
get(Configs.REMOTE_REGION_TOTAL_CONNECTIONS_PER_HOST);
通过这种方式去获取你这个框架配置的各种配置项
这种方式也不错,因为比如说流行的spark源码里面,就是大量的基于这种常量的方式来获取配置属性的
- eureka-server这里,使用了另外一种思想,人家没有用大量的常量,而是针对配置定义了一个接口,接口里通过方法暴露了大量的配置项获取的方法,你呢直接通过这个接口来获取你需要的配置项,即可。
总结: 上面那种适合,经常更新的配置项。下面这种适合,适合不常变化的配置项,而且大量使用这个方法,如果修改配置项,只用修改接口里的常量,不用改方法名,而上面那种常量方式,容易导致导出修改。
初始化配置 initEurekaServerContext
加载eureka-server.properties的过程:
- 创建了一个DefaultEurekaServerConfig对象
- 创建DefaultEurekaServerConfig对象的时候,在里面会有一个init方法
- 先是将eureka-server.properties中的配置加载到了一个Properties对象中,然后将Properties对象中的配置放到ConfigurationManager中去,此时ConfigurationManager中去就有了所有的配置了
- 然后DefaultEurekaServerConfig提供的获取配置项的各个方法,都是通过硬编码的配置项名称,从DynamicPropertyFactory中获取配置项的值,DynamicPropertyFactory是从ConfigurationManager那儿来的,所以也包含了所有配置项的值
- 在获取配置项的时候,如果没有配置,那么就会有默认的值,全部属性都是有默认值的
作业:
顺着上面的思路,创建DefaultEurekaServerConfig对象开始,把上面的思路给捋一遍,自己看一遍源码
重点体会一个东西,eureka-server的配置管理的机制和思想是什么?不是通过一大堆的常量类获取配置项的,提供了一个获取配置的接口,接口里包含大量的方法,每个方法可以获取一个配置,获取配置的方法里对配置的名称进行硬编码了
eureka实例的配置接口说明
- EurekaInstanceConfig 服务实例配置项接口
- InstanceInfo 服务实例的实例本身信息(使用构造器模式使用)
ApplicationInfoManager 对服务实例进行管理
读源码的思路
加载eureka-client.properties文件的配置,对外提供EurekaInstanceConfig接口的逻辑,去看一下,巩固一下基于接口的配置项读取的思路
- 基于构造器模式完成的InstanceInfo(服务实例)的构造的一个过程,精华,闪光点,设计模式是怎么用的,怎么玩儿的
EurekaInstanceConfig(代表了一些配置),搞了InstanceInfo(服务实例),基于这俩玩意儿,搞了一个ApplicationInfoManager,作为服务实例的一个管理器
eureka client 配置接口说明
eurekaClientConfig eureka 客户端的一些配置项
EurekaClient 构造过程
读取EurekaClientConfig,包括TransportConfig
- 保存EurekaInstanceConfig和InstanceInfo
- 处理了是否要注册以及抓取注册表,如果不要的话,释放一些资源
- 支持调度的线程池
- 支持心跳的线程池
- 支持缓存刷新的线程池
- EurekaTransport,支持底层的eureka client跟eureka server进行网络通信的组件,对网络通信组件进行了一些初始化的操作
- 如果要抓取注册表的话,在这里就会去抓取注册表了,但是如果说你配置了不抓取,那么这里就不抓取了
- 初始化调度任务:如果要抓取注册表的话,就会注册一个定时任务,按照你设定的那个抓取的间隔,每隔一定时间(默认是30s),去执行一个CacheRefreshThread,给放那个调度线程池里去了;如果要向eureka server进行注册的话,会搞一个定时任务,每隔一定时间发送心跳,执行一个HeartbeatThread;创建了服务实例副本传播器,将自己作为一个定时任务进行调度;创建了服务实例的状态变更的监听器,如果你配置了监听,那么就会注册监听器
课后的作业,你就把EurekaClient初始化的过程的源码,按照上面的思路,自己仔细去看一遍,但是注意,抓大放小,不要过度纠结于细节,把握大的流程就可以了
PeerAwareInstanceRegistry 初始化集群注册
Eureka Server 多级缓存
ResponseCache接口
先只读缓存,没有,读读写缓存,没有,读注册表。读完将数据放到上级缓存。
Eureka Server 多级缓存失效
主动过期
定时过期
被动过期