Spring Cloud Eureka是Spring Cloud Netflix中的一部分,基于Netflix Eureka做了二次封装,主要负责微服务架构中的服务治理。
服务治理主要是用来实现各个微服务实例的自动化注册与发现。
主要功能:
服务注册
每个服务单元向服务中心等级自己提供的服务,将主机号、端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按服务名分类组织服务清单。
服务注册中心还需要以心跳的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,达到排除故障服务的效果。
服务发现
服务向服务注册中心发起调用,便从服务清单中以某种轮询策略取出一个位置来进行服务调用。
Netflix Eureka包含了服务端和客户端组件,均由java实现,主要适用于Java实现的分布式系统,或是JVM兼容语言构建的系统。Eureka服务端的服务治理机制提供了完备的Restful Api,所以也支持非JVM语言构建的微服务,只是其他语言需要自己实现Eureka服务端程序。
Eureka服务端:服务注册中心。
Eureka客户端:主要处理服务注册与发现。
高可用注册中心
微服务架构这样的分布式环境中,必须充分考虑故障的发生,所以生产环境中必须对各个组件进行高可用部署,对于微服务如此,对于服务注册中心也是如此。
在Eureka的服务治理设计中,节点即是服务提供方,也是服务消费方,服务注册中心也不例外。
Eureka的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。
客户端既是服务的提供者,也是服务的消费者。
服务消费者的目标只有两个:发现服务,消费服务。其中服务的发现由Eureka客户端提供,而服务的消费由Ribbon完成。
Ribbon是一个基于Http和Tcp的客户端负载均衡器,他可以在通过客户端配置的ribbonServerList服务端列表去轮询访问以达到负载均衡的作用。当Ribbon与Eureka联合使用时,Ribbon的服务清单RibbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心获取服务端列表。
服务提供方:
服务注册:
服务的提供者在启动的时候会通过发送Rest请求的方式将自己注册到EurekaServer上,同时带上了自身服务的一些元数据。EurekaServer在接收到这个Rest请求之后,将元数据信息储存在一个双层结构Map中,其中第一层的key是服务名,第二层的key是具体服务的实例名。
如果将eureka.client.register-with-eureka(properties)设置成false,就无法启动注册操作。
服务同步:
由于服务注册中心互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,他会将该请求转发给集群中相连的其他注册中心,从而实现服务注册中心之间的服务同步。通过同步,两个服务提供者的服务信息就可以在两台服务注册中心中任意一台获取。
服务续约:
在服务注册完之后,会通过心跳的方式去告诉EurekaServer”我还活着“,防止被EurekaServer的”提出任务“将该服务从服务列表中排除出去,该操作称之为服务续约(Renew)。
服务续约有两个重要的属性:
eureka.instance.lease-renewal-interval-in-seconds=定义服务续约任务的调用间隔时间,单位是s,默认是30s
eureka.instance.lease-expiration-duration-in-seconds=定义服务失效的时间,单位是s,默认是90s
服务消费方:
获取服务:
当我们启动服务消费者时,他会发送一个REST请求到服务注册中心,来获取上面注册的服务清单,为了性能考虑,Eureka Server会维护一份只读的服务清单来返回给客户端,同时,该缓存清单每30秒刷新一次。
eureka.client.fetch-registry=获取服务的基础,默认是true,为false则无法获取
eureka.client.registry-fetch-interval-seconds=更新缓存清单的时间,单位是s,默认是30s
服务调用:
服务消费者在获取服务清单后,通过服务名可以获取具体提供服务的实例名和该实例的元数据信息。客户端可以根据自己的需要决定调用哪个实例,ribbon默认是采用轮询的方式进行调用,从个人实现客户端的负载均衡。
访问实例的选择,Eureka中有Region和Zone的概念,一个Region有多个Zone,每个服务客户端被注册到一个Zone中,所以每个客户端对应一个Region和一个Zone。服务调用的时候优先访问同一个Zone中的服务提供方,若访问不到,则访问其他的Zone。
服务下线:
当服务端正常下线的时候他会触发一个服务下线的Rest请求给EurekaServer,告诉EurekaServer”我要下线了“,服务端接收到请求后,将该服务状态设置为下线(down),并把下线事件传播出去。
服务注册中心
失效剔除
对于不正常下线(内存溢出,网路故障)的服务,Eureka Server会创建一个定时任务,默认每隔60秒将清单中超时(默认90秒)没有续约的服务剔除。
自我保护
EurekaServer在运行期间会统计心跳成功比例低于85%的服务,Eureka将会将当前实例注册信息保护起来,让这些实例不会过期,尽可能保护这些注册信息。但是在这段保护期间,客户端可能拿到已经不存在的服务实例,所以客户端需要一定的容错机制,比如可以用请求重试,断路器等。
本地调试很容易触发保护机制,可以使用以下指令来关闭保护机制,确保正常剔除失效服务。
eureka.server.enable-self-preservation=false