EurekaServerAutoConfiguration自动配置类,注册各种bean,包括PeerAwareInstanceRegistry用于服务注册(实际就是父类AbstractInstanceRegistry提供的ConcurrentHashMap(ConcurrentHashMap<String, Map<String, Lease>> )存放存放eureka服务端:服务注册列表:registry)、以及jersey。
这里扫描获取所有@Path注解的类
接收服务注册请求,将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