Eureka 学习笔记2:EurekaClient

版本 awsVersion = '1.11.277'

EurekaClient 接口实现了 LookupService 接口,拥有唯一的实现类 DiscoveryClient 类。


LookupService 接口提供以下功能:

  1. 获取注册表
  2. 根据应用名称获取应用
  3. 根据实例 id 获取实例信息
java 复制代码
public interface LookupService<T> {
    /**
     * 根据应用名称从注册表中获取应用
     */
    Application getApplication(String appName);
    /**
     * 获取注册表
     */
    Applications getApplications();
    /**
     * 根据实例id获取实例信息集合,一个实例可能注册到多个应用
     */
    List<InstanceInfo> getInstancesById(String id);
    /**
     * 通过轮询的方式,
     * 从注册表中获取参数virtualHostname对应服务的下一个实例信息
     * 默认情况下,
     * shouldFilterOnlyUpInstances配置为true
     * 即只返回InstanceStatus为UP的实例信息
     * 参数secure决定是从注册表(Applications)的
     * secureVirtualHostNameAppMap属性中获取实例信息
     * 还是从virtualHostNameAppMap属性中获取实例信息
     */
    InstanceInfo getNextServerFromEureka(String virtualHostname, boolean secure);
}

EurekaClient 接口提供的功能包括三大类:

1、获取实例信息

  • 根据 region 获取注册表
  • 根据 serviceUrl 获取注册表(从服务端获取注册表)
  • 根据 vipAddress(虚拟主机名称)从本地注册表中获取服务实例信息集合

2、获取本地的元数据

  • 获取所有 region 名称
  • 获取自身的实例状态
  • 通过 DNS 或配置,获取 Availability Zone 中所有 Eureka Server 的地址(已弃用,使用 EndpointUtils 代替)
  • 注册 HealthCheckCallback 到自身(已弃用,使用 HealthCheckHandler 代替)
  • 注册 HealthCheckHandler 和 EurekaEventListener 到自身

3、其他方法

  • 获取自身的 EurekaClientConfig 和 ApplicationInfoManager
  • 调用 shutdown 方法并且取消注册自身实例
java 复制代码
public interface EurekaClient extends LookupService {
    // ========================
    // getters for InstanceInfo
    // ========================

    public Applications getApplicationsForARegion(@Nullable String region);

    public Applications getApplications(String serviceUrl);

    public List<InstanceInfo> getInstancesByVipAddress(String vipAddress, boolean secure);

    public List<InstanceInfo> getInstancesByVipAddress(String vipAddress, boolean secure, @Nullable String region);

    public List<InstanceInfo> getInstancesByVipAddressAndAppName(String vipAddress, String appName, boolean secure);

    // ==========================
    // getters for local metadata
    // ==========================

    public Set<String> getAllKnownRegions();

    public InstanceInfo.InstanceStatus getInstanceRemoteStatus();

    /**
     * @deprecated see {@link com.netflix.discovery.endpoint.EndpointUtils} for replacement
     */
    @Deprecated
    public List<String> getDiscoveryServiceUrls(String zone);

    @Deprecated
    public List<String> getServiceUrlsFromConfig(String instanceZone, boolean preferSameZone);

    @Deprecated
    public List<String> getServiceUrlsFromDNS(String instanceZone, boolean preferSameZone);

    // ===========================
    // healthcheck related methods
    // ===========================

    /**
     * @deprecated Use {@link #registerHealthCheck(com.netflix.appinfo.HealthCheckHandler)} instead.
     */
    @Deprecated
    public void registerHealthCheckCallback(HealthCheckCallback callback);

    /**
     * 注册HealthCheckHandler后, 
     * DiscoveryClient首先会调用InstanceInfoReplicator的onDemandUpdate()方法,
     * onDemandUpdate()方法会异步调用InstanceInfoReplicator的run()方法,
     * run()方法会调用DiscoveryClient的refreshInstanceInfo()方法更新实例信息,
     * refreshInstanceInfo()方法会调用HealthCheckHandler的getStatus()方法更新实例状态
     * 
     * DiscoveryClient也会根据appinfo.replicate.interval配置,默认30秒,
     * 周期性地调用InstanceInfoReplicator的run()方法更新实例信息和注册实例到服务端
     */
    public void registerHealthCheck(HealthCheckHandler healthCheckHandler);

    public HealthCheckHandler getHealthCheckHandler();

    /**
     * EurekaEventListener的onEvent()方法被同步调用,
     * 因此必须保证onEvent()方法尽快返回并且不被阻塞
     * 
     * DiscoveryClient每次从服务端成功拉取注册表后会发送CacheRefreshedEvent
     * 
     * 当 1.自身的实例状态改变
     *    2.自身在服务端的实例状态改变时会发送StatusChangeEvent
     */
    public void registerEventListener(EurekaEventListener eventListener);

    public boolean unregisterEventListener(EurekaEventListener eventListener);

    // =============
    // other methods
    // =============

    public void shutdown();

    public EurekaClientConfig getEurekaClientConfig();

    public ApplicationInfoManager getApplicationInfoManager();
}

注1 :在使用 org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean 构建的 InstanceInfo 中,appNamevipAddresssecureVipAddress 均是 spring.application.name 配置指定的值。

java 复制代码
@Override
public void setEnvironment(Environment environment) {
    this.environment = environment;
    RelaxedPropertyResolver springPropertyResolver = new RelaxedPropertyResolver(this.environment, "spring.application.");
    String springAppName = springPropertyResolver.getProperty("name");
    if(StringUtils.hasText(springAppName)) {
        setAppname(springAppName);
        setVirtualHostName(springAppName);
        setSecureVirtualHostName(springAppName);
    }
}

注2 :Region 和 Availability Zone 是 AWS(Amazon Web Services 亚马逊云服务)中的概念。

Region 表示不同地理区域,每个区域都与其他区域隔离,当查找资源时,只会看到与指定区域关联的资源。这是因为区域间彼此隔离,而且不会自动跨区域复制资源。

区域代码 区域名称
us-east-1 美国东部(弗吉尼亚北部)
us-east-2 US East (Ohio)
us-west-1 美国西部(加利福尼亚北部)
us-west-2 美国西部(俄勒冈)

Spring Cloud 默认使用的 Region 是 us-east-1。

Availability Zone 表示每个区域内的多个相互隔离的位置,可用区的代码由其区域代码后跟一个字母标识符组成。例如,us-east-1a。

可以简单地将 Availability Zone 理解为同机房的 Eureka 集群,Region 理解为跨机房的 Eureka 集群。

同一 Region 使用多个 Availability Zone 做备份来实现容灾,服务实例分布在多个 Availability Zone,当其中某个实例发生故障,可以通过另一个 Availability Zone 中的实例代为处理请求。

参考文章 Region and Availability Zone

参考文章 Eureka 预备知识和核心类

相关推荐
七夜zippoe2 天前
nacos和eureka的区别详解
云原生·eureka
珍珠是蚌的眼泪3 天前
微服务_1、入门
分布式·微服务·eureka·springcloud·注册中心
djgxfc3 天前
Docker概述
spring cloud·云原生·eureka
天蓝蓝235283 天前
nacos和eureka的区别
云原生·eureka
jxxchallenger3 天前
eureka.client.service-url.defaultZone的坑
云原生·eureka
Autter_A33 天前
Docker容器技术1——docker基本操作
docker·容器·eureka
明月心9524 天前
docker+docker-compose+gitlab
java·spring cloud·eureka
weixin_586062024 天前
Nacos与Eureka的区别:深入解析微服务中的服务注册与发现
微服务·云原生·eureka
xianjie03184 天前
几种修改docker默认存储位置的方法
spring cloud·docker·eureka
hahaha 1hhh4 天前
docker
云原生·eureka