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

这篇具有很好参考价值的文章主要介绍了【SpringCloud】从实际业务问题出发去分析Eureka-Server端源码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

前段时间遇到了一个业务问题就是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()+"进行注册");
}

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

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

EurekaServer是Netflix开源的服务注册和发现组件,它可以管理和监控集群中各个微服务实例的状态,并提供服务注册、发现和负载均衡的功能。EurekaServer存储了所有可用服务的实例,并根据负载情况将请求转发到不同的实例。
同样地,分析源码前先从整体流程图入手(手图):
【SpringCloud】从实际业务问题出发去分析Eureka-Server端源码,SpringCloud体系,Eureka,eureka,云原生

1.@EnableEurekaServer

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

2.初始化缓存

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

3.jersey应用程序构建

3.1注册jeseryFilter

当上线的微服务要进行注册,他会发送Http注册请求到注册中心中,“不是mvc胜似mvc”但还是存在一点点差异:
服务端的请求入口是基于Jersey(类似mvc的web层框架)的RestFul方式,当服务上线,会发送http注册请求到Eureka-Server中,该请求会被Eureka内部的控制层框架Jesery中的过滤器拦截(和SpringMVC非常相似)过滤所有的注册请求,过滤器的注册发生在自动加载配置类的过程中:
【SpringCloud】从实际业务问题出发去分析Eureka-Server端源码,SpringCloud体系,Eureka,eureka,云原生
JeseryFilter拦截注册请求的行为:
【SpringCloud】从实际业务问题出发去分析Eureka-Server端源码,SpringCloud体系,Eureka,eureka,云原生

3.2构建JerseyApplication

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

4.处理注册请求

注册请求被Jesery拦截,在ApplicationResource类中被处理,就像MVC中的Controller一样在这一层中主要是对Eureka-Client发来的请求做一些校验工作,最后调用实质的注册方法
【SpringCloud】从实际业务问题出发去分析Eureka-Server端源码,SpringCloud体系,Eureka,eureka,云原生
其实这不重要,因为他最终还是去调用了Register()换一个断点:

5.registry()

紧接着就是注册流程registry()开启,开始注册请求的服务实例信息:
【SpringCloud】从实际业务问题出发去分析Eureka-Server端源码,SpringCloud体系,Eureka,eureka,云原生
为什么在register()的最后要去清除特定信息下的缓存,这是为了确保在注册实例后,缓存中的信息是最新的。由于注册实例可能导致缓存中的信息过时,因此需要在注册后进行缓存的重置,以便在下一次访问时能够获取最新的实例信息。文章来源地址https://www.toymoban.com/news/detail-764243.html

到了这里,关于【SpringCloud】从实际业务问题出发去分析Eureka-Server端源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现

    🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 当有两个服务,第一个服务需要远程调用第二个服务,采用的方式是发起一次HTTP请求,在之前的代码中是将服务提供者的ip和端口号硬编码到

    2024年02月07日
    浏览(49)
  • 三、eureka-server端和客户端配置文件讲解

    通过这张图理解为什么要进行文件配置

    2024年02月08日
    浏览(41)
  • 如何从eureka-server上进行服务发现,负载均衡远程调用服务

    在spring cloud的maven的pom文件中添加eureka-client的依赖坐标 添加运行服务的名称以及eureka-server的地址 需要在RestTemplate这个Bean添加一个@LoadBalanced注解,实现负载均衡策略 在调用远程服务的方法处自动注入RestTemplate,用远程调用的对象服务名代替服务IP地址以及端口号,比如当前

    2024年02月04日
    浏览(51)
  • SpringCloud之Eureka原理分析与实战(注册与发现)

    目录 1、从本质理解服务治理思想 2、为什么选择Spring Cloud服务治理组件 3、Spring Cloud Eureka服务发现 3.1 Eureka的优势 3.2 Eureka架构组成 3.3 搭建Eureka Server 实战 3.3.1 添加依赖 3.3.2 开启服务注册 3.3.3 添加YML配置 3.3.4 访问服务 3.4 搭建Eureka Client实战 3.4.1 添加依赖 3.4.2 开启服务注册

    2023年04月15日
    浏览(73)
  • 基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】

    目录 一、前言 二、源码分析 三、负载均衡策略 如下图,我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求,在服务拉取的时候,主机名 localhost 是用服务名 userserver 代替的,那么该 url 是一个可访问的网络地址吗?   我们在浏览器中访问一下这个地址,果然不可用

    2024年02月03日
    浏览(46)
  • 【SpringCloud】Eureka基于Ribbon负载均衡的调用链路流程分析

    微服务间相互调用的基础上,服务间的调用更多是以调用某多实例服务下的某个实例的形式。而这就需要用到负载均衡技术。对于开发者而言,只要通过@LoadBalance注解就开启了负载均衡。如此简单的操作底层究竟是什么样的,我想你也很想知道。 在《SpringCloud集成Eureka并实现

    2024年02月05日
    浏览(37)
  • 解决Eureka与Springcloud的版本匹配问题

    学习Eureka的时候开始就被Springcloud和Eureka的版本匹配问题搞吐了,一直报错 报错如下: 网上大家说这个问题就是Springcloud和Netflix提供的Eureka的版本有冲突导致的 问题是找了半天也没有找到 版本匹配表 ,有个办法是让maven自动匹配两者版本 结果我在dependencyManagement中加入了自

    2023年04月11日
    浏览(50)
  • .Net 6 SignalR 实际业务开发中遇到的问题及解决办法

    1.websocket即时通讯协议 2.Server-Sent Events(SSE)服务器事件 3.longpolling 长轮询。 如果客户端开启协商,会按顺序选择可兼容的协议。(默认开启协议协商) 如果客户端禁用协商,只能websocket协议。 客户端未禁用协商 1.客户端向服务器发http请求,询问服务器支持什么协议。 服务

    2024年02月10日
    浏览(33)
  • 详解SpringCloud微服务技术栈:强推!源码跟踪分析Ribbon负载均衡原理、Eureka服务部署

    👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:认识微服务、服务拆分与远程调用 📚订阅专栏:微服务技术全家桶 希望文章对你们有所帮助 服务提供者:一次业务中,被其它微服务调用的服务(提供接口给

    2024年01月18日
    浏览(43)
  • 【SpringCloud】这一次终于使用MQ解决了Eureka服务下线延迟感知问题

    其实,“ 通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题 ”是一种解,但不是最优解 上一篇文章的标题是: 通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题 当时在文章的末尾就指出,使用Redis+AOP的方式有很多漏洞,只有在服

    2024年01月17日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包