Eureka是Netflix开源的一款用于实现服务注册与发现的工具。在微服务架构中,服务的动态注册和发现是必不可少的组成部分,而Eureka正是为了解决这一问题而诞生的。

一、为何需要Eureka

在微服务架构中,服务之间的协同合作和高效通信是至关重要的。服务的自动注册与发现成为了解决这一挑战的核心问题之一。Eureka作为Netflix开源的服务注册与发现组件,提供了一种简单且高效的解决方案。通过Eureka,服务实例能够自动注册和注销,同时其他服务能够动态地发现和调用这些服务,实现了微服务架构中的高度灵活性和可伸缩性。 

可能这段话听上去有些晦涩难懂,下面就由我来举例解释:

如我们前面文章介绍的,微服务架构是一种优秀的分布式架构,是为了弥补单体应用的不足发展过来的。

传统的单体应用如下图:

SpringCloud-Eureka原理分析-LMLPHP

各业务之间是耦合的,没有单独根据业务去做区分,部署虽然方便,但是容灾性比较差,一旦一个服务挂掉,整个应用都会宕机,而且每次发布,都需要全量部署,系统维护非常耗时,从而影响用户体验。

后面为了适应大项目的需求,解决这类宕机问题,分布式架构应运而生,服务按模块为单位进行封装,极大程度避免了整体宕机的问题,而且每次发布只需要发布所需要的模块。

分布式应用架构如下:

SpringCloud-Eureka原理分析-LMLPHP

但分布式的服务调用问题也接踵而至。

由于服务分别部署在不同的端口,如果我们按照传统的调用方法,把端口号写死,那么会导致端口变动时需要反复部署。

传统服务调用如图所示:

SpringCloud-Eureka原理分析-LMLPHP

这种硬编码地址的调用方法非常不灵活,我们需要做很多的端口配置,修改起来又需要重新部署,而且服务挂掉了,也没有补救措施。

对于服务挂掉的问题,我们的理想方案是同时启动多个相同服务,部署在不同端口,一旦一个服务挂掉了,系统可以自动选择出最优端口进行替补。

为此,Eureka 应运而生。

Eureka 重点解决的就是服务注册与发现、负载均衡的问题。

引入Eureka 解决服务注册与发现、负载均衡后的服务调用如图:

SpringCloud-Eureka原理分析-LMLPHP


二、Eureka原理

Eureka 的原理基于 CAP(一致性、可用性、分区容忍性)理论。Eureka 通过维护一份服务注册表,记录了各个服务实例的信息,包括服务名、实例 ID、IP 地址等。服务提供者通过向 Eureka 服务器注册自身信息,而服务消费者则通过查询 Eureka 服务器来获得可用服务实例的信息。Eureka 还实现了心跳机制和自我保护机制,确保服务实例的及时发现和故障恢复。

下面我们来详细解释。

Eureka 工作原理图如下:

SpringCloud-Eureka原理分析-LMLPHP

服务提供者在启动时向 Eureka 服务器注册自己的信息,包括服务名、实例 ID、IP 地址等。完成注册的服务会出现在图中的服务提供者模块里,供服务消费者调用时选择。

服务消费者同样也会向 Eureka 服务器注册。服务消费者通过查询 Eureka 服务器获取可用服务实例的信息,从而进行服务调用。

服务调用的过程,大概如下:

  • ① 服务提供者向 Eureka 服务器注册服务信息;
  • ② 服务消费者从 Eureka 服务器拉取已注册的服务提供者信息;
  • ③ 服务消费者选择其中一个最优的服务提供者,这个过程叫负载均衡;
  • ④ 服务消费者远程调用选定的服务提供者。

同时,Eureka 通过定时发送心跳来检测服务实例的健康状况,确保注册表的及时更新。当 Eureka 服务器在一定时间内未收到服务实例的心跳时,会进入自我保护模式,保障注册表的稳定性。


三、Eureka原理总结

总体而言,Eureka的工作原理可归纳为以下几点:

Eureka的设计理念简单而实用,使得它成为构建微服务架构中服务注册与发现的首选解决方案。通过深入理解Eureka的原理,开发者能够更好地利用其功能,构建出稳健、高可用的微服务体系。

02-08 07:11