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 预备知识和核心类

相关推荐
俗世慵人1 小时前
docker随笔
docker·容器·eureka
xuefeiniao2 小时前
本地可以Docker拉取,线上服务器无法拉去镜像,多个ai都无法解决
服务器·docker·eureka
€8112 小时前
Java入门级教程29——Spring Cloud:Eureka 注册发现 + MySQL 数据交互 + 负载均衡
java·开发语言·mysql·spring cloud·eureka·负载均衡
吠品1 天前
Docker Desktop部署Weaviate向量数据库:从配置到生产环境全流程
数据库·oracle·eureka
STRUGGLE_xlf1 天前
MAC电脑Docker Desktop部署n8n
macos·docker·eureka
白鸽梦游指南2 天前
docker仓库的工作原理及搭建仓库
java·docker·eureka
jwlee012 天前
Docker Compose
docker·容器·eureka
杰克尼2 天前
知识点总结--day12(常用组件3/3)
云原生·eureka
迷海2 天前
docker命令大全
java·docker·eureka
探索宇宙真理.3 天前
WordPress CMS Commander 插件SQL漏洞 | CVE-2026-3334概念复现&研究
经验分享·eureka·安全漏洞