欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Eureka源碼核心類預(yù)備知識(shí)

 更新時(shí)間:2022年10月15日 11:46:10   作者:hsfxuebao  
這篇文章主要為大家介紹了Eureka源碼核心類預(yù)備知識(shí)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1. 前言

1.1 Eureka的異地多活

異地多活一般是指在不同城市建立獨(dú)立的數(shù)據(jù)中心。

活是相對(duì)于主備關(guān)系中的熱備而言的。熱備是指?jìng)浞輽C(jī)房隨時(shí)全量備份著主機(jī)房中的數(shù)據(jù),但平時(shí)不 支撐業(yè)務(wù)需求,即不對(duì)外提供服務(wù)。只有在主機(jī)房出現(xiàn)故障時(shí)才會(huì)切換到備份機(jī)房,由備份機(jī)房對(duì)外提 供服務(wù)。也就是說,平時(shí)只有主機(jī)房是活的。

多活則是指這些機(jī)房間屬于主從關(guān)系,即這些機(jī)房平時(shí)都支撐業(yè)務(wù)需求,都對(duì)外提供服務(wù),相互備 份。

1.2 Region和Zone

Eureka中具有Region與Availability Zone(簡(jiǎn)稱AZ)概念,都是云計(jì)算中的概念。

為了方便不同地理區(qū)域中用戶的使用,大型云服務(wù)提供商一般會(huì)根據(jù)用戶需求量在不同的城市、省份、 國(guó)家或洲創(chuàng)建不同的大型云計(jì)算機(jī)房。這些不同區(qū)域機(jī)房間一般是不能“內(nèi)網(wǎng)連通”的。這些區(qū)域就稱為 一個(gè)Region。

這里存在一個(gè)問題:同一Region機(jī)房是如何實(shí)現(xiàn)同域容災(zāi)的?為了增強(qiáng)容災(zāi)能力,在一個(gè)Region中又 設(shè)置了不同的Availability Zone。這些AZ間實(shí)現(xiàn)了內(nèi)網(wǎng)連通,且用戶可以根據(jù)自己所在的具體的位置自動(dòng) 選擇同域中的不同AZ。當(dāng)用戶所要訪問的AZ出現(xiàn)問題后,系統(tǒng)會(huì)自動(dòng)切換到其它可用的AZ。

例如,AWS將全球劃分為了很多的Region,例如美國(guó)東部區(qū)、美國(guó)西部區(qū)、歐洲區(qū)、非洲開普敦區(qū)、 亞太區(qū)等。像Eureka系統(tǒng)架構(gòu)圖中的us-east-1c、us-east-1d、us-east-1e就是us-east-1這個(gè)Region中 的c、d、e三個(gè)AZ。

再如,阿里云在我國(guó)境內(nèi)的Region有杭州、北京、深圳、青島、香港等,境外Region有亞太東南1區(qū) (新加坡)、亞太東南2區(qū)(悉尼)、亞太東北1區(qū)(東京)等

1.3 Region和AZ需求

假設(shè)某公司的服務(wù)器有Beijing、Shanghai等多個(gè)Region。Beijing這個(gè)Region中存在兩個(gè)AZ,分別是 bj-1與bj-2,每個(gè)AZ中有三臺(tái)Eureka Server。

h-1與h-2兩臺(tái)主機(jī)提供的都是相同的Service服務(wù),根據(jù)地理位置的不同,這兩臺(tái)主機(jī)分別注冊(cè)到了距 離自己最近的不同AZ的Eureka Server。

2.核心類

2.1 客戶端核心類

2.1.1 InstanceInfo-實(shí)例信息類

// 客戶端中,表示自身實(shí)例信息
// 服務(wù)端中,表示實(shí)例存在服務(wù)端注冊(cè)表中的信息
public class InstanceInfo {
    // ......  
    // 客戶端中,表示自己的真實(shí)工作狀態(tài)
    // 服務(wù)端中,表示服務(wù)發(fā)現(xiàn)時(shí)實(shí)例想要暴露給其他實(shí)例的工作狀態(tài),不一定是實(shí)例的真實(shí)工作狀態(tài)
    private volatile InstanceStatus status = InstanceStatus.UP;
    // 覆蓋狀態(tài),服務(wù)端可以根據(jù)一定規(guī)則匹配出 status
    // 外界修改實(shí)例在服務(wù)端中狀態(tài)(比如通過 actuator 修改狀態(tài))就是修改覆蓋狀態(tài)
    private volatile InstanceStatus overriddenStatus = InstanceStatus.UNKNOWN;
    // 判斷實(shí)例信息在服務(wù)端中是否是臟的
    private volatile boolean isInstanceInfoDirty = false;
    // 租約信息
    private volatile LeaseInfo leaseInfo;
    // 記錄實(shí)例信息在服務(wù)端最近一次修改的時(shí)間
    private volatile Long lastUpdatedTimestamp;
    // 記錄實(shí)例信息在客戶端最近一次修改的時(shí)間
    private volatile Long lastDirtyTimestamp;
    // ......
}
  • InstanceStatus-實(shí)例狀態(tài)類
public enum InstanceStatus {
    UP, // 啟動(dòng)狀態(tài),表示實(shí)例對(duì)外正常提供服務(wù)
    DOWN, // 下線狀態(tài),實(shí)例健康檢查失敗時(shí)修改為該狀態(tài)
    STARTING, // 啟動(dòng)中狀態(tài),表示實(shí)例正在初始化啟動(dòng)中
    OUT_OF_SERVICE, // 停止服務(wù)狀態(tài),表示實(shí)例不對(duì)外提供服務(wù)
    UNKNOWN; // 未知狀態(tài)
    // ......
}
  • LeaseInfo 租約信息類
public class LeaseInfo {
    public static final int DEFAULT_LEASE_RENEWAL_INTERVAL = 30;
    public static final int DEFAULT_LEASE_DURATION = 90;
    // 客戶端維護(hù)的心跳間隔時(shí)間
    private int renewalIntervalInSecs = DEFAULT_LEASE_RENEWAL_INTERVAL;
    // 客戶端維護(hù)的租約持續(xù)時(shí)間
    private int durationInSecs = DEFAULT_LEASE_DURATION;
    // 服務(wù)端維護(hù)的實(shí)例注冊(cè)時(shí)間
    private long registrationTimestamp;
    // 服務(wù)端維護(hù)的實(shí)例最近一次更新時(shí)間
    private long lastRenewalTimestamp; 
    // 服務(wù)端維護(hù)的實(shí)例過期清理時(shí)間
    private long evictionTimestamp;
    // 服務(wù)端維護(hù)的實(shí)例啟動(dòng)時(shí)間
    private long serviceUpTimestamp;
    // ......
}

2.1.2 Application

一個(gè)Application實(shí)例保存著一個(gè)特定微服務(wù)的所有提供者實(shí)例

public class Application {
    private static Random shuffleRandom = new Random();
    private String name;
    @XStreamOmitField
    private volatile boolean isDirty = false;
    /**
     * 保存著當(dāng)前name所指定的微服務(wù)名稱的所有InstanceInfo 實(shí)例
     */
    @XStreamImplicit
    private final Set<InstanceInfo> instances;
    private final AtomicReference<List<InstanceInfo>> shuffledInstances;
    // key:instanceId  value:InstanceInfo實(shí)例
    private final Map<String, InstanceInfo> instancesMap;

2.1.3 Applications

該類封裝了來(lái)自于Eureka Server的所有注冊(cè)信息,我們可成為 "客戶端注冊(cè)表"

public class Applications {
    private static class VipIndexSupport {
        final AbstractQueue<InstanceInfo> instances = new ConcurrentLinkedQueue<>();
        final AtomicLong roundRobinIndex = new AtomicLong(0);
        final AtomicReference<List<InstanceInfo>> vipList = new AtomicReference<List<InstanceInfo>>(Collections.emptyList());
        public AtomicLong getRoundRobinIndex() {
            return roundRobinIndex;
        }
        public AtomicReference<List<InstanceInfo>> getVipList() {
            return vipList;
        }
    }
    private static final String STATUS_DELIMITER = "_";
    private String appsHashCode;
    private Long versionDelta;
    @XStreamImplicit
    private final AbstractQueue<Application> applications;
    // key:微服務(wù)名稱 value:Application實(shí)例
    private final Map<String, Application> appNameApplicationMap;
    private final Map<String, VipIndexSupport> virtualHostNameAppMap;
    private final Map<String, VipIndexSupport> secureVirtualHostNameAppMap;
}

2.2 服務(wù)端

2.2.1 AbstractInstanceRegistry

服務(wù)端具體處理客戶端請(qǐng)求(心跳續(xù)租、注冊(cè)、變更狀態(tài)等等)的類

public abstract class AbstractInstanceRegistry implements InstanceRegistry {
    // ......
    // 服務(wù)實(shí)例租約信息
    private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry
            = new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();
    // 覆蓋狀態(tài) map
    protected final ConcurrentMap<String, InstanceStatus> overriddenInstanceStatusMap = CacheBuilder
            .newBuilder().initialCapacity(500)
            .expireAfterAccess(1, TimeUnit.HOURS)
            .<String, InstanceStatus>build().asMap();
    // 最近注冊(cè)隊(duì)列,實(shí)例注冊(cè)到服務(wù)端時(shí)添加
    // 先進(jìn)先出隊(duì)列,滿1000時(shí)移除最先添加的
    private final CircularQueue<Pair<Long, String>> recentRegisteredQueue;
    // 最近下架隊(duì)列,實(shí)例從服務(wù)端下架時(shí)添加
    // 先進(jìn)先出隊(duì)列,滿1000時(shí)移除最先添加的
    private final CircularQueue<Pair<Long, String>> recentCanceledQueue;
    // 最近變更隊(duì)列
    // 有定時(shí)任務(wù)維護(hù)的隊(duì)列,每30s執(zhí)行一次,移除添加進(jìn)該隊(duì)列超過3分鐘的實(shí)例變更信息
    private ConcurrentLinkedQueue<RecentlyChangedItem> recentlyChangedQueue = new ConcurrentLinkedQueue<RecentlyChangedItem>();
    private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    // 讀鎖(處理客戶端注冊(cè)、下架、狀態(tài)變更、刪除狀態(tài)時(shí)使用)
    private final Lock read = readWriteLock.readLock();
    // 寫鎖(處理客戶端拉取增量注冊(cè)表時(shí)使用)
    private final Lock write = readWriteLock.writeLock();
    // 服務(wù)端統(tǒng)計(jì)最近一分鐘預(yù)期收到客戶端實(shí)例心跳續(xù)租的請(qǐng)求數(shù)
    protected volatile int numberOfRenewsPerMinThreshold;
    // 服務(wù)端統(tǒng)計(jì)預(yù)期收到心跳續(xù)租的客戶端實(shí)例數(shù)
    protected volatile int expectedNumberOfClientsSendingRenews;
    // 響應(yīng)緩存
    // 服務(wù)端處理客戶端拉取注冊(cè)表請(qǐng)求時(shí)使用
    protected volatile ResponseCache responseCache;
    // ......
    // 處理注冊(cè)
    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) {...}
    // 處理心跳續(xù)租
    public boolean renew(String appName, String id, boolean isReplication) {...}
    // 處理變更狀態(tài)
    public boolean statusUpdate(String appName, String id,
                                InstanceStatus newStatus, String lastDirtyTimestamp,
                                boolean isReplication) {...}
    // 處理刪除狀態(tài)
    public boolean deleteStatusOverride(String appName, String id,
                                        InstanceStatus newStatus,
                                        String lastDirtyTimestamp,
                                        boolean isReplication) {...}
    // 處理實(shí)例過期清理
    public void evict(long additionalLeaseMs) {...}
    // 處理拉取全量注冊(cè)表(本地全量注冊(cè)表 + 可能包含全部遠(yuǎn)程 region 注冊(cè)表)
    public Application getApplication(String appName, boolean includeRemoteRegion) {...}
    // 處理拉取全量注冊(cè)表(本地全量注冊(cè)表 + 可能包含指定遠(yuǎn)程 region 全量注冊(cè)表)
    public Applications getApplicationsFromMultipleRegions(String[] remoteRegions) {...}
    // 處理拉取增量注冊(cè)表(本地增量注冊(cè)表 + 可能包含指定遠(yuǎn)程 region 增量注冊(cè)表)
    public Applications getApplicationDeltasFromMultipleRegions(String[] remoteRegions) {...}
    ...... 
}
  • Lease-只有服務(wù)端維護(hù)的實(shí)例租約信息類
public class Lease&lt;T&gt; {
    // 實(shí)例下架時(shí)間
    private long evictionTimestamp;
    // 實(shí)例注冊(cè)時(shí)間
    private long registrationTimestamp;
    // 實(shí)例啟動(dòng)時(shí)間
    private long serviceUpTimestamp;
    // 實(shí)例租約過期時(shí)間
    private volatile long lastUpdateTimestamp;
    ......
}
  • ResponseCacheImpl:響應(yīng)緩存實(shí)現(xiàn)類
public class ResponseCacheImpl implements ResponseCache {
    // ......
    // 只讀緩存
    private final ConcurrentMap<Key, Value> readOnlyCacheMap = new ConcurrentHashMap<Key, Value>();
    // 讀寫緩存
    // LoadingCache:Guava 提供的本地緩存,多線程的場(chǎng)景下保證只有一個(gè)線程加載相應(yīng)緩存項(xiàng)
    private final LoadingCache<Key, Value> readWriteCacheMap;
    // 判斷是否使用只讀緩存
    private final boolean shouldUseReadOnlyResponseCache;
    // ......
}

2.2.2 PeerAwareInstanceRegistryImpl

處理集群節(jié)點(diǎn)間相關(guān)操作的實(shí)現(xiàn)類

public class PeerAwareInstanceRegistryImpl extends AbstractInstanceRegistry implements PeerAwareInstanceRegistry {
    // 當(dāng)前服務(wù)端節(jié)點(diǎn)的啟動(dòng)時(shí)間
    private long startupTime = 0;
    // 判斷服務(wù)端啟動(dòng)時(shí)同步集群節(jié)點(diǎn)注冊(cè)表的實(shí)例數(shù)是否為空
    private boolean peerInstancesTransferEmptyOnStartup = true;
    // 最近一分鐘同步復(fù)制給集群節(jié)點(diǎn)的次數(shù) 
    private final MeasuredRate numberOfReplicationsLastMin;
    // 服務(wù)端的相鄰集群節(jié)點(diǎn),配置文件中配置
    protected volatile PeerEurekaNodes peerEurekaNodes;
}

3. Jersey通信框架

Spring Cloud中Eureka Client與Eureka Server的通信,及Eureka Server間的通信,均采用的是Jersey框架。

Jersey框架是一個(gè)開源的RESTful框架,實(shí)現(xiàn)了JAX-RS規(guī)范。該框架的作用與SpringMVC是相同的,其 也是用戶提交URI后,在處理器中進(jìn)行路由匹配,路由到指定的后臺(tái)業(yè)務(wù)。這個(gè)路由功能同樣也是通過 處理器完成的,只不過這里的處理器不叫Controller,而叫Resource。

@Produces({"application/xml", "application/json"})
public class InstanceResource {
    private static final Logger logger = LoggerFactory
            .getLogger(InstanceResource.class);
    private final PeerAwareInstanceRegistry registry;
    private final EurekaServerConfig serverConfig;
    private final String id;
    private final ApplicationResource app;
    InstanceResource(ApplicationResource app, String id, EurekaServerConfig serverConfig, PeerAwareInstanceRegistry registry) {
        this.app = app;
        this.id = id;
        this.serverConfig = serverConfig;
        this.registry = registry;
    }
    ...
}

參考文章

eureka-0.10.11源碼(注釋)

springcloud-source-study學(xué)習(xí)github地址

以上就是Eureka源碼核心類預(yù)備知識(shí)的詳細(xì)內(nèi)容,更多關(guān)于Eureka源碼核心類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring Boot thymeleaf模板引擎的使用詳解

    Spring Boot thymeleaf模板引擎的使用詳解

    這篇文章主要介紹了Spring Boot thymeleaf模板引擎的使用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot激活profiles的幾種方式

    SpringBoot激活profiles的幾種方式

    多環(huán)境是最常見的配置隔離方式之一,可以根據(jù)不同的運(yùn)行環(huán)境提供不同的配置信息來(lái)應(yīng)對(duì)不同的業(yè)務(wù)場(chǎng)景,這篇文章主要介紹了SpringBoot激活profiles的幾種方式,需要的朋友可以參考下
    2019-10-10
  • Spring中TransactionSynchronizationManager的使用詳解

    Spring中TransactionSynchronizationManager的使用詳解

    這篇文章主要介紹了Spring中TransactionSynchronizationManager的使用詳解,TransactionSynchronizationManager是事務(wù)同步管理器,監(jiān)聽事務(wù)的操作,來(lái)實(shí)現(xiàn)在事務(wù)前后可以添加一些指定操作,需要的朋友可以參考下
    2023-09-09
  • 15個(gè)頂級(jí)Java多線程面試題(附答案)

    15個(gè)頂級(jí)Java多線程面試題(附答案)

    這篇文章主要為大家分享了15個(gè)頂級(jí)Java多線程面試題,考察面試者是否有足夠的Java線程與并發(fā)知識(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • SpringBoot分離打Jar包的兩種配置方式

    SpringBoot分離打Jar包的兩種配置方式

    這篇文章主要介紹了SpringBoot分離打Jar包的兩種配置方式,方式一是基于maven-jar-plugin,方式二是基于spring-boot-maven-plugin,文中結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • java圖論普利姆及克魯斯卡算法解決最小生成樹問題詳解

    java圖論普利姆及克魯斯卡算法解決最小生成樹問題詳解

    這篇文章主要為大家介紹了java圖論普利姆算法及克魯斯卡算法解決最小生成樹問題的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Java StringBuilder類原理及常用方法

    Java StringBuilder類原理及常用方法

    這篇文章主要介紹了Java StringBuilder類原理及常用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java由淺入深帶你精通繼承super

    Java由淺入深帶你精通繼承super

    繼承就是子類繼承父類的特征和行為,使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為
    2022-03-03
  • 淺談Java 對(duì)于繼承的初級(jí)理解

    淺談Java 對(duì)于繼承的初級(jí)理解

    下面小編就為大家?guī)?lái)一篇淺談Java 對(duì)于繼承的初級(jí)理解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2016-06-06
  • Java實(shí)例化一個(gè)抽象類對(duì)象的方法教程

    Java實(shí)例化一個(gè)抽象類對(duì)象的方法教程

    大家都知道抽象類無(wú)法實(shí)例化,就無(wú)法創(chuàng)建對(duì)象。所以下面這篇文章主要給大家介紹了關(guān)于Java實(shí)例化一個(gè)抽象類對(duì)象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12

最新評(píng)論