Spring Cloud框架下的服务注册与发现框架Eureka包含两个组件,分别是Eureka Server与Eureka Client。
(1)Eureka Server:服务注册服务器,也称为服务注册中心。各个服务启动后,会在Eureka Server中进行注册,这样Eureka Server的服务注册表中将会存储所有可用服务节点的信息。服务节点的信息可以在界面中直观地看到。
(2)Eureka Client:也称为服务(服务实例),作为一个Java客户端,用于简化与Eureka Server的交互。Eureka Client内置一个使用轮询负载算法的负载均衡器。服务启动后,Eureka Client将会向Eureka Server发送心跳更新服务,如果Eureka Server在多个心跳周期内(默认90秒内)没有接收到某个服务的心跳,Eureka Server就将会从服务注册表中把这个服务节点移除。
为了更好地讲解Eureka组件的工作原理,接下来我们通过一张图来描述,具体如图2-1所示。
图2-1 Eureka组件的工作原理
在图2-1中,Eureka Client注册在Eureka Server,Eureka Client中的服务是通过REST调用的。除此之外,Eureka Client还具有缓存功能,它能够从Eureka Server查询当前注册的服务信息并缓存到本地,这样即使Eureka Server宕机,Eureka Client也依然可以利用缓存中的信息调用服务。
综上所述,Eureka正是通过心跳检查、缓存更新等机制,确保系统具有高可用性、灵活性和可伸缩性。
Eureka Client存在两种角色,分别是服务提供者和服务消费者,具体介绍如下。
(1)服务提供者:Eureka Client启动后,服务提供者会通过REST请求将自己注册在Eureka Server中,并维护一个心跳(默认30秒发送一次心跳)进行服务续约,告诉Eureka Server“我还活着”,防止Eureka Server将该服务从服务列表中剔除。
(2)服务消费者:用于获取Eureka Server注册的服务清单,并且该服务清单默认每隔30秒更新一次。服务消费者获取到服务清单后,能够根据自己的需求决定调用哪个服务,默认采用轮询方式调用,从而实现Eureka Client的负载均衡。
接下来我们通过一张图描述Eureka Server与服务提供者、服务消费者之间的关系,具体如图2-2所示。
在图2-2中,服务提供者和服务消费者都属于Eureka Client,它们都会将自己的信息通过REST API的形式提交给Eureka Server。服务消费者注册后,还会获取一份服务注册列表,该列表包含了所有向Eureka Server注册的服务信息。获取到服务注册信息后,服务消费者就会根据服务提供者的IP地址,通过HTTP远程调用服务提供者的服务。
图2-2 Eureka的角色关系
需要注意的是,服务提供者和服务消费者是可以相互转换的,因为一个服务既可能是服务消费者,同时又可能是服务提供者。例如在传统的企业应用三层架构中,服务层会调用数据访问层的接口进行数据操作,它本身也会提供服务给控制层使用。