类名 | 介绍与作用 |
EurekaClientConfig | 封装了Eureka Client 与 Eureka Server 交互时所需要的配置信息,Spring Cloud 为其提供了默认配置类: EurekaClientConfigBean。 |
ApplicationInfoManager | 作为应用信息管理器,管理服务实例类 Instancenfo 和服务实例配置信息类EurekaInstanceConfig。 |
InstanceInfo | 封装了将被发送到 Eureka Server 进行服务注册的服务实例元数据,它在Eureka 注册表中代表着一个服务实例,其他服务可通过 InstanceInfo来了解该服务实例的相关信息,从而进行相关操作。 |
EurekaInstanceConfig | 封装了 Eureka Client 自身服务实例的配置信息,主要用于构建 InstanceInfo,通常这些信息在配置文件的 eureka.instance 前缀下进行设置,Spring Cloud 通过 EurekaInstanceBean 配置类提供默认配置。 |
DiscoveryClient | Spring Cloud中定义用来做服务发现的客户端接口。 |
3. DiscoveryClient类的解析
3.1 DiscoveryClient 作用
DiscoveryClient 是Eureka Client 的核心类,其作用与下:
- 注册实例到 Eureka Server 中
- 发送心跳更新与 Eureka Server 的续约
- 在服务关闭时取消与 Eureka Server 的续约,完成服务下限
- 获取在 Eureka Server 中的服务实例列表
3.2 DiscoveryClient 的类结构
可以先看下 DiscoveryClient 的类结构图:
从类结构图上可以看出 DiscoveryClient 类实现了 EurekaCient,EurekaCient 又继承了LookupService,这里看看 LookupService 类:
public interface LookupService {
// 根据服务实例名称获取 Application
Application getApplication(String appName);
// 获取当前注册表中所有的服务实例信息
Applications getApplications();
// 根据服务实例 Id 获取服务实例信息
List getInstancesById(String id);
InstanceInfo getNextServerFromEureka(String virtualHostname, boolean secure);
}
Application 是持有服务实例信息列表,它表示同一个服务的集群信息,这些服务实例乃是挂载在同一个服务名 appName 之下,而 InstanceInfo 则是代表着一个服务实例的信息,Application 类代码如下:
public class Application {
private static Random shuffleRandom = new Random();
// 服务名
private String name;
// 标识服务状态
@XStreamOmitField
private volatile boolean isDirty = false;
@XStreamImplicit
private final Set instances;
private final AtomicReference> shuffledInstances;
private final Map instancesMap;
// ........
}
在 Application 中对 InstanceInfo 的操作都是同步的,为的是保证其原子性。Applications 则是注册表中所有服务实例的集合,其间的操作也都是同步的。EurekaClient 继承了 LookupService 接口,为 DiscoveryClient 提供一个上层接口,其目的是为了Eureka1.0x 到 Eureka2.x 的升级做过渡。
EurekaCient 接口在 LookupService 的基础上提供了更丰富的方法,譬如:
- 提供做种方式获取 InstanceInfo,例如根据区域、Eureka Server 地址获取等。
- 提供本地客户端(区域、可用区)的数据,这部分与 AWS 相关
- 提供了为客户端注册和获取健康检查处理器的功能
除了相关查询接口外,EurekaClient 提供以下的两个方法,需颇多关注:
public interface EurekaClient extends LookupService {
// .......
// 为 Eureka Client 注册健康处理器
public void registerHealthCheck(HealthCheckHandler healthCheckHandler);
// 监听 Client 服务实例信息的更新
public void registerEventListener(EurekaEventListener eventListener);
}
在 Eureka Server 中一般是通过心跳来识别一个实例的状态,而在 Eureka Client 中则存在一个定时任务定时通过 HealthCheckHandler 检测当前 Client 的状态,当 其状态发生变化的时候,将会触发新的注册事件,更新 Eureka Server 的注册表中的相关实例信息。