不支持C,每个Eureka服务有三个缓存,数据同步有时间间隔,最差情况下,服务列表在30秒内不一致。
支持A,在Eureka集群中每个节点都是平等的,只要存在一个节点,就能保证注册服务可用性
支持P,因为有定时踢出和自我保护,即使Client没有续约上,其他Client也能从Server拉取到注册表信息
Eurekad的三级缓存分别是register,readWrtiteCacheMap,readOnlyCacheMap
源码中三个缓存分别使用的数据类型:
private final ConcurrentHashMap>> registry= new ConcurrentHashMap>>();private final ConcurrentMap readOnlyCacheMap = new ConcurrentHashMap();private final LoadingCache readWriteCacheMap;
流程关系是当有服务注册进来时,会先注册到registry,同时如果readWrtiteCacheMap存在该服务,则让其失效。readOnlyCacheMap在于readWrtiteCacheMap定时同步,客户端拉取服务时默认先从readOnlyCacheMap取,如果没有再从readWrtiteCacheMap取,所以可以修改这个默认配置直接从readWrtiteCacheMap取
客户端第一次全量拉取+后续增量拉取
Eureka处理available-replicas和unavailable-replicas信息的源码:
private boolean isReplicaAvailable(String url) {try {/**需要将以下配置设置为trueeureka.client.register-with-eureka=trueeureka.client.fetch-registry=true**/Application app = registry.getApplication(myAppName, false);if (app == null) {return false;}for (InstanceInfo info : app.getInstances()) {// 服务之间注册和接收到的地址要一致if (peerEurekaNodes.isInstanceURL(url, info)) {return true;}}} catch (Throwable e) {logger.error("Could not determine if the replica is available ", e);}return false;
}
eureka:server:# 每 6 秒会检测失效的服务,也就是如果有服务超过 6 秒没有向Eureka Server 发起 Renew 请求的话,就会被当做失效服务剔除掉eviction-interval-timer-in-ms: 6000# 自我保护,服务较少的情况下关掉,服务较多的情况下可以开启,因为服务较多的情况下可能出现网络波动导致服务没有续约上enable-self-preservation: false# 自我保护阈值,默认0.85,表示如果有100个服务掉了15个服务就会开启自我保护,后面没收到心跳包的Client不会被踢出renewal-percent-threshold: 0.85# 关闭从readOnly读注册表use-read-only-response-cache: false
Client优化
eureka:client:service-url:# 向Eureka Server的注册地址,在集群情况下需要将注册地址打乱,不然压力都会在第一个地址的服务器下defaultZone: http://localhost:8000/eureka# 刷新注册表( 拉取注册表 )间隔,默认30秒registry-fetch-interval-seconds: 5instance:# 心跳续约间隔lease-renewal-interval-in-seconds: 10# 心跳过期时间lease-expiration-duration-in-seconds: 10
上一篇:WeNet - 初识
下一篇:如何上传文件