sprincloud源码之eureka服务下架/续期前言请先看服务注册 服务下架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, 集群同步 |
|
来自: vnxy001 > 《022springcloud》