重新定义Spring Cloud实战
上QQ阅读APP看书,第一时间看更新

3.2 服务的核心操作

3.2.1 概述

对于服务发现来说,围绕服务实例主要有如下几个重要的操作:

❑ 服务注册(register)

❑ 服务下线(cancel)

❑ 服务租约(renew)

❑ 服务剔除(evict)

围绕这几个功能,Eureka设计了几个核心操作类:

❑ com/netflix/eureka/lease/LeaseManager.java

❑ com/netflix/discovery/shared/LookupService.java

❑ com/netflix/eureka/registry/InstanceRegistry.java

❑ com/netflix/eureka/registry/AbstractInstanceRegistry.java

❑ com/netflix/eureka/registry/PeerAwareInstanceRegistryImpl.java

Spring Cloud Eureka在Netflix Eureka的基础上,抽象或定义了如下几个核心类:

❑ org/springframework/cloud/netflix/eureka/server/InstanceRegistry.java

❑ org/springframework/cloud/client/serviceregistry/ServiceRegistry.java

❑ org/springframework/cloud/netflix/eureka/serviceregistry/EurekaServiceRegistry.java

❑ org/springframework/cloud/netflix/eureka/serviceregistry/EurekaRegistration.java

❑ org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java

❑ org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java

❑ org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java

其中LeaseManager以及LookupService是Eureka关于服务发现相关操作定义的接口类,前者定义了服务写操作相关的方法,后者定义了查询操作相关的方法。下面我们重点看下这两个类。

3.2.2 LeaseManager

LeaseManager(com/netflix/eureka/lease/LeaseManager.java)接口定义了应用服务实例在服务中心的几个操作方法:register、cancel、renew、evict。其接口源码如下:

        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();
        }

这里简单介绍下这几个方法:

❑ Register:用于注册服务实例信息。

❑ Cancel:用于删除服务实例信息。

❑ Renew:用于与Eureka Server进行心跳操作,维持租约。

❑ evit是Server端的一个方法,用于剔除租约过期的服务实例信息。

3.2.3 LookupService

LookupService(com/netflix/discovery/shared/LookupService.java)接口定义了Eureka Client从服务中心获取服务实例的查询方法。其定义如下:

        public interface LookupService<T> {
            Application getApplication(String appName);
            Applications getApplications();
            List<InstanceInfo> getInstancesById(String id);
            InstanceInfo  getNextServerFromEureka(String  virtualHostname,  boolean
                secure);
        }

这个接口主要是给Client端用的,其定义了获取所有应用信息、根据应用id获取所有服务实例,以及根据visualHostname使用round-robin方式获取下一个服务实例的方法。