eureka源码

功能快捷键

eureka服务端

EurekaServerAutoConfiguration自动配置类,注册各种bean,包括PeerAwareInstanceRegistry用于服务注册(实际就是父类AbstractInstanceRegistry提供的ConcurrentHashMap(ConcurrentHashMap<String, Map<String, Lease>> )存放存放eureka服务端:服务注册列表:registry)、以及jersey。

这里扫描获取所有@Path注解的类

ApplicationResource提供注册接口addInstance

接收服务注册请求,将InstanceInfo服务信息调用PeerAwareInstanceRegistry.register将其信息组装后放入名叫registry(实际就是父类AbstractInstanceRegistry提供的ConcurrentHashMap存放服务注册列表:registry))的一个ConcurrentHashMap中,这样就完成了服务注册操作。

【ConcurrentHashMap<String, Map<String, Lease>> 】,具体存放信息结构如下:

        "实例的唯一ID": { // 实例标识符
                    "lease": { // 持有实例信息
                                    "instanceInfo": { // 实例信息
                                                        "appName": "客户端服务", 
                                                         "instanceId": "实例的唯一ID", 
                                                         ipAddr": "IP地址", 
                                                         port": "调用端口" 
                                                          }            
                                          }       
                                   }   
  }}

ApplicationsResource提供服务列表获取getContainers

接收服务列表获取访问,调用ResponseCacheImpl.getGZIP其实际就是通过readWriteCacheMap(LoadingCache<Key, Value>)中获取到信息,而这这个readWriteCacheMap信息是在实例化ResponseCacheImpl时进行初始化数据的,初始化是真正调用到的是ResponseCacheImpl.generatePayload进行readWriteCacheMap赋值,而这里就是从AbstractInstanceRegistry的registry.entrySet()获取所有服务信息将其进行处理返回。

服务端通过客户端发送的心跳进行服务的续约(续约时间固定),当超过续约时间未收到客户端心跳则会进行剔除操作,当然服务端下线时也会主动触发请求服务端进行服务剔除,服务续约请求:InstanceResource.renewLease()进行服务时间的刷新;

主动触发剔除请求:InstanceResource.cancelLease()调用的是AbstractInstanceRegistry.internalCancel()进行服务删除;
定时查看对比各服务的续约时间是否超期,是则发起剔除操作:AbstractInstanceRegistry.evict()查询服务是否过期,过期的调用AbstractInstanceRegistry.internalCancel()进行服务删除

eureka客户端

服务注册和客户端调用时使用:向eureka注册服务和拉取服务列表

1. 调用eureka服务端接口进行服务列表获取

EurekaClientAutoConfiguration 自动配置加载bean CloudEurekaClient (这里会通过jersey进行调用eureka服务端接口(ApplicationsResource.getContainers)

请求拿到所有注册的客户端服务)定时刷新服务:DiscoveryClient【CloudEurekaClient的父类】初始化的时候会调用initScheduledTasks启动一个延迟任务默认30秒后执行的一个TimedSupervisorTask单任务(该任务又启动一个每延迟30秒【同前面的30秒】重新复调用TimedSupervisorTask)之后每间隔30秒执行任务,实际调用进程DiscoveryClient.CacheRefreshThread的refreshRegistry方法进行服务的刷新。

放入服务列表缓存DiscoveryClient.localRegionApps

2. 调用eureka服务端接口进行服务注册

DiscoveryClient【CloudEurekaClient的父类】初始化的时候会调用DiscoveryClient.register()方法这里将进行发起jersey请求调用服务端接口进行InstanceInfo信息注册。

定时向服务端发送心跳请求进行续约时间刷新:

这里与上面的服务列表更新一样也是构造一个TimedSupervisorTask定时任务,实际调用进程是HeartbeatThread,该进程调用DiscoveryClient.renew()发起jersey请求服务端的接口(InstanceResource.renewLease())进行服务的续约然后也刷新DiscoveryClient.lastSuccessfulHeartbeatTimestamp时间。当自己下线时触发主动发送剔除服务请求,其实利用@PreDestroy就是当bean注销时进行该方法操作,调用DiscoveryClient.shutdown让所有定时任务停止以及发起jersey请求调用服务端InstanceResource.cancelLease()接口进行主动请求剔除

总结

eureka客户端服务启动时初始化 DiscoveryClient调用register进行向eureka服务端发送注册操作;接着进行调用initScheduledTasks启动各种定时任务,包括:服务列表定时向eureka服务端发送获取服务列表接着放入localRegionApps缓存,以及启动一个心跳任务,定时向eureka服务端发送心跳进行续约操作;当客户端DiscoveryClient注销时进行调用unregister向服务端发送下线剔除

原文出自
https://blog.csdn.net/u011320740/article/details/106340377

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值