SpringCloud源码解读--Eureka注册中心核心源码解读(1)-核心流程

本文深入解析Eureka服务注册与发现机制,涵盖核心组件、工程结构、启动流程及注册拉取流程。揭示InstanceRegistry、DiscoverClient等关键类作用,详解服务端与客户端交互原理。

核心类(后面会根据需求讲解各核心类)

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的核心流程介绍完毕,在了解核心的主线得基础上在做进一步得扩充,

下篇文章会讲一下这一节最后得缓存得核心实现

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值