首页 > 编程语言 >Eureka 源码之客户端首次获取注册表

Eureka 源码之客户端首次获取注册表

时间:2022-10-20 13:33:34浏览次数:52  
标签:缓存 Eureka 获取 源码 全量 注册 注册表

大家好,我是悟空。

Eureka 注册中心系列文章汇总:

[领导让我研究 Eureka 源码 | 启动过程] [领导“叕”让我研究 Eureka 源码:注册过程] [值得收藏的 Eureka 控制台详解] [原来一个 Map 就能搞定注册表了]

关于我

多年互联网摸爬滚打经验,擅长微服务、分布式、架构设计。目前在一家大型上市公司从事基础架构和性能优化工作。 InfoQ 签约作者、蓝桥签约作者、阿里云专家博主、51CTO 红人。 我的所有文章都汇总到这里了  http://www.passjava.cn

一、前言

注册表对于注册中心尤为重要,所有的功能都是围绕这个注册表展开。比如服务 A 要想访问服务 B,就得知道服务 B 的 IP 地址和端口号吧。如下图所示,传统的方式就是服务 A 知道了服务 B 的地址后,发送 HTTP 请求到对应的 API 地址上。

传统请求方式

那服务 A 和 服务 B 的信息其实就是放在注册中心的注册表里面的,由注册中心统一管理所有服务的注册、下线。服务 A 和 服务 B 想要获取注册信息,统一访问注册中心,拿到注册表,就知道其他服务的 IP 地址 和端口号了。

从注册中心获取注册表

上一讲,我们讲到一个 Eureka Client 成功注册到 Eureka Server 后,Eureka Server 就会把注册表信息存到一个 ConcurrentHashMap 中。

那 Client 怎么获取其他客户注册信息呢?

目录

二、首次获取注册信息

首先我们想一下,服务 B 发送注册请求到注册中心了,那服务 A 就得获取注册表了吧,服务 A 本地一开始肯定是没有注册表信息的,那肯定就得到注册中心把注册表全部拉取一遍了。(这里服务 A 也称作 Eureka 客户端)

服务 A 对于注册中心来说,就是初次见面,服务 A 想把所有注册信息都在自己本地存一份,方便后续的 API 调用。

接下来我们从源码角度分析下客户端怎么获取全量注册表的吧。

客户端发送获取的请求

Client 初始化的时候,就会从 Eureka 注册中心获取全量的注册表:

首次获取注册信息就是用在 DiscoveryClient 初始化的时候获取的。我们可以从源码中找到如下判断:

if (clientConfig.shouldFetchRegistry() && !fetchRegistry(false)) {
            fetchRegistryFromBackup();
        }

这段代码的意思如图所示:

就是先根据是否配置了 shouldFetchRegistry,如果配置了,则会调用 fetchRegistry 方法获取注册表。

因为是新的 client,所以肯定是没有注册信息的,所以已注册的 client 的个数是否等于 0。然后根据几个条件来判断是否需要全量获取注册表,满足其中一个条件就会全量获取:

  • 条件一:是否强制全量获取。传的 false,不需要全量。
  • 条件二:注册表信息是否为空。applications== null,为空,需要全量获取。
  • 条件三:获取已注册的 client 的个数是否等于 0。是的,需要全量获取。

因为满足 已注册的 client 的个数=0,所以需要全量获取

有同学可能有疑问,applications 会不会等于 null 呢?这里之前我也是想当然了,经过 debug 和看源码,这里会 new 出来一个原子类,所以不会出现 applications=null,感谢 Micky 同学的指出。那么问题来了,官方的代码为什么会这样写?

初始化 applications 的代码如下:

AtomicReference<Applications> localRegionApps = new AtomicReference<Applications>();

获取全量注册信息的方法:

getAndStoreFullRegistry()

在这个里面就会发送下面这个 HTTP 请求调用 jersey 的 restful 接口:

getApplications()

然后 Eureka Server 处理这个 http 的请求的类是在这里:ApplicationsResource 类的 getContainers 方法。这个方法里面就会去拿 Server 那边注册表了。

三、Server 端的注册表缓存

Server 端会把注册表放到缓存里面,读取注册表其实是从缓存里面读取出来的。

分为两级缓存,只读缓存 readOnlyCacheMap 和读写缓存 readOnlyCacheMap

如下图所示:

缓存的读取逻辑如下:

  • Jersey Servlet 处理 HTTP 请求。

  • 首先默认会先从只读缓存里面找。

  • 没有的话,再从读写缓存里面找。

  • 找到了的话就更新只读缓存,并返回找到的缓存。

  • 还找不到的话,就返回空。

留几个问题,放到缓存架构那篇再讲:

(1)两级缓存数据怎么来的?

(2)缓存数据如何更新的?

(3)缓存如何过期?

然后,Eureka Client 获取注册表信息后,就会存到本地 localRegionApps 变量中。这样 Client 就会有一份 Server 的注册表信息了。

localRegionApps.set(this.filterAndShuffle(apps));

四、总结

注册表无论是对于 Client 还是 Server 来说,都非常重要:

  • 对于 Server 端来说,为了更好的提供查询注册表的服务,使用了多级缓存来缓存注册表信息。
  • 对于 Client 端来说,首次获取注册表时就会全量抓取注册表,存在自己本地。

后续:第二次见面,怎么获取注册表呢?

标签:缓存,Eureka,获取,源码,全量,注册,注册表
From: https://blog.51cto.com/u_15380918/5776814

相关文章

  • Vue—关于插件(源码级别的插件分析+实践)
    在Vue中提供了use方法来安装插件,那么Vue插件的原理是什么呢?一、Vue.useuse方法官方描述如下图:也就是说Vue.use()方法接收一个函数或者提供install方法的对象作为参数(必......
  • android类加载源码分析
    Dex文件加载过程PathClassLoader和DexClassLoader都可以加载dex和apk文件,其对应的基类都是BaseDexClassLoader。在new一个PathClassLoader/DexClassLoader对象时就会调......
  • vue源码解析
           入口   在runtime经过再次扩展  在core下的index再次被扩展   最后是core的instance里是真正的vue构造函数继续扩展vue实......
  • Linux源码编译——添加新模块
    C源码文件(如new_module.c)添加到适当目录在menuconfig中增加新条目:修改C源码文件所在目录下的Kconfig文件,参考该文件中已有的编译选项照猫画虎,添加新的项configNEW_MOD......
  • weblogic洞若观火第3篇之源码安装weblogic
    引言上一篇文章,主要讲解:集群规划设计、主流的规划方案、企业级的集群规划。在本篇文章中,我们接着介绍:weblogic的源码安装。服务器规划本次搭建使用的虚拟机,相信很多兄弟......
  • Java中Excel的irr函数计算(附源码)
    publicstaticdoubleirr(double[]income){returnirr(income,0.1D);}publicstaticdoubleirr(double[]values,doubleguess){......
  • 视频直播系统源码,简单的移动端轮播图
    视频直播系统源码,简单的移动端轮播图1.页面布局1.1页面框架 <body>  <divclass="box">    <divclass="tupian">      <imgsrc="4.webp"......
  • centos8(linux):通过源码编译安装imagemagick7(ImageMagick 7.1.0-51)
    一,ImageMagick的相关文档:1,官网:https://imagemagick.org/2,下载页https://imagemagick.org/script/download.php#linux如图:说明:刘宏缔的架构森林是一个......
  • vue源码分析-响应式系统工作原理
    上一章,我们讲到了Vue初始化做的一些操作,那么我们这一章来讲一个Vue核心概念响应式系统。我们先来看一下官方对深入响应式系统的解释:当你把一个普通的JavaScript对象传......
  • CentOS/Ubuntu 源码编译安装升级 OpenSSH v8.9
    CentOS/Ubuntu源码编译安装升级OpenSSHv8.9原创 staugur SaintIC 2022-06-2912:22 发表于北京前言由于一次大规模安全演示扫描到一些Linux系统存在很多......