sprincloud源码之eureka服务下架/续期
前言
请先看服务注册
本文只涉及eureka-server端的代码
服务下架
InstanceRegistry(发布事件)——>AbstractInstanceRegistry(真正操作)——>PeerAwareInstanceRegistryImpl(集群同步),设计采取责任链模式遵循单一职责原则
eureka-core的resources包下
InstanceResource #cancelLease()
——>InstanceRegistry#cancel发布事件EurekaInstanceCanceledEvent
——>AbstractInstanceRegistry#cancel 真正进行服务下架操作
——>PeerAwareInstanceRegistryImpl#cancel 集群同步
真正进行服务下架操作
protected boolean internalCancel(String appName, String id, boolean isReplication) {
//从registry拿到appName的微服务组
Map<String, Lease<InstanceInfo>> gMap = registry.get(appName);
//从appName的微服务组拿到id的微服务实例
Lease<InstanceInfo> leaseToCancel = null;
if (gMap != null) {
leaseToCancel = gMap.remove(id);
}
//最近下架的微服务的queue
recentCanceledQueue.add(new Pair<Long, String>(System.currentTimeMillis(), appName + "(" + id + ")"));
if (leaseToCancel == null) {
//下架失败
return false;
} else {
//调用lease的cancel记录evictionTimestamp
leaseToCancel.cancel();
//微服务实例
InstanceInfo instanceInfo = leaseToCancel.getHolder();
//vip和svip我没用过,应该是eureka-client可以设置一些vip地址
//比如一个集群可以有几千个微服务,但是user模块只对其中几个微服务实例感兴趣,这就是vip地址
//上面是个人猜测
String vip = null;
String svip = null;
if (instanceInfo != null) {
//设置微服务状态delete
instanceInfo.setActionType(ActionType.DELETED);
//近三分钟发生改动的微服务的queue,用于增量更新使用返回给客户端
recentlyChangedQueue.add(new RecentlyChangedItem(leaseToCancel));
//最后更新的时间戳
instanceInfo.setLastUpdatedTimestamp();
vip = instanceInfo.getVIPAddress();
svip = instanceInfo.getSecureVipAddress();
}
}
synchronized (lock) {
if (this.expectedNumberOfClientsSendingRenews > 0) {
//期待的发送心跳的客户端的数量-1
this.expectedNumberOfClientsSendingRenews = this.expectedNumberOfClientsSendingRenews - 1;
//这个请看前言里的那个链接的文章
updateRenewsPerMinThreshold();
}
}
return true;
}
服务续期
一样是发布事件,续期操作,集群同步,这里只看renew
public boolean renew(String appName, String id, boolean isReplication) {
//从registry拿到appName的微服务组
Map<String, Lease<InstanceInfo>> gMap = registry.get(appName);
//从appName的微服务组拿到id的微服务实例
Lease<InstanceInfo> leaseToRenew = null;
if (gMap != null) {
leaseToRenew = gMap.get(id);
}
if (leaseToRenew == null) {
//续期失败
return false;
} else {
//微服务实例
InstanceInfo instanceInfo = leaseToRenew.getHolder();
if (instanceInfo != null) {
InstanceStatus overriddenInstanceStatus = this.getOverriddenInstanceStatus(
instanceInfo, leaseToRenew, isReplication);
//这一段我暂时没看懂,但正常情况都不会进
if (overriddenInstanceStatus == InstanceStatus.UNKNOWN) {
RENEW_NOT_FOUND.increment(isReplication);
return false;
}
if (!instanceInfo.getStatus().equals(overriddenInstanceStatus)) {
instanceInfo.setStatusWithoutDirty(overriddenInstanceStatus);
}
}
//执行lease的renew进行续期
leaseToRenew.renew();
return true;
}
}
总结
服务下架:发布下架事件,下架操作gMap.remove,lease.cancel, 集群同步
服务续期:发布续期事件,续期操作lease.renew,集群同步