(零)Eureka-前置了解

0. 前言

  • springboot版本:2.1.9.RELEASE
  • springcloud版本:Greenwich.SR4

1. InstanceInfo-实例信息类

// 客户端中,表示自身实例信息
// 服务端中,表示实例存在服务端注册表中的信息
public class InstanceInfo {

    // ......  
    
    // 客户端中,表示自己的真实工作状态
    // 服务端中,表示服务发现时实例想要暴露给其他实例的工作状态,不一定是实例的真实工作状态
    private volatile InstanceStatus status = InstanceStatus.UP;
  
    // 覆盖状态,服务端可以根据一定规则匹配出 status
    // 外界修改实例在服务端中状态(比如通过 actuator 修改状态)就是修改覆盖状态
    private volatile InstanceStatus overriddenStatus = InstanceStatus.UNKNOWN;
    
    // 判断实例信息在服务端中是否是脏的
    private volatile boolean isInstanceInfoDirty = false;
  
    // 租约信息
    private volatile LeaseInfo leaseInfo;
    
    // 记录实例信息在服务端最近一次修改的时间
    private volatile Long lastUpdatedTimestamp;
    
    // 记录实例信息在客户端最近一次修改的时间
    private volatile Long lastDirtyTimestamp;
    
    // ......
  
}
1.1 InstanceStatus-实例状态类
public enum InstanceStatus {
    UP, // 启动状态,表示实例对外正常提供服务
    DOWN, // 下线状态,实例健康检查失败时修改为该状态
    STARTING, // 启动中状态,表示实例正在初始化启动中
    OUT_OF_SERVICE, // 停止服务状态,表示实例不对外提供服务
    UNKNOWN; // 未知状态

    // ......
  
}
1.2 LeaseInfo-租约信息类
public class LeaseInfo {

    public static final int DEFAULT_LEASE_RENEWAL_INTERVAL = 30;
    public static final int DEFAULT_LEASE_DURATION = 90;

    // 客户端维护的心跳间隔时间
    private int renewalIntervalInSecs = DEFAULT_LEASE_RENEWAL_INTERVAL;
    // 客户端维护的租约持续时间
    private int durationInSecs = DEFAULT_LEASE_DURATION;

    // 服务端维护的实例注册时间
    private long registrationTimestamp;
    // 服务端维护的实例最近一次更新时间
    private long lastRenewalTimestamp; 
    // 服务端维护的实例过期清理时间
    private long evictionTimestamp;
    // 服务端维护的实例启动时间
    private long serviceUpTimestamp;
    
    // ......

}

2. AbstractInstanceRegistry

服务端具体处理客户端请求(心跳续租、注册、变更状态等等)的类

public abstract class AbstractInstanceRegistry implements InstanceRegistry {
  
    // ......
    
    // 服务实例租约信息
    private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry
            = new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();
    
    // 覆盖状态 map
    protected final ConcurrentMap<String, InstanceStatus> overriddenInstanceStatusMap = CacheBuilder
            .newBuilder().initialCapacity(500)
            .expireAfterAccess(1, TimeUnit.HOURS)
            .<String, InstanceStatus>build().asMap();

    // 最近注册队列,实例注册到服务端时添加
    // 先进先出队列,满1000时移除最先添加的
    private final CircularQueue<Pair<Long, String>> recentRegisteredQueue;
  
    // 最近下架队列,实例从服务端下架时添加
    // 先进先出队列,满1000时移除最先添加的
    private final CircularQueue<Pair<Long, String>> recentCanceledQueue;
  
    // 最近变更队列
    // 有定时任务维护的队列,每30s执行一次,移除添加进该队列超过3分钟的实例变更信息
    private ConcurrentLinkedQueue<RecentlyChangedItem> recentlyChangedQueue = new ConcurrentLinkedQueue<RecentlyChangedItem>();

    private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    // 读锁(处理客户端注册、下架、状态变更、删除状态时使用)
    private final Lock read = readWriteLock.readLock();
    // 写锁(处理客户端拉取增量注册表时使用)
    private final Lock write = readWriteLock.writeLock();

    // 服务端统计最近一分钟预期收到客户端实例心跳续租的请求数
    protected volatile int numberOfRenewsPerMinThreshold;
  
    // 服务端统计预期收到心跳续租的客户端实例数
    protected volatile int expectedNumberOfClientsSendingRenews;

    // 响应缓存
    // 服务端处理客户端拉取注册表请求时使用
    protected volatile ResponseCache responseCache;
  
    // ......

    // 处理注册
    public void register(InstanceInfo registrant, int leaseDuration, boolean isReplication) {...}

    // 处理下架
    public boolean cancel(String appName, String id, boolean isReplication) {...}

    // 具体下架处理
    protected boolean internalCancel(String appName, String id, boolean isReplication) {...}

    // 处理心跳续租
    public boolean renew(String appName, String id, boolean isReplication) {...}

    // 处理变更状态
    public boolean statusUpdate(String appName, String id,
                                InstanceStatus newStatus, String lastDirtyTimestamp,
                                boolean isReplication) {...}

    // 处理删除状态
    public boolean deleteStatusOverride(String appName, String id,
                                        InstanceStatus newStatus,
                                        String lastDirtyTimestamp,
                                        boolean isReplication) {...}

    // 处理实例过期清理
    public void evict(long additionalLeaseMs) {...}

    // 处理拉取全量注册表(本地全量注册表 + 可能包含全部远程 region 注册表)
    public Application getApplication(String appName, boolean includeRemoteRegion) {...}
    
    // 处理拉取全量注册表(本地全量注册表 + 可能包含指定远程 region 全量注册表)
    public Applications getApplicationsFromMultipleRegions(String[] remoteRegions) {...}

    // 处理拉取增量注册表(本地增量注册表 + 可能包含指定远程 region 增量注册表)
    public Applications getApplicationDeltasFromMultipleRegions(String[] remoteRegions) {...}

    // ......  
  
}
2.1 Lease-只有服务端维护的实例租约信息类
public class Lease<T> {


    // 实例下架时间
    private long evictionTimestamp;
  
    // 实例注册时间
    private long registrationTimestamp;
  
    // 实例启动时间
    private long serviceUpTimestamp;
  
    // 实例租约过期时间
    private volatile long lastUpdateTimestamp;
   
    // ......

}
2.2 ResponseCacheImpl-响应缓存实现类
public class ResponseCacheImpl implements ResponseCache {
  
    // ......
    
    // 只读缓存
    private final ConcurrentMap<Key, Value> readOnlyCacheMap = new ConcurrentHashMap<Key, Value>();

    // 读写缓存
    // LoadingCache:Guava 提供的本地缓存,多线程的场景下保证只有一个线程加载相应缓存项
    private final LoadingCache<Key, Value> readWriteCacheMap;
  
    // 判断是否使用只读缓存
    private final boolean shouldUseReadOnlyResponseCache;
  
    // ......
  
}

3. PeerAwareInstanceRegistryImpl

处理集群节点间相关操作的实现类

public class PeerAwareInstanceRegistryImpl extends AbstractInstanceRegistry implements PeerAwareInstanceRegistry {
  
    // 当前服务端节点的启动时间
    private long startupTime = 0;
  
    // 判断服务端启动时同步集群节点注册表的实例数是否为空
    private boolean peerInstancesTransferEmptyOnStartup = true;
  
    // 最近一分钟同步复制给集群节点的次数 
    private final MeasuredRate numberOfReplicationsLastMin;
  
    // 服务端的相邻集群节点,配置文件中配置
    protected volatile PeerEurekaNodes peerEurekaNodes;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值