1.SmartLifecycle
1.写一个类实现SmartLifecycle
2.spring中的处理逻辑
上图得到spring中所有实现了Lifecycle的类bean
上图得到所有的SmartLifecycle的子类循环掉其中的start方法
2.client源码解析
1.入口
1.Marker条件注解
EurekaClientAutoConfiguration会在EurekaDiscoveryClientConfiguration加载完之后再加载
2.客户端注册线程解析
1.提交listener注册请求
创建EurekaClient的bean中的initScheduledTasks方法会提交一个Listener。这个监听器的notice方法会掉服务注册的逻辑
2.监听器中的服务注册逻辑
上面用到了装饰器模式,期间传递实例参数。
其中每个类链都继承了EurekaHttpClientDecorator类,每个类链开始掉父类的regsiter方法,封装一个匿名类来进行下一个链,把这个匿名类传入本类掉execute方法。
execute方法开始处理自己的逻辑,然后构造一个EurekaHttpClientDecorator子类通过匿名类继续掉父类EurekaHttpClientDecorator的register方法。
最终掉post方法把instance当参数传过去访问如下的地址
。3.启动监听器的逻辑
EurekaAutoServiceRegistration
上面通知了所有的监器状态改变了,最终会掉之前提交的注册器开启服务注册
3.客户端心跳检测来服务续约和服务端续约代码
1.客户端心跳检测
CloudEurekaClient父类DiscoveryClient的初始化方法会调用initScheduledTasks方法开启心跳检测
2.服务端服务续约
InstanceResource。上面registry.renew方法检测服务状态,如果检测ok。会把当前服务在注册中心的lastDirtyTime置为当前时间加duringtime
上面会让注册中心的lastDirtyTime和客户端传入的lastDirtyTime进行比较。如果注册中心的较早就抛出NOT_FOUNT错误。
4.客户端服务信息抓取
在开启心跳检测的代码上面是服务信息抓取的定时任务
全量更新访问服务端得到信息
增量如果本地没有对应服务就添加
3.server端启动源码解析
1.入口
上图引入EurekaServerInitializerConfiguration类
2.同步其他节点服务信息和服务剔除
在上述入口EurekaServerInitializerConfiguration中,初始化信息
syncUp同步其他服务节点信息,openForTraffic执行服务剔除定时任务
1.从其他节点拷贝信息
2.服务剔除定时任务
上面定时任务的Task是EvictionTask.周期为60秒
上面会得到所有已经注册过的lease.判断每个lease是否过期。并把过期lease放入expiredLeases集合中
上面对每个过期的lease执行剔除操作
3.客户端来的请求接收入口
FilterRegistrationBean
一旦客户端请求来了,会掉ServelContainer过滤eureka请求并交给对应的映射方法进行处理
4.客户端注册请求过来找到服务端对应方法
客户端注册提交请求后,服务端过滤器拦截请求
上面遍历所有的rules来找到一个合适的rule.
找到的这个HttpMethodRule有个map,每个value对应ApplicationResource的一个方法。
5.服务端变量源码分析
1.eureka.client.register-with-eureka
这个变量要配置为false.表示这个注册中心不需要注册。
如果这个变量为true,并且eureka.client.should-enforce-registration-at-init=true时表示会进行注册,注册失败会抛异常
2.eureka.client.fetch-registry
单节点为false.多节点要配置为true,并配置eureka.client.serviceUrl.defaultZone参数
上图代码会全量或者增量拉取配置中心的代码
5.服务注册核心接口InstanceRegistry解析
1.总览
InstanceRegistry接口继承了LeaseManager和LookupService接口
2.LeaseManager接口
这个接口专门负责服务注册,续约和剔除的操作
3.LookupService接口
LookupService接口主要是找寻已注册服务信息的
6.服务注册客户端处理方法解析
客户端注册发送请求进入对应的映射方法,最后会调用InstanceRegistry的register方法注册
在register方法中把InstanceInfo生成lease
在InstanceRegisty的map变量registy中添加lease