SpringCloud源码学习笔记之Eureka服务端中的InstanceRegistry类

导读:本篇文章讲解 SpringCloud源码学习笔记之Eureka服务端中的InstanceRegistry类,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!