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

这篇具有很好参考价值的文章主要介绍了从实际业务问题出发去分析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()+"进行注册");
}

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

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

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

1.@EnableEurekaServer

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

2.初始化缓存

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

3.jersey应用程序构建

3.1注册jeseryFilter

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

3.2构建JerseyApplication

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

4.处理注册请求

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

5.registry()

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

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

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

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

相关文章

  • 如何从eureka-server上进行服务发现,负载均衡远程调用服务

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

    2024年02月04日
    浏览(46)
  • 启动eureka-server报错:c.n.d.s.t.d.RedirectingEurekaHttpClient : Request execution error. endpoint=Defau

    目录 报错信息: 原因及解决方式 注意事项: 2024-03-17 19:44:51.664  INFO 19448 --- [           main] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error. endpoint=DefaultEndpoint{ serviceUrl=\\\'http://127.0.0.1:10086/eureka/}, exception=java.net.ConnectException: Connection refused: connect stacktrace=com.sun.jersey.api.

    2024年04月11日
    浏览(29)
  • 从业务层的代码出发,去排查通用框架代码崩溃的问题

    目录 1、问题说明 1.1、Release下崩溃,Debug下很难复现 1.2、用Windbg打开d

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

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

    2024年02月10日
    浏览(28)
  • 简配Eureka Server、Eureka Discovery Client、feign及遇到的问题

    一、Eureka Server 1.1、项目new-module-Spring Initializr,现在jdk仅支持17及以上版本 1.2、注意Spring Boot版本,勾选Eureka Server,点击Create 1.3、配置该模块下的application文件 4、Application类使用 @EnableEurekaServer,否则会报错  Cannot invoke \\\"org.springframework.cloud.netflix.eureka.CloudEurekaClient.getApplica

    2024年04月29日
    浏览(32)
  • 从业务出发,K8S环境自建和非自建整体架构设计比较

    新钛云服已累计为您分享 751 篇技术干货 随着数字化转型的大潮到来,越来越多的企业开始上云,同时也纷纷加入到微服务和K8S队伍中。但在K8S整体环境究竟应该用自建的还是非自建?以及他们需要用到的服务,究竟应该自建还是直接用PAAS服务?这些问题往往会困扰住大家。

    2024年02月09日
    浏览(37)
  • Nacos和Eureka冲突问题原因分析

    检查pom文件中,是不是同时添加了Nacos和Eureka的依赖?如果是,选择一个不必要的去掉即可。比如这次异常,我保留了Nacos,去掉了Eureka。 Spring Boot项目启动时,AutoServiceRegistrationAutoConfiguration类需要注入一个类型为AutoServiceRegistration的bean。但是,在容器中却出现了两个Bean,其

    2024年02月03日
    浏览(38)
  • 数据分析师如何用SQL解决业务问题?

    本文来自问答。 提问:数据分析人员需要掌握sql到什么程度? 请问做一名数据分析人员,在sql方面需要掌握到什么程度呢?会增删改查就可以了吗?还是说关于开发的内容也要会?不同阶段会有不同的要求吗? 正文: 作为专注数据分析结论/项目在业务落地以实现增长的分

    2024年02月14日
    浏览(50)
  • 实际业务中使用策略模式对代码进行重构

    最近在负责公司一个语音的微服务模块优化,这个模块主要的业务是:1.天猫精灵、小度、若琪、小京鱼、小爱同学、思必驰这些第三方音响对我们的用户进行oauth2/JWT授权; 2.这些第三方音响服务调用我们的设备发现接口对公司的设备信息在第三方平台进行一个存储;3.第三

    2024年02月05日
    浏览(31)
  • vue项目中实际构建echarts拓扑关系图业务

    由于现在echarts的利用率增强,需要用到拓扑图的设计,如果单纯针对echarts文档来看,虽然可以利用API详细了解到功能点,但具体的实际运用与开发场景经验案例还是略有欠缺,下面将针对echarts关系拓扑图进行实例讲解。 关系拓扑图,顾名思义,是有具体的关系存在的点,具

    2024年02月13日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包