核心类(后面会根据需求讲解各核心类)
1.InstanceRegistry:注册表
2.DiscoverClient:客户端
3.Application:注册的应用,InstanceInfo:注册应用的每个服务节点
4.PeerEurekaNode:每一个注册中心节点
5.EurekaBootStrap:服务端启动类
一.工程结构及核心原理
工程结构

core实现了服务端接受注册服务,拉取注册表,更新,通过心跳维护注册服务的功能(剔除不可用服务)
client实现了向服务端注册,从服务端拉取,更新,定时发送心跳
由于注册中心为了高可用自己也注册,所以注册中心包含了core和client两部分功能
核心原理
1.服务端 维护 注册表 InstanceRegistry
InstanceRegistry持有双层map,保存所有的注册信息,第一个key为appName(服务名),第二个key为每个服务节点的id(可以配置)
![]()
InstanceInfo里保存了服务节点的信息
服务端 保存所有注册中心节点的信息(PeerEurekaNode)
2.客户端 两大核心功能
1)拉取注册表信息,保存到Applications里,Applications有个map保存各个服务的信息
![]()
每个Application里
![]()
2)向服务器注册自己
二.启动流程核心原理
一)客户端启动核心流程
客户端会自动注入EurekaClient
![]()
EurekaClient的实现类DiscoveryClient即客户端核心类
DiscoveryClient是通过构造器注入
![]()
来看这个构造器的核心流程
....省略50行
1.拉取注册表

fetchRegistry即去拉取注册服务
来看fetchRegistry这个方法的核心一行
![]()
getAndStoreFullRegistry核心一行
![]()
这里queryClient需要看实现类AbstractJerseyEurekaHttpClient的源码(这个类是底层的http客户端)
getApplications调用了getApplicationsInternal通过发送http请求,从注册中心拉取到Applications
![]()
拉取到Applications后保存
![]()
2.注册
![]()
![]()
底层通过http服务进行注册
以上完成了客户端启动,再来看下服务端启动
二)服务端端启动核心流程
服务端通过EurekaServerAutoConfiguration注入了所需要的核心类

注入EurekaClient的时候,会走上面客户端的流程,拉取到了其他注册中心节点的信息,并向他们注册
服务端通过EurekaServerInitializerConfiguration的start方法调用EurekaServerBootstrap的contextInitialized方法启动


服务启动后可以接受注册,续约等功能
三)注册及拉取核心流程
服务提供方的注册,续约,取消流程都类似,看一个注册流程
服务消费方看一个拉取流程
服务端是一个servlet应用,通过http接受请求
1.注册流程
1)客户端启动的时候,实例化DiscoveryClient就会注册,服务器状态更新也会重新注册
客户端注册的核心相关实现已经在上面叙述了
2)服务端接受注册,服务端接受注册得Controller层代码在以下目录,核心类是ApplicationResource

我们来看ApplicationResource得addInstance方法

.......省略50行
![]()
注册流程其实就是更新注册表,注册表核心类是InstanceRegistry
层层追踪,最终实现为AbstractInstanceRegistry得register方法
public void register(InstanceInfo registrant, int leaseDuration, boolean isReplication)
我们只看核心代码
先复习一下,指导registry是什么

(1)查询Application得注册信息
Map<String, Lease<InstanceInfo>> gMap = registry.get(registrant.getAppName());
(2)没有就new一个

注:Lease是续约包装类,用的是装饰器模式,续约我们暂时不考虑
(3)从gMap获取之前的InstanceInfo,没有就new一个
(4)把InstanceInfo放入gMap
![]()
(5)失效掉缓存(这里得缓存是之前没讲到得,之后会讲)
![]()
2.拉取流程
1)客户端启动的时候会去主动拉取注册信息,定期还会去拉取,通过http发送请求
2)服务端接受拉取请求,我们看一下ApplicationsResource得getContainers方法

核心方法其实就2行,第一行根据请求生成一个key

第二行,根据key从缓存里获取信息
![]()
至此,eureka的核心流程介绍完毕,在了解核心的主线得基础上在做进一步得扩充,
下篇文章会讲一下这一节最后得缓存得核心实现
本文深入解析Eureka服务注册与发现机制,涵盖核心组件、工程结构、启动流程及注册拉取流程。揭示InstanceRegistry、DiscoverClient等关键类作用,详解服务端与客户端交互原理。
569

被折叠的 条评论
为什么被折叠?



