注册中心 Eureka 源码解析 —— 注册表 InstanceRegistry 类关系

本文主要基于 Eureka 1.8.X 版本

  • 1. 概述
  • 2. 类图
  • 3. LookupService
  • 4. LeaseManager
  • 5. InstanceRegistry
  • 6. AbstractInstanceRegistry
  • 7. PeerAwareInstanceRegistry
  • 8. PeerAwareInstanceRegistryImpl
  • 666. 彩蛋

友情提示:欢迎关注公众号【芋道源码】。?关注后,拉你进【源码圈】微信群讨论技术和源码。 友情提示:欢迎关注公众号【芋道源码】。?关注后,拉你进【源码圈】微信群讨论技术和源码。 友情提示:欢迎关注公众号【芋道源码】。?关注后,拉你进【源码圈】微信群讨论技术和源码。


1. 概述

本文主要简介 注册表 InstanceRegistry 的类关系,为后文的应用实例注册发现Eureka-Server 集群复制做整体的铺垫。

推荐 Spring Cloud 书籍

  • 请支持正版。下载盗版,等于主动编写低级 BUG
  • 程序猿DD —— 《Spring Cloud微服务实战》
  • 周立 —— 《Spring Cloud与Docker微服务架构实战》
  • 两书齐买,京东包邮。

推荐 Spring Cloud 视频

  • Java 微服务实践 - Spring Boot
  • Java 微服务实践 - Spring Cloud
  • Java 微服务实践 - Spring Boot / Spring Cloud

2. 类图

  • com.netflix.eureka.registry.AwsInstanceRegistry,主要用于亚马逊 AWS,跳过。
  • com.netflix.eureka.registry.RemoteRegionRegistry,笔者暂时不太理解它的用途。目前猜测 Eureka-Server 集群和集群之间的注册信息的交互方式。查阅官方资料,《Add ability to retrieve instances from any remote region》 在做了简单介绍。翻看目前网络上的博客、书籍、项目实战,暂时都没提及此块。估摸和亚马逊 AWS 跨区域( region ) 机制有一定关系,先暂时跳过。有了解此块的同学,麻烦告知下笔者,万分感谢。TODO[0009]:RemoteRegionRegistry。
  • 蓝框部分,本文主角。

3. LookupService

com.netflix.discovery.shared.LookupService,查找服务接口,提供简单单一的方式获取应用集合(com.netflix.discovery.shared.Applications) 和 应用实例信息集合( com.netflix.appinfo.InstanceInfo )。接口代码如下:

public interface LookupService<T> {

    Application getApplication(String appName);

    Applications getApplications();

    List<InstanceInfo> getInstancesById(String id);

    InstanceInfo getNextServerFromEureka(String virtualHostname, boolean secure);

}
  • 在 Eureka-Client 里,EurekaClient 继承该接口。
  • 在 Eureka-Server 里,com.netflix.eureka.registry.InstanceRegistry 继承该接口。

4. LeaseManager

com.netflix.eureka.lease.LeaseManager,租约管理器接口,提供租约的注册、续租、取消( 主动下线 )、过期( 过期下线 )。接口代码如下:

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

}

5. InstanceRegistry

com.netflix.eureka.registry.InstanceRegistry应用实例注册表接口。它继承了 LookupService 、LeaseManager 接口,提供应用实例的注册发现服务。另外,它结合实际业务场景,定义了更加丰富的接口方法。接口代码如下:

public interface InstanceRegistry extends LeaseManager<InstanceInfo>, LookupService<String> {

    // ====== 开启与关闭相关 ======

    void openForTraffic(ApplicationInfoManager applicationInfoManager, int count);

    void shutdown();

    void clearRegistry();

    // ====== 应用实例状态变更相关 ======

    void storeOverriddenStatusIfRequired(String appName, String id, InstanceStatus overriddenStatus);

    boolean statusUpdate(String appName, String id, InstanceStatus newStatus,
                         String lastDirtyTimestamp, boolean isReplication);

    boolean deleteStatusOverride(String appName, String id, InstanceStatus newStatus,
                                 String lastDirtyTimestamp, boolean isReplication);

    Map<String, InstanceStatus> overriddenInstanceStatusesSnapshot();

    // ====== 响应缓存相关 ======

    void initializedResponseCache();

    ResponseCache getResponseCache();

    // ====== 自我保护模式相关 ======

    long getNumOfRenewsInLastMin();

    int getNumOfRenewsPerMinThreshold();

    int isBelowRenewThresold();

    boolean isSelfPreservationModeEnabled();

    public boolean isLeaseExpirationEnabled();

    // ====== 调试/监控相关 ======
    List<Pair<Long, String>> getLastNRegisteredInstances();

    List<Pair<Long, String>> getLastNCanceledInstances();
}

6. AbstractInstanceRegistry

com.netflix.eureka.registry.AbstractInstanceRegistry,应用对象注册表抽象实现

这里先不拓展开,《Eureka 源码解析 —— 应用实例注册发现》系列 逐篇分享。

7. PeerAwareInstanceRegistry

com.netflix.eureka.registry.PeerAwareInstanceRegistry,PeerAware ( 暂时找不到合适的翻译 ) 应用对象注册表接口,提供 Eureka-Server 集群内注册信息的同步服务。接口代码如下:

public interface PeerAwareInstanceRegistry extends InstanceRegistry {

    void init(PeerEurekaNodes peerEurekaNodes) throws Exception;

    int syncUp();

    boolean shouldAllowAccess(boolean remoteRegionRequired);

    void register(InstanceInfo info, boolean isReplication);

    void statusUpdate(final String asgName, final ASGResource.ASGStatus newStatus, final boolean isReplication);
}

8. PeerAwareInstanceRegistryImpl

com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl,PeerAware ( 暂时找不到合适的翻译 ) 应用对象注册表实现类

这里先不拓展开,《Eureka 源码解析 —— Eureka-Server 集群》系列 逐篇分享。

原文发布于微信公众号 - 芋道源码(YunaiV)

原文发表时间:2018-04-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏别先生

JDBC操作数据库,第一:jsp插入mysql数据库,坎坷摸索分享

JSP连接数据库,坎坷摸索了好久,现在终于做好了,分享一下,希望对更多热爱编程学习的人有所帮助!!!谢谢  第一:首先准备的就是已经安装好Mysql,这里不做...

2267
来自专栏Ryan Miao

使用dropwizard(4)-加入测试-jacoco代码覆盖率

前言 dropwizard提供了一个简单的测试框架。这里简单集成并加入jacoco测试。 Demo source https://github.com/Rya...

3888
来自专栏三木的博客

Linux系统中的信号量机制

1、信号量的定义: struct semaphore { spinlock_t lock; unsigned int count; st...

1936
来自专栏JavaEdge

IoC容器系列的设计与实现(基于Spring5.0.4)1 Spring的IoC容器系列2 Spring IoC容器的设计3 BeanFactory的应用场景4 BeanFactory容器的设计原理5

3296
来自专栏一个会写诗的程序员的博客

Spring 5.0.3.RELEASE中的 Kotlin 语言等支持Spring 5.0.3.RELEASE中的 Kotlin 语言支持

https://docs.spring.io/spring/docs/current/spring-framework-reference/languages....

1783
来自专栏Danny的专栏

三分钟学会JUnit单元测试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

902
来自专栏一个会写诗的程序员的博客

《Kotlin极简教程》第2章 快速开始:HelloWorld

我们在本章将介绍使用Kotlin程序设计语言,分别使用命令行、应用程序、Web RESTFul、Android、Kotlin JavaScript等方式向世界问...

873
来自专栏24K纯开源

inno setup读取注册表遇到的一个坑

一、背景       目前,公司针对PR开发的一个插件需要发布到64位系统上。该插件包括一个prm格式的文件和若干个DLL文件。其中,prm文件需要复制到PR公...

3816
来自专栏xingoo, 一个梦想做发明家的程序员

漫谈Java IO之 Netty与NIO服务器

前面介绍了基本的网络模型以及IO与NIO,那么有了NIO来开发非阻塞服务器,大家就满足了吗?有了技术支持,就回去追求效率,因此就产生了很多NIO的框架对NIO...

4188
来自专栏芋道源码1024

注册中心 Eureka 源码解析 —— Eureka-Client 初始化(三)之 EurekaClient

1. 概述 本文接《Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig》,主要分享 Eureka-C...

8904

扫码关注云+社区