您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

微服务设计必看:深度解析Netflix Eureka的底层实现

时间:2023-10-30 13:38:21  来源:51CTO  作者:

作者 | 波哥

审校 | 重楼

出品 | 51CTO技术栈(微信号:blog51cto)

在微服务架构中,服务发现和注册是确保各个微服务之间通信和协作的核心组件.NETflix Eureka作为一款开源的服务发现和注册工具,在现代分布式系统中扮演着重要角色。本文将从代码层面深入探讨Netflix Eureka的底层实现原理,为读者详细呈现其内部运行机制。

Netflix Eureka由Eureka服务器和Eureka客户端两部分构成。它们协同工作,构建了一个完整的服务发现和注册系统。

一、Eureka服务器

Eureka服务器负责存储和管理所有已注册的服务实例信息,保证服务发现的准确性。Eureka服务器的核心是InstanceRegistry、LeaseManager和SelfPreservationFilter。下面结合代码详细介绍下这几个核心组件。

1.InstanceRegistry(实例注册表)

实例注册表负责存储所有已注册的服务实例信息,包括它们的元数据,如实例ID、主机名、端口等。从代码层面来看,InstanceRegistry是一个包含了实例信息的内存数据结构,通常使用ConcurrentHashMap来存储,当一个新的服务实例注册时,InstanceRegistry 的 register 方法被调用,将该实例信息添加到注册表中;当一个服务实例不再可用,需要从Eureka服务器取消注册时,InstanceRegistry 的 cancel 方法被调用,从注册表中移除该实例信息。具体的功能包括:

注册服务实例:register 方法负责将服务实例注册到注册表。

取消注册服务实例:cancel 方法用于从注册表中移除不再可用的实例。

获取服务实例信息:getInstancesById 方法用于获取特定服务的所有实例信息。

2.LeaseManager(租约管理器)

租约管理器负责管理实例的租约,租约是Eureka服务器中的一个重要概念,用于确保实例的健康状态。在代码层面,LeaseManager维护了一个租约的集合,并提供了操作租约的方法,主要包括:

注册实例并创建租约:register 方法负责为新注册的实例创建租约。

续约租约:renew 方法用于更新租约的到期时间,延长租约的有效期。

移除租约:cancel 方法负责在实例取消注册时移除租约。

在服务实例注册时,LeaseManager 的 register 方法被调用,创建一个新的租约,并将其添加到租约管理器中。在服务实例定期发送心跳续约请求时,LeaseManager 的 renew 方法被调用,更新租约的到期时间,确保租约的有效性。当一个服务实例取消注册时,LeaseManager 的 cancel 方法被调用,从租约管理器中移除相应的租约。

下面是具体方法内容:

微服务设计必看:深度解析Netflix Eureka的底层实现图片

3.SelfPreservationFilter(自我保护过滤器)

自我保护机制是Netflix Eureka服务器(服务端)中的一项重要功能。它旨在确保在网络抖动等异常情况下,Eureka服务器不会过早地剔除正常运行的服务实例,从而保持服务的可用性和稳定性。

当Eureka服务器开启自我保护机制时,它会监测心跳续约失败的实例数量。如果在某个时间段内,心跳续约失败的实例数量超过了预定的阈值,Eureka服务器将进入自我保护模式。在自我保护模式下,Eureka服务器不会剔除任何正常运行的实例,以免影响整个系统的稳定性。这是为了避免在网络抖动等情况下,误判正常实例失效。

需要注意的是,虽然自我保护机制保护了Eureka服务器上的服务注册表,但在自我保护模式下,Eureka服务器将不再从已注册的实例中移除长时间未续约的实例,这可能会导致注册表中存在已经下线或失效的实例。因此,自我保护机制只是应对短期网络问题的临时解决方案,当问题解决后,Eureka服务器会自动退出自我保护模式,重新恢复正常的剔除机制。

在代码层面,SelfPreservationFilter定期计算心跳续约失败的比例,根据配置启动或关闭自我保护模式。SelfPreservationFilter 是一个在后台运行的线程,定期检查注册表中的实例健康状态。它会周期性地计算心跳续约失败的比例,当心跳续约失败比例超过一定阈值时,会启动自我保护模式,以防止错误地移除正常的服务实例。如果心跳续约失败比例降低到一定程度,会关闭自我保护模式。具体功能包括:

  • 统计心跳续约失败比例:calculateThresholdBreachCount 方法统计失败的心跳续约比例。
  • 启动/关闭自我保护模式:disable 和 enable 方法分别用于启动和关闭自我保护模式。

微服务设计必看:深度解析Netflix Eureka的底层实现图片

微服务设计必看:深度解析Netflix Eureka的底层实现图片

二、Eureka客户端

在微服务应用启动时,Eureka客户端将自身的实例信息注册到Eureka服务器,并从服务器获取其他服务实例信息,实现服务的发现和负载均衡。它包括DiscoveryClient(服务发现客户端)、InstanceInfo(实例信息)、EurekaHttpClient(Eureka HTTP客户端)三个核心组件,下面详细介绍每个组件:

1.DiscoveryClient(服务发现客户端)

从Eureka服务器获取服务实例信息,并缓存在本地。它提供了getInstances、getServices等方法,支持负载均衡和服务发现。

微服务设计必看:深度解析Netflix Eureka的底层实现图片

其中getInstances 方法用于在服务调用前获取特定服务的所有实例信息,实现动态的服务发现。getNextServerFromEureka 方法在服务调用时被调用,实现负载均衡逻辑,选择要调用的服务实例;而refreshRegistry 方法定期刷新注册表信息,以确保实例信息的最新性。

2.InstanceInfo(实例信息)

在应用启动时,Eureka客户端创建InstanceInfo对象,包含实例的元数据。它在服务实例启动时创建并初始化,存储了该实例的基本信息,如实例ID、主机名、端口和状态。它通过HTTP请求将元数据注册到Eureka服务器。

微服务设计必看:深度解析Netflix Eureka的底层实现图片

3.EurekaHttpClient(Eureka HTTP客户端)

它用于客户端与Eureka服务器的通信,发送注册、续约、取消注册等HTTP请求,获取注册表信息。

微服务设计必看:深度解析Netflix Eureka的底层实现图片

微服务设计必看:深度解析Netflix Eureka的底层实现图片

其中:

  • register 方法在服务实例启动时调用,向Eureka服务器注册实例信息。
  • renew 方法定期发送心跳续约请求,保持实例的健康状态。
  • cancel 方法在服务实例关闭或取消注册时调用,向Eureka服务器发送取消注册请求。
  • getInstances 方法在服务发现过程中被调用,向Eureka服务器请求特定服务的实例信息。
  • refreshRegistry 方法周期性地刷新注册表信息,以保持信息的准确性。

三、流程梳理

下面笔者大概梳理了下几个主要流程:

1、服务注册流程

  • Eureka客户端创建InstanceInfo对象,包含实例元数据。
  • 客户端通过HTTP请求将InstanceInfo注册到Eureka服务器的InstanceRegistry。
  • LeaseManager创建租约,管理续约周期和到期时间。

2、心跳续约流程

  • Eureka客户端定期发送心跳续约请求,维持租约有效。
  • LeaseManager更新租约到期时间,确保租约不会过期。
  • Eureka服务器根据心跳续约来监测实例的健康状态。

3、服务发现与负载均衡流程

  • Eureka客户端通过DiscoveryClient获取其他服务实例信息。
  • 客户端根据负载均衡策略选择一个实例。
  • 客户端发起HTTP请求,实现服务调用和负载均衡。

四、实例演示

现在,让我们通过实际演示来了解如何使用Eureka服务端和客户端。

1、Eureka服务端演示:

创建Eureka Server:首先,创建一个Spring Boot项目,并添加Eureka Server依赖。

配置文件:在Application.yml中,进行基本的配置,如端口和Eureka Server配置。

微服务设计必看:深度解析Netflix Eureka的底层实现图片

启动类:创建启动类,并添加@EnableEurekaServer注解。

微服务设计必看:深度解析Netflix Eureka的底层实现图片

运行应用:启动Eureka Server应用,访问http://localhost:8761,将看到Eureka的控制台。

2、Eureka客户端演示:

  • 创建Eureka Client:创建另一个Spring Boot项目,并添加Eureka Client依赖。
  • 配置文件:在application.yml中,配置Eureka Client信息。

微服务设计必看:深度解析Netflix Eureka的底层实现图片

创建Controller:创建一个简单的Controller用于演示服务调用。

微服务设计必看:深度解析Netflix Eureka的底层实现图片

启动类:创建启动类,并添加@EnableDiscoveryClient注解。

微服务设计必看:深度解析Netflix Eureka的底层实现图片

  • 运行应用:启动Eureka Client应用,访问http://localhost:8761,将看到Eureka的控制台,显示有一个已注册的客户端。
  • 服务调用:在浏览器中访问http://localhost:8080/hello,将会调用Eureka Client的Controller方法,并得到响应。

Netflix Eureka在微服务架构中扮演着重要角色,支持服务发现和注册。Eureka的底层实现涵盖了服务注册、心跳续约、自我保护机制、服务发现和负载均衡等关键功能。通过深入代码层面的分析,我们可以更清晰地理解这些功能是如何在底层实现的。 

作者介绍:

波哥,互联行业从业10余年,先后担任项目总监及架构师。目前专攻技术,喜欢研究技术原理。技术全面,主攻JAVA,精通JVM底层机制及Spring全家桶底层框架原理,熟练掌握当前主流的中间件、服务网格等技术原理。



Tags:微服务   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  Search: 微服务  点击:(4)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  Search: 微服务  点击:(114)  评论:(0)  加入收藏
九条微服务最佳实践,你学会了哪条?
微服务之间连贯一致的代码库对于可维护性至关重要。保持代码成熟度相似,可确保系统统一演进,防止服务间出现性能、安全性和功能差异。在开发微服务时,我们需要遵循哪些最佳实践...【详细内容】
2024-01-05  Search: 微服务  点击:(97)  评论:(0)  加入收藏
Go微服务入门到容器化实践
Go微服务入门到容器化实践Go 是一门高效、现代化、快速增长的编程语言,非常适合构建 Web 应用程序。而 Docker 是一种轻量级的容器化技术,能够使得您的应用程序在任何地方运行...【详细内容】
2024-01-01  Search: 微服务  点击:(61)  评论:(0)  加入收藏
微服务全做错了!谷歌提出新方法,成本直接降为1/9!
2023,微服务“水逆”之年。长期以来,不管大厂还是小厂,微服务都被认为是云原生服务应用程序架构的事实标准,然而2023,不止那位37signals的DHH决心下云,放弃微服务,就连亚马逊和谷歌...【详细内容】
2023-12-29  Search: 微服务  点击:(117)  评论:(0)  加入收藏
微服务架构中的数据一致性
在微服务中,一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案,如果其中一个分布式流程参...【详细内容】
2023-12-27  Search: 微服务  点击:(141)  评论:(0)  加入收藏
监控 Spring Cloud 微服务的实践方案
一、简介Spring Cloud是一个基于Spring Boot实现的微服务框架,它提供了丰富的微服务功能,如分布式配置、服务注册与发现、服务熔断、负载均衡等。为了更好地管理和监控这样复...【详细内容】
2023-12-19  Search: 微服务  点击:(141)  评论:(0)  加入收藏
聊聊微服务链路服务
微服务架构图片如果有用户反馈某个页面很慢,我们知道这个页面的请求调用链是 A -----> C -----> B -----> D(图片有误),怎么来定位是由哪个服务引起的问题呢? 更进一步,如果...【详细内容】
2023-12-15  Search: 微服务  点击:(123)  评论:(0)  加入收藏
选择适合微服务的编程语言,让你的工作事半功倍!
讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而,编程语言应该被看作是它们真正是的东西,即一种工作工具。每种编程语言都有特定的目的...【详细内容】
2023-12-14  Search: 微服务  点击:(177)  评论:(0)  加入收藏
Eureka: 微服务架构中不可或缺的服务治理工具
Eureka是Netflix开源的一款用于服务治理的工具,它是NetflixOSS(OpenSourceSoftware)项目的一部分,主要用于实现微服务架构中的服务注册与发现。在当今庞大而复杂的微服务系统中,E...【详细内容】
2023-12-14  Search: 微服务  点击:(191)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(4)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(5)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(8)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(114)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条