eureka理论总结

Eureka是Netflix的子模块,用作服务发现框架,尤其在微服务架构中起到关键作用。它与Zookeeper的主要区别在于Eureka保证了可用性而非一致性,通过自我保护模式防止网络异常时误删服务。Eureka客户端包括服务注册、心跳续约、服务下线等功能,而服务端负责存储服务信息、处理心跳和剔除无效服务。服务治理机制包括心跳检测和自我保护模式,确保系统稳定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Eureka是什么

Eureka例子

为什么要有Eureka 

eureka与zookeeper的区别

Eureka基础

Eureka的基础组件

server与client的功能

Eureka基本架构与流程

Eureka的治理机制

 Eureka Client工作流程

Eureka Server工作流程 

自我保护模式

Eureka服务注册表的缓存机制

心跳与故障检测

Eureka集群与架构图

Eureka 部分源码浅析


注意:本文参考  

外行人都能看懂的SpringCloud,错过了血亏!

20000 字的 Spring Cloud 总结,从此任何问题也难不住你

docs/system-design/framework/springcloud/springcloud-intro.md · SnailClimb/JavaGuide - Gitee.com

深入浅出 Spring Cloud 之 Eureka - 掘金

Eureka是什么

Eureka是Netflix的一个子模块,也是核心模块之一。

Eureka是基于REST(代表性状态转移)的服务,主要在 AWS 云中用于定位服务,以实现负载均衡和中间层服务器的故障转移。我们称此服务为Eureka服务器。

Eureka 还带有一个基于 Java 的客户端组件 Eureka Client,它使与服务的交互变得更加容易。客户端还具有一个内置的负载平衡器,可以执行基本的循环负载平衡。

在 Netflix,更复杂的负载均衡器将 Eureka 包装起来,以基于流量,资源使用,错误条件等多种因素提供加权负载均衡,以提供出色的弹性。

服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper。

总的来说,Eureka 就是一个服务发现框架。何为服务,何又为发现呢?

Eureka的使用  《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka 的使用 - 知乎

Eureka的参数配置  微服务架构:Eureka参数配置项详解 - 风中程序猿 - 博客园

Eureka例子

举一个生活中的例子,就比如我们平时租房子找中介的事情。

在没有中介的时候我们需要一个一个去寻找是否有房屋要出租的房东,这显然会非常的费力,一你找凭一个人的能力是找不到很多房源供你选择,再者你也懒得这么找下去(找了这么久,没有合适的只能将就)。这里的我们就相当于微服务中的 Consumer ,而那些房东就相当于微服务中的 Provider 。消费者 Consumer 需要调用提供者 Provider 提供的一些服务,就像我们现在需要租他们的房子一样。

但是如果只是租客和房东之间进行寻找的话,他们的效率是很低的,房东找不到租客赚不到钱,租客找不到房东住不了房。所以,后来房东肯定就想到了广播自己的房源信息(比如在街边贴贴小广告),这样对于房东来说已经完成他的任务(将房源公布出去),但是有两个问题就出现了。第一、其他不是租客的都能收到这种租房消息,这在现实世界没什么,但是在计算机的世界中就会出现 资源消耗 的问题了。第二、租客这样还是很难找到你,试想一下我需要租房,我还需要东一个西一个地去找街边小广告,麻不麻烦?

那怎么办呢?我们当然不会那么傻乎乎的,第一时间就是去找 中介 呀,它为我们提供了统一房源的地方,我们消费者只需要跑到它那里去找就行了。而对于房东来说,他们也只需要把房源在中介那里发布就行了。

但是,这个时候还会出现一些问题。

房东注册之后如果不想卖房子了怎么办?我们是不是需要让房东 定期续约 ?如果房东不进行续约是不是要将他们从中介那里的注册列表中 移除 。

租客是不是也要进行 注册 呢?不然合同乙方怎么来呢?

中介可不可以做 连锁店 呢?如果这一个店因为某些不可抗力因素而无法使用,那么我们是否可以换一个连锁店呢?

针对上面的问题我们来重新构建一下上面的模式图

 

为什么要有Eureka 

子系统与子系统之间不是在同一个环境下,那就需要远程调用。远程调用可能就会想到httpClient,WebService等等这些技术来实现。

既然是远程调用,就必须知道ip地址,我们可能有以下的场景。

功能实现一:A服务需要调用B服务

在A服务的代码里面调用B服务,显式通过IP地址调用:`http://123.123.123.123:8888/java3y/3`

功能实现二:A服务调用B服务,B服务调用C服务,C服务调用D服务

在A服务的代码里面调用B服务,显式通过IP地址调用:`http://123.123.123.123:8888/java3y/3`,(同样地)B->C,C->D

功能实现三:D服务调用B服务,B服务调用C服务

在D服务的代码里面调用B服务,显式通过IP地址调用:`http://123.123.123.123:8888/java3y/3`,(同样地)B->C

…..等等等等

万一,我们B服务的IP地址变了,想想会出现什么问题:A服务,D服务(等等)需要手动更新B服务的地址

在服务多的情况下,手动来维护这些静态配置就是噩梦!

由Eureka来维护这些服务的ip,并且提供给消费者!

eureka与zookeeper的区别

Zookeeper保证CP

当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。

Eureka保证AP

Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况: 

1. Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务 
2. Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用) 
3. 当网络稳定时,当前实例新的注册信息会被同步到其它节点中

因此, Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。

Eureka作为单纯的服务注册中心来说要比zookeeper更加“专业”,因为注册服务更重要的是可用性,我们可以接受短期内达不到一致性的状况。

Eureka基础

Eureka的基础组件

服务发现:其实就是一个“中介”,整个过程中有三个角色:服务提供者(出租房子的)、服务消费者(租客)、服务中介(房屋中介)

服务提供者:Service Provider, 服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到

服务消费者:Service Consumer, 服务消费方从Eureka获取注册服务列表,从而能够消费服务

服务中介

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值