该章节紧接第三章,主要是对一些理论上的指导,帮助更好的理解服务治理。
基础架构
eureka服务治理的基础架构包含三个要素:
1)服务注册中心:eureka提供服务端,提供服务的注册与发现功能。
注:在配置注册中心时,记得避免注册中心向自己注册,需要在配置文件中添加:
eureka.client.register-with-eureka=false(这个是避免eureka向自己进行注册)
eureka.client.fetch-registry=false(这个是避免eureka查找服务列表)
2)服务提供者:提供服务的应用,可以是springboot应用,也可以是其他技术平台且遵循Eureka通信机制的应用,可以将自己的服务注册到Eureka上。
3)服务消费者:消费者应用从服务注册中心获取服务列表,从而使消费者知道去哪调用所需要的服务。
服务治理机制
服务提供者
服务注册:
“服务提供者”在启动的时候会发送REST请求将自己注册到Eureka Server上,并带上一些元信息。
Eureka Server接收到REST请求,将元信息存储在一个双层Map中,第一层key是服务名,第二层key是具体服务的实例名。
注:在服务注册时,需要确认一下eureka.client.register-with-eureka=true是否正确,如果为false是禁止向Eureka Server注册的。
服务同步:
不同的服务提供者分别注册到了一个注册中心集群上的不同的注册中心上。他们的信息被不同的注册中心维护。
由于在集群中,一个注册中心互为其他注册中心的服务,当服务提供者请求到一个服务注册中心后,它会将请求转发到其他服务注册中心,实现注册中心之间的服务同步。
通过服务同步,服务提供者的服务信息可以通过集群中的任何一个注册中心获取。
服务续约:
在注册完成后。服务提供者会维护一个心跳告诉注册中心服务政策,防止注册中心剔除服务,该过程称为服务续约。
eureka.instance.lease-renewal-interval-in-seconds参数用于定义:服务续约任务的调用间隔时间,默认30s。
eureka.instance.lease-expiration-duration-in-seconds参数用于定义:服务失效时间,默认30s。
服务消费者
获取服务:
启动服务消费者后,会发送一个REST请求给服务注册中心,来获取上面注册的服务清单。
Eureka Server会维护一份只读清单返回给消费者客户端,该缓存清单30s更新一次。
注:在服务获取时,确定eureka.client.fetch-registry=true,设置成false,服务客户端不会再向注册中心发送请求。
缓存清单的时间配置:eureka.client.registry-fetch-internal-seconds=30s
服务调用:
消费者获取服务清单后,可以通过服务名获取到具体服务实例与实例的元数据信息。在Ribbon中默认采用轮询的方式进行调用,从而实现负载均衡。
服务下线:
当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server。注册中心接收到请求后,将该服务状态置为DOWN,并把下线时间传播出去。
服务注册中心
失效剔除:
Eureka Server启动时会创建定时任务,默认60s一次,将当前清单中超时(90s)没有续约的服务剔除。
自我保护:
本地调试Eureka的程序时,会出现:
该警告是触发了Eureka Server的自我保护机制。
Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果低于,就会将当前实例注册信息保护起来,让实例不会过期,尽可能保护这些注册信息。
但是如果在保护期间,实例出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败。这个时候客户端的容错机制就很重要了。(重新请求,断路器)
保护机制,可能会导致服务实例不能够被正确剔除。
在本地开发时,可使用:eureka.server.enable-self-preservation=false关闭保护机制,使不可用实例能够正常下线。