从实际业务问题出发去分析Eureka-Server端源码

文章目录

    • 前言
    • 1.@EnableEurekaServer
    • 2.初始化缓存
    • 3.jersey应用程序构建
      • 3.1注册jeseryFilter
      • 3.2构建JerseyApplication
    • 4.处理注册请求
    • 5.registry()

前言

前段时间遇到了一个业务问题就是k8s滚动发布Eureka微服务的过程中接口会有很多告警,当时想着应该是Ribbon没有同步到实时的Eureka缓存,导致列表中存在下线服务,于通过Redis手动更新了Ribbon缓存(详细实现可以见上篇文章:通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题)但是那样的方式存在一个弊端即更新缓存的操作并不是“服务下线“这一动作来驱动,而是服务调用方发送请求才会触发(虽然用AOP可以做到无入侵式,不影响业务代码,但却或多或少会影响业务接口耗时)如果不能定位到准确的告警接口,此举会“牵一发而动全身”。基于此我也想过替代方案,比如Eureka-Server端存在两个监听器:

@EventListener
public void listen(EurekaInstanceCanceledEvent event){log.debug(event.getServerId()+"\t"+event.getAppName()+"服务下线");
}
@EventListener
public void listen(EurekaInstanceRegisteredEvent event){InstanceInfo instanceInfo = event.getInstanceInfo();log.debug(instanceInfo.getId()+"\t"+instanceInfo.getAppName()+"进行注册");
}

在这里插入图片描述
可以实时监听Eureka-Client端的注册情况,通过这样一种"服务实时上下线"的事件来驱动,可以完全确保每一次服务上下线都会伴随Ribbon缓存的更新。这样对业务接口就没有了影响,但理想很丰满现实很骨感,在实际中更新的操作不能执行。
当然也引入了MQ让服务调用方模拟消费者,让服务被调用方模拟生产者来效仿监听器的效果去清理缓存同样也是失败了…

所以对于每一个服务Eureka到底采取的是什么样的方式来进行注册,分发,我想借今天这个机会来好好整理一下:

EurekaServer是Netflix开源的服务注册和发现组件,它可以管理和监控集群中各个微服务实例的状态,并提供服务注册、发现和负载均衡的功能。EurekaServer存储了所有可用服务的实例,并根据负载情况将请求转发到不同的实例。
同样地,分析源码前先从整体流程图入手(手图):
在这里插入图片描述

1.@EnableEurekaServer

先从入口开始,由于受到了SpringCoud的整合,通过一个注解@EnableEurekaServer就将进程标志成为了服务注册和发现的组件:
在这里插入图片描述
关键点@Import(EurekaServerMarkerConfiguration.class)将该配置类纳入当前的配置中,使得Eureka服务器能够正常运行并提供相关的服务注册和发现功能,进入到EurekaServerMarkerConfiguration中:
在这里插入图片描述
发现在该类中存在一个象征性的Marker类并且被实例化作为Bean注册到了IOC容器中,这让我联想到了ArrayList之所以能够支持元素的随机访问也是因为实现了一个名为RandomAccess的接口,并且该接口下无声明无实现。可谓是有异曲同工之妙~
在这里插入图片描述
回归正题,注释中写到此Bean用于作为标记来加载一个自动配置类:EurekaServerAutoConfiguration,那为什么当加载该自动配置类之后就可以作为服务注册的中间件呢?在这过程中有着以下一系列动作:

2.初始化缓存

EurekaServerContext
在EurekaServerContext(Eureka-Server上下文)的实现类DefaultEurekaServerContext中存在一个initialize()方法用于进行服务端的初始化工作:
在这里插入图片描述
主要是初始化Eureka-Server各个节点间的一些基础信息,在这之中特别重要的是在init()方法中初始化了Eureka-server端的响应缓存:
在这里插入图片描述
可以看到的是为了在多线程环境下对于变量responseCache安全初始化,方法加上了synchronized来修饰,初始化的方法也比较直接,传入了配置信息与注册请求就完成了缓存初始化,在该类的有参构造中,做了以下动作:
在这里插入图片描述
对Eurek-Server开启debug,在Register()方法入口打上断点,启动一个Eurek-Client服务,立即就触发了注册流程,也就是在Eureka-Server核心的一个类AbstractInstanceRegistry中,也是在这个类中一级缓存registry得到了初始化:
在这里插入图片描述

3.jersey应用程序构建

3.1注册jeseryFilter

当上线的微服务要进行注册,他会发送Http注册请求到注册中心中,“不是mvc胜似mvc”但还是存在一点点差异:
服务端的请求入口是基于Jersey(类似mvc的web层框架)的RestFul方式,当服务上线,会发送http注册请求到Eureka-Server中,该请求会被Eureka内部的控制层框架Jesery中的过滤器拦截(和SpringMVC非常相似)过滤所有的注册请求,过滤器的注册发生在自动加载配置类的过程中:
在这里插入图片描述
JeseryFilter拦截注册请求的行为:
在这里插入图片描述

3.2构建JerseyApplication

当对Eureka-Server中的EurekaServerAutoConfiguration类debug,在该方法中打上断点,他将Eureka服务器所需的资源构建Jersey应用程序对象
在这里插入图片描述
并将返回值作为参数传递到jerseyFilterRegistration()中作为构建Jersey filter的必要条件
在这里插入图片描述
至此Filter构建完成
Eureka所进行的心跳连接,服务剔除,服务注册,自我保护都是通过发送http请求的形式,而这些都会被Jersey的过滤器所拦截随即分发到具体的处理类上(类似于Controller)只不过在Eureka中是被名为Resource的处理类来处理,有了他Eureka-Client发送的注册请求才会被分发处理

4.处理注册请求

注册请求被Jesery拦截,在ApplicationResource类中被处理,就像MVC中的Controller一样在这一层中主要是对Eureka-Client发来的请求做一些校验工作,最后调用实质的注册方法
在这里插入图片描述
其实这不重要,因为他最终还是去调用了Register()换一个断点:

5.registry()

紧接着就是注册流程registry()开启,开始注册请求的服务实例信息:
在这里插入图片描述
为什么在register()的最后要去清除特定信息下的缓存,这是为了确保在注册实例后,缓存中的信息是最新的。由于注册实例可能导致缓存中的信息过时,因此需要在注册后进行缓存的重置,以便在下一次访问时能够获取最新的实例信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/226551.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity地形】使用地形工具创建场景环境-Terrain

如上图Unity的地形工具可以让我们实现创建复杂、丰富的3D室外环境。 我们创建地形很简单,在层级面板中右键-3Dobject-Terrain 就可以创建一个默认的地形模型!这个模型是Unity内置的。 接下来的地形编辑功能全部集中在这个地形的组件上 主要功能如下&…

SpringBoot 项目中常用的注解

每一层对应每个包,包名中应全为小写。 一、Common 层(实体类) 前提:导入 Lombok 依赖 Data:生成 get 和 set 方法以及 toString 方法 Getter:只生成 get 方法,避免对类中的成员变量修改。 …

AVL树(超详解)

文章目录 前言AVL树的概念AVL树的实现定义AVL树insert 单旋左单旋右单旋左单旋代码右单旋代码 双旋左右双旋右左双旋 测试AVL树的性能 前言 AVL树是怎么来的呢? 我们知道搜索二叉树会存在退化问题,退化以后就变成单支或者接近单支。 它的效率就变成O(N)…

Matplotlib找不到Times New Roman的解决方案

问题背景 在使用seaborn或者matplotlib进行论文画图的时候,一般都会用Times New Roman这个字体,但是在Linux系统里,经常会遇到以下的问题: findfont: Font family [Times New Roman] not found. Falling back to DejaVu Sans. 也就是说找不…

零代码也能玩出花:Mugeda在H5设计中的魔法力量

文章目录 一、Mugeda零代码可视化H5设计工具简介二、Mugeda零代码可视化H5设计实战案例1. 注册并登录Mugeda账号2. 选择模板3. 编辑页面内容4. 添加动画效果5. 预览和发布 三、Mugeda零代码可视化H5设计的优势《Mugeda零代码可视化H5设计实战》内容简介作者简介目录前言/序言 随…

【人工智能Ⅰ】实验9:BP神经网络

实验9 BP神经网络 一、实验目的 1:掌握BP神经网络的原理。 2:了解BP神经网络的结构,以及前向传播和反向传播的过程。 3:学会利用BP神经网络建立训练模型,并对模型进行评估。即学习如何调用Sklearn中的BP神经网络。…

基于openGauss5.0.0全密态数据库等值查询小案例

基于openGauss5.0.0全密态数据库等值查询小案例 一、全密态数据库简介二、环境说明三、测试步骤四、使用约束 一、全密态数据库简介 价值体现: 密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传…

【经验分享】日常开发中的故障排查经验分享(一)

目录 简介CPU飙高问题1、使用JVM命令排查CPU飙升100%问题2、使用Arthas的方式定位CPU飙升问题3、Java项目导致CPU飙升的原因有哪些?如何解决? OOM问题(内存溢出)1、如何定位OOM问题?2、OOM问题产生原因 死锁问题的定位…

利用html2Canvas将表格下载为html

给到我的需求是点击按钮时请求后端接口,根据后端返回的数据,生成表格,并将表格的内容直接下载为html,如下图。 平常做的下载都是后端返回二进制流,这次前端做下载那就必须把页面先画出来,因为下载下来的表格在页面上是不显示的&a…

[RoarCTF2019] TankGame

不多说,用dnspy反编译data文件夹中的Assembly-CSharp文件 使用分析器分析一下可疑的FlagText 发现其在WinGame中被调用,跟进WinGame函数 public static void WinGame(){if (!MapManager.winGame && (MapManager.nDestroyNum 4 || MapManager.n…

1.DQL查询数据(超重点)以及distinct(去重)

DQL(Data Query Language:数据查询语言) 1.所有查询操作都用 SELECT 2.无论是简单的查询还是复杂的查询它都能做 3.数据库中最核心的语言,最重要的语句 4.使用频率最高的语句 语法: SELECT 字段1,字段2,……FROM 表 有时候…

Go 泛型之泛型约束

Go 泛型之泛型约束 文章目录 Go 泛型之泛型约束一、引入二、最宽松的约束:any三、支持比较操作的内置约束:comparable四、自定义约束五、类型集合(type set)六、简化版的约束形式七、约束的类型推断八、小结 一、引入 虽然泛型是…

Jenkins Tutorial

什么是Jenkins Jenkins是一个自动化平台,它允许你使用pipelines去部署应用。它也可以自动化其他任务。 BUILDTESTDEPLOYMENT Jenkins 架构 首先,你拥有一个Master Server,它控制pipelines和安排Build到你的Agent上; 其次&…

c++环形缓冲区学习

C环形缓冲区设计与实现:从原理到应用的全方位解析 - 知乎 这里插入一个回调函数的学习: C回调函数详解_c 回调函数-CSDN博客 【C】C回调函数基本用法(详细讲解)_c 回调函数-CSDN博客

手机卡为什么要关闭语音功能?看完这篇文章瞬间就懂了!

今天给大家介绍一种流量卡行业中的奇怪的现象,那么就是我明明办理的是正规的号卡,为什么却给我关闭了语音功能吗? 很多朋友都想办理一张正规的,可以打电话,可以发短信的流量卡,但是在拿到流量卡之后才发现卡…

openmediavault(OMV) (19)云相册(3)mt-photos

简介 MT Photos是一款为Nas用户量身打造的照片管理系统。通过AI技术,自动将您的照片整理、分类,包括但不限于时间、地点、人物、照片类型。可以在任何支持Docker的系统中运行它。详情可查看mtmt.tech官网,mt-photos是付费订阅使用的,也可以一次性付费永久使用,具体使用mt…

web3方向产品调研

每次互联网形态的改变,都会对世界产生很大的影响,上一次对社会产生重大影响的互联网形态(Web2.0)催生了一批改变人类生活和信息交互方式的企业。 目录 概述DAO是什么?为什么我们需要DAO? 金融服务金融桥接及周边服务D…

2023年最值得关注的主要网络犯罪统计数据

在互联网高速发展的当今,网络犯罪的种类和数量日益增长,为了保护自身的利益与安全,了解和关注网络犯罪的最新统计数据很有必要。本文汇总了2023年最值得关注的主要网络犯罪统计数据,以帮助企业了解未来趋势与防范启示,…

java freemarker 动态生成excel文件

好久木有更新啦 抓住2023的小尾巴 浅浅更新一下吧~ 最近做了一个动态生成excel的功能,这里记录下部分功能,主要用到的是freemarker框架,spring就有带,我起的demo载入了一下freemarker的jar包 一、创建模板 首先可以创建一个e…

Unity Shader-真实下雨路面

Unity Shader-真实下雨路面 简介素材1.准备插件Amplify Shader Editor(这里我使用的是1.6.4最新版)2.贴纸和切图d 一、创建一个Shader Surface,实现气泡播放效果二、叠加一次气泡播放效果,使其看起来更多,更无序三、小…