SpringCloud Eureka 服务治理

1. 服务提供者

1.1. 服务注册

Eureka clien 端在注册在启动中会先向 Eureka Service 端发送一个REST请求,请求里包括当前服务名称以及自身的一些元数据。Service 端在收到请求之后会将这些数据存储在一个双层 Map 中。

(第一层存储的是服务名称,第二层存储的是服务本身实例。)

1.2. 服务同步

现在 Eureka Service 端有两台,它们相互注册。当 client 在任意一台Service上注册,Service收到请求后会转发请求给集群中心的其他Service。从而实现注册中心的服务同步,答到访问集群中任意节点都能获取当前服务。

1.3. 服务续约

Eureka client 端在注册后会维护一个心跳机制,每30秒来告诉 Eureka Service 当前服务还活着,防治 Eureka Service 剔除当前实例。

2. 服务消费者

2.1. 服务获取

Eureka client 端向 Eureka Service 发送一个REST请求获取一份只读的服务器清单,在只读清单中获取具体服务。Eureka Service 为性能考虑每30秒会更新一份只读清单。(如果是负载均衡的默认使用的是轮询方式)

2.2. 服务调用

Eureka client 在获取清单后根据服务名称去获取某个服务,如果服务是负载均衡的。将会默认使用轮询方式调用服务(也这里可以设置为随机调用)

2.3. 服务下线

Eureka client 在关闭或重启时,会发送一个REST请求告诉Eureka Service我要下线了。从而让 Eureka Service 剔除当前实例

3. 注册中心

3.1. 失效剔除

某一些服务可能因为网络原因,内存不够,宕机等问题导致服务不能正常的服务下线。Eureka Service 在创建时间会维护一个定时器,定时器每60秒执行一次获取清单里默认90秒没有续约的服务进行剔除。

3.2. 自我保护

一般在调试项目时我们会发现下面这个错误:

"EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE."

Eureka client 维护一个心跳机制30每秒去续约。Eureka Server 在运行期间,会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。