学习思路
- Eureka是什么
- 为什么要用Eureka
- 基础架构
- 服务注册、续租、下线、获取服务列表、自我保护
一、Eureka是什么
Eureka is a REST (Representational State Transfer) based service ;
能保证后台服务的集群配置,有非常高的可用性,能动态扩容、缩容,剔除服务
二、为什么选择Eureka
- 由完善的服务注册、服务发现功能
- 只依赖jar包,可在容器内启动,不需要像zk那样需要单独部署
- 源码开源
- 和spring-cloud无缝集成,经过了大公司的长期实践
缺点:只有java客户端
三、基础架构
解释
- Eureka Server:服务端,支持服务注册、续约、下线、服务获取等功能,可动态水平扩展
- Service Provider:服务提供者,向服务端注册服务、发起续约、下线等操作
- Service Consumer:服务消费者,向服务端拉取Provider注册的配置,远程调用Provider
看一个集群部署的架构图
跟上面的解释中多了
Server Provider触发注册、续约、下线等操作后Eureka Server先操作本地,然后各个Server之间同步信息,保证了每个Server的配置最终一致
这里提到了最终一致,因为同步的过程中会有实效性,还有异常情况通过心跳补偿等最终达到最终一致,可能出现短时间内配置不一致的情况
四、服务注册、续租、下线、获取服务列表、自我保护
1、注册
解释:
- Client端调用Server端addInstance()方法携带配置信息进行注册,首先进行本地注册
- 本地Server注册完之后异步同步到其它Server
携带的配置信息如图,看图领会上篇内容
2、续租
解释:是不是跟上面的注册很像,流程一样,只是触发了不同的动作
- 客户端定时(30秒)触发续约操作,避免被剔除,先更新本地
- 本地成功后同步其它Server
3、下线
下线跟续约基本一样
触发点:org.springframework.cloud.netflix.eureka.server.InstanceRegistry#cancel
这里给你不同动作的代码自己体会
/**
* Replicates all instance changes to peer eureka nodes except for
* replication traffic to this node.
*
*/
private void replicateInstanceActionsToPeers(Action action, String appName,
String id, InstanceInfo info, InstanceStatus newStatus,
PeerEurekaNode node) {
try {
InstanceInfo infoFromRegistry = null;
CurrentRequestVersion.set(Version.V2);
switch (action) {
case Cancel:
node.cancel(appName, id);
break;
case Heartbeat:
InstanceStatus overriddenStatus = overriddenInstanceStatusMap.get(id);
infoFromRegistry = getInstanceByAppAndId(appName, id, false);
node.heartbeat(appName, id, infoFromRegistry, overriddenStatus, false);
break;
case Register:
node.register(info);
break;
case StatusUpdate:
infoFromRegistry = getInstanceByAppAndId(appName, id, false);
node.statusUpdate(appName, id, newStatus, infoFromRegistry);
break;
case DeleteStatusOverride:
infoFromRegistry = getInstanceByAppAndId(appName, id, false);
node.deleteStatusOverride(appName, id, infoFromRegistry);
break;
}
} catch (Throwable t) {
logger.error("Cannot replicate information to {} for action {}", node.getServiceUrl(), action.name(), t);
}
}
4、获取服务列表
解释:
- 为了提高性能,所有服务会在缓存存储一份
- 客户端请求回去,从缓存获取后返回
5、自我保护
客户端会每30秒触发续约,如果服务端联系3次也就是90秒未收到续约请求,那么就会认为该客户端已经失效,就要剔除该服务,单未避免网络或其它原因,短时间内大批量服务失效,服务端大量剔除客户端最终导致服务不可用,因此有了自我保护机制:15分钟内低于85%的客户端有效,那么服务端将不再剔除客户端,提高服务可用性即AP原则
公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢