| 类名 | 介绍与作用 | 
| 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 的注册表中的相关实例信息。

