Eureka 是什么?
Netflix
提供的一种高可用的服务发现解决方案。- 基于 REST 的服务,主要用于定位运行在 AWS 域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud 将它集成在其子项目
spring-cloud-netflix
中,实现 SpringCloud 的服务发现功能。
介绍下 Eureka 的工作原理
组件
- Eureka 服务器和 Eureka 客户端。Eureka 服务器用作服务注册服务器。
- Eureka 客户端是一个 java 客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。
Eureka 架构图
心跳监测
在应用启动后,将会向 Eureka Server 发送心跳,默认周期为 30 秒,如果 Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,Eureka Server 将会从服务注册表中把这个服务节点移除(默认 90 秒)。
心跳保护
如果 Eureka 服务节点在短时间里丢失了大量的心跳连接(注:可能发生了网络故障),那么这个 Eureka 节点会进入自我保护模式。 此时,这个 Eureka 节点对于新的服务还能提供注册服务,对于”死亡“的仍然保留,以防还有客户端向其发起请求。当网络故障恢复后,这个 Eureka 节点会退出自我保护模式。
客户端缓存
- Eureka 集群中所有节点都失效,或者发生网络分割故障导致客户端不能访问任何一台 Eureka 服务器;Eureka 服务的消费者仍然可以通过 Eureka 客户端缓存来获取现有的服务注册信息。
- 甚至最极端的环境下,所有正常的 Eureka 节点都不对请求产生相应,也没有更好的服务器解决方案来解决这种问题时;得益于 Eureka 的客户端缓存技术,消费者服务仍然可以通过 Eureka 客户端查询与获取注册服务信息,这点很重要。
服务同步
如果某台服务器宕机,Eureka 不会有类似于 ZooKeeper 的选举 leader 的过程;客户端请求会自动切换到新的 Eureka 节点;当宕机的服务器重新恢复后,Eureka 会再次将其纳入到服务器集群管理之中;而对于它来说,所有要做的无非是同步一些新的服务注册信息而已。所以,再也不用担心有“掉队”的服务器恢复以后,会从 Eureka 服务器集群中剔除出去的风险了。
服务发现
- 服务发现有客户端发现模式和服务端发现模式两种。区别在于服务发现 Balance 策略是由使用方自己实现还是作为一项服务来供使用方调用。
- 服务发现依赖于服务注册表,系统中每个服务实例启动时,会将自己的网络位置信息发送到服务注册表,服务注册表利用心跳机制即时更新。实例关闭或者服务注册表检测到实例心跳超时情况下,实例信息就会从服务注册表移出。
两种服务发现模式
- 客户端发现模式是由服务请求方负责发现所有可用实例在网络中的具体位置,并根据具体的 Balance 策略将请求路由到具体的实例处理。
- 服务端发现模式则是请求方把请求经由 Load Balancer,Load Balancer 查询服务注册表后根据自己的 Balance 策略将请求路由到目标服务的一台具体实例上进行处理。