1、InstanceRegistry类的层级结构
通过上面类的层级结构图,我们知道InstanceRegistry接口实现的层级结构,其中最后一个InstanceRegistry类是由SpringCloud提供的实现,其他的都是Netflix开源框架的接口或实现类。需要注意其中的InstanceRegistry接口和InstanceRegistry实现类。
2、LeaseManager接口
LeaseManager<T>接口,负责服务租约的创建、续约和剔除。租约决定了服务实例是否正常可用,当客户端没有发送更新租约的请求,租约将过期,服务实例将会被剔除。
public interface LeaseManager<T> {
//注册,创建新的租约
void register(T r, int leaseDuration, boolean isReplication);
//取消指定服务的租约
boolean cancel(String appName, String id, boolean isReplication);
//更新指定服务的租约
boolean renew(String appName, String id, boolean isReplication);
//剔除服务实例
void evict();
}
3、LookupService接口
LookupService<T>接口主要用来进行服务发现,即查找活动的服务实例。
public interface LookupService<T> {
//根据appName查找对应的Application对象,该对象维护了一个服务实例列表,即Application对象维护了一个指定应用的服务实例列表的容器。
Application getApplication(String appName);
//包装了Eureka服务返回的全部注册信息,其中维护了一个Application对象的集合
Applications getApplications();
//根据实例Id,查询对应的服务实例列表
List<InstanceInfo> getInstancesById(String id);
//获取下一个用于处理请求的服务实例(只返回UP状态的服务实例,可以通过重写EurekaClientConfig#shouldFilterOnlyUpInstances()方法进行修改)
InstanceInfo getNextServerFromEureka(String virtualHostname, boolean secure);
}
其实,LookupService<T>接口的实现类除了上面提到的InstanceRegistry分支,还包括了RemoteRegionRegistry和EurekaClient两个分支。其中,EurekaClient主要应用在Eureka客户端,主要实现服务发现等功能;InstanceRegistry主要应用在Eureka服务端,实现服务注册等功能;而RemoteRegionRegistry主要用于Eureka服务端,实现多个Region间信息同步等。
4、InstanceRegistry接口
InstanceRegistry接口实现了服务实例的注册和发现,是netflix开源框架中提供的接口,该接口实现了前面提到的LeaseManager和LookupService两个接口,并限定了服务注册和服务发现的对象是InstanceInfo类型。
5、AbstractInstanceRegistry抽象类
InstanceRegistry接口的抽象实现类,用来处理所有来至Eureka客户端的注册请求,主要操作有:注册、续约、取消租约、到期和状态变化等。其中主要方法有:
- register()方法,注册服务实例
- renew()方法,服务实例续约
- cancel()方法,取消服务实例注册,一般是由Eureka客户端关闭时,发送一个关闭请求触发。
- evict()方法,服务剔除
- statusUpdate()方法,更新服务实例状态,主要在UP和OUT_OF_SERVICE之间切换。
6、PeerAwareInstanceRegistry接口
PeerAwareInstanceRegistry接口主要提供了Eureka服务集群各节点之间的信息同步的方法。
public interface PeerAwareInstanceRegistry extends InstanceRegistry {
void init(PeerEurekaNodes peerEurekaNodes) throws Exception;
int syncUp();
boolean shouldAllowAccess(boolean remoteRegionRequired);
void register(InstanceInfo info, boolean isReplication);
void statusUpdate(final String asgName, final ASGResource.ASGStatus newStatus, final boolean isReplication);
}
7、PeerAwareInstanceRegistryImpl实现类
通过类的命名我们就可以知道,该类是PeerAwareInstanceRegistry接口的实现类,同时还继承了AbstractInstanceRegistry抽象类。
PeerAwareInstanceRegistryImpl实现类主要实现了Eureka服务集群节点间的信息同步,主要操作有:注册、续约、取消租约、到期和状态变化等。
当Eureka服务启动时,它会尝试从其他Eureka服务节点中同步信息,如果同步失败,则该Eureka服务会在指定的时间段内(默认五分钟,可以通过eureka.server.waitTimeInMsWhenSyncEmpty自定义)禁止用户获取注册信息。
关于续约更新,有一个需要注意的事情:当续约更新时,会启用服务保护机制,即当服务续约在一定时间段内下降到一定比例(0.85)后,Eureka 服务就不会再剔除服务实例。
InstanceRegistry类
InstanceRegistry类是PeerAwareInstanceRegistryImpl的子类,是由SpringCloud提供的实现,我们在Eureka服务中实际使用的也是这个类,在Netflix中还有一个AwsInstanceRegistry实现类,主要用在AWS服务中,这里不再学习。
InstanceRegistry 类除了继承了主线的PeerAwareInstanceRegistryImpl类,还是实现了ApplicationContextAware接口,然后会在初始化时注入ApplicationContext实例,用于事件的发布,如下所示:
public class InstanceRegistry extends PeerAwareInstanceRegistryImpl
implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
this.ctxt = context;
}
}
InstanceRegistry类重写了注册、取消和续约等方法,主要添加了事件通知(通过注入的ApplicationContext实例实现),然后再调用父类的对应操作。以注册为例:
@Override
public void register(InstanceInfo info, int leaseDuration, boolean isReplication) {
handleRegistration(info, leaseDuration, isReplication);
super.register(info, leaseDuration, isReplication);
}
private void handleRegistration(InstanceInfo info, int leaseDuration,
boolean isReplication) {
log("register " + info.getAppName() + ", vip " + info.getVIPAddress()
+ ", leaseDuration " + leaseDuration + ", isReplication "
+ isReplication);
publishEvent(new EurekaInstanceRegisteredEvent(this, info, leaseDuration,
isReplication));
}
private void publishEvent(ApplicationEvent applicationEvent) {
this.ctxt.publishEvent(applicationEvent);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68768.html