最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中Eureka的自我保護詳解

 更新時間:2023年11月21日 09:39:05   作者:dalianpai  
這篇文章主要介紹了Spring中Eureka的自我保護詳解,當Eureka Server節(jié)點在短時間內(nèi)丟失過多客戶端時(可能發(fā)生了網(wǎng)絡(luò)分區(qū)故障),那么這個節(jié)點就會進入自我保護模式,一旦進入該模式,Eureka Server就會保護服務(wù)注冊表中的信息,需要的朋友可以參考下

Eureka的自我保護

當Eureka Server節(jié)點在短時間內(nèi)丟失過多客戶端時(可能發(fā)生了網(wǎng)絡(luò)分區(qū)故障),那么這個節(jié)點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務(wù)注冊表中的信息,不再刪除服務(wù)注冊表中的數(shù)據(jù)(也就是不會注銷任何微服務(wù))。當網(wǎng)絡(luò)故障恢復(fù)后,該Eureka Server節(jié)點會自動退出自我保護模式。

如果想研究自我保護機制,那就要從服務(wù)下線那里,因為自我保護來決定是讓eureka進行剔除服務(wù)的,下線代碼如下:

public void evict(long additionalLeaseMs) {
        logger.debug("Running the evict task");
 
        //是否允許主動摘除故障的服務(wù)實例
        if (!isLeaseExpirationEnabled()) {
            logger.debug("DS: lease expiration is currently disabled.");
            return;
        }
 
       ....
 }
@Override
    public boolean isLeaseExpirationEnabled() {
        //默認是true,關(guān)閉自我保護機制的話,這個方法永遠返回true,隨時都可以清除故障的服務(wù)實例。
        if (!isSelfPreservationModeEnabled()) {
            // The self preservation mode is disabled, hence allowing the instances to expire.
            return true;
        }
        //numberOfRenewsPerMinThreshold  這個是我期望的一分鐘發(fā)送多少心跳。
        //getNumOfRenewsInLastMin 這個是上一分鐘一共發(fā)來多少心跳
        return numberOfRenewsPerMinThreshold > 0 && getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold;
    }

觸發(fā)的機制就是說,如果最近一分鐘發(fā)過來的心跳小于期望的值,這進入心跳保護機制。那么就來看一下,這個期望的值是什么算出來的。

首先在初始化的時候,就會給他先賦值,默認值為其他server拉著的注冊表信息的數(shù)量乘以2

// EurekaBootStrap.java
protected void initEurekaServerContext() throws Exception {
 
    // ... 省略其它代碼
 
    // 【2.2.10】從其他 Eureka-Server 拉取注冊信息
    // Copy registry from neighboring eureka node
    int registryCount = registry.syncUp();
    registry.openForTraffic(applicationInfoManager, registryCount);
    
    // ... 省略其它代碼
}
 
// PeerAwareInstanceRegistryImpl.java
@Override
public void openForTraffic(ApplicationInfoManager applicationInfoManager, int count) {
   // Renewals happen every 30 seconds and for a minute it should be a factor of 2.
   this.expectedNumberOfRenewsPerMin = count * 2;
   this.numberOfRenewsPerMinThreshold =
           (int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold());

然后再上線,下線,故障的時候都會對他進行修改。

image-20211011213620374

由于以前的版本為硬編碼,是直接乘以2的,近期的版本,對代碼進行了優(yōu)化,因為心跳是30秒發(fā)來一次,所以直接用60/30,然后在乘以0.85。

為什么乘以續(xù)租百分比

低于這個百分比,意味著開啟自我保護機制。默情況下,eureka.renewalPercentThreshold = 0.85 。

如果你真的調(diào)整了續(xù)租頻率,可以等比去續(xù)租百分比,以保證合適的觸發(fā)自我保護機制的閥值。另外,你需要注意,續(xù)租頻率是 Client 級別,續(xù)租百分比是 Server 級別。

protected void updateRenewsPerMinThreshold() {
        this.numberOfRenewsPerMinThreshold = (int) (this.expectedNumberOfClientsSendingRenews
                * (60.0 / serverConfig.getExpectedClientRenewalIntervalSeconds())
                * serverConfig.getRenewalPercentThreshold());
    }

以前的代碼是有bug的,只對下線的代碼進行了修改,故障是沒有的,近期版本也做了修復(fù)。把剔除服務(wù)的相關(guān)代碼都抽取了出來了,形成了internalCancel方法,被下面的2個方法調(diào)用,在它的方法里,做了減法。

image-20211011213851595

image-20211011214105920

定時更新

Eureka-Server 時重新計算 numberOfRenewsPerMinThreshold 、expectedNumberOfRenewsPerMin 。

實現(xiàn)代碼如下:

// PeerAwareInstanceRegistryImpl.java
private void scheduleRenewalThresholdUpdateTask() {
   timer.schedule(new TimerTask() {
                      @Override
                      public void run() {
                          updateRenewalThreshold();
                      }
                  }, serverConfig.getRenewalThresholdUpdateIntervalMs(),
           serverConfig.getRenewalThresholdUpdateIntervalMs());
}
 
// AbstractInstanceRegistry.java
/**
* 自我保護機鎖
*
* 當計算如下參數(shù)時使用:
*  1. {@link #numberOfRenewsPerMinThreshold}
*  2. {@link #expectedNumberOfRenewsPerMin}
*/
protected final Object lock = new Object();
 
private void updateRenewalThreshold() {
   try {
       // 計算 應(yīng)用實例數(shù)
       Applications apps = eurekaClient.getApplications();
       int count = 0;
       for (Application app : apps.getRegisteredApplications()) {
           for (InstanceInfo instance : app.getInstances()) {
               if (this.isRegisterable(instance)) {
                   ++count;
               }
           }
       }
       // 計算 expectedNumberOfRenewsPerMin 、 numberOfRenewsPerMinThreshold 參數(shù)
       synchronized (lock) {
           // Update threshold only if the threshold is greater than the
           // current expected threshold of if the self preservation is disabled.
           if ((count * 2) > (serverConfig.getRenewalPercentThreshold() * numberOfRenewsPerMinThreshold)
                   || (!this.isSelfPreservationModeEnabled())) {
               this.expectedNumberOfRenewsPerMin = count * 2;
               this.numberOfRenewsPerMinThreshold = (int) ((count * 2) * serverConfig.getRenewalPercentThreshold());
           }
       }
       logger.info("Current renewal threshold is : {}", numberOfRenewsPerMinThreshold);
   } catch (Throwable e) {
       logger.error("Cannot update renewal threshold", e);
   }
}

Registry注冊表,默認是15分鐘,會跑一次定時任務(wù),算一下服務(wù)實例的數(shù)量,如果從別的eureka server拉取到的服務(wù)實例的數(shù)量,大于當前的服務(wù)實例的數(shù)量,會重新計算一下,主要是跟其他的eureka server做一下同步

到此這篇關(guān)于Spring中Eureka的自我保護詳解的文章就介紹到這了,更多相關(guān)Eureka的自我保護內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java反射調(diào)用方法NoSuchMethodException的解決方案

    java反射調(diào)用方法NoSuchMethodException的解決方案

    這篇文章主要介紹了java反射調(diào)用方法NoSuchMethodException的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot 增量部署發(fā)布的實現(xiàn)步驟

    SpringBoot 增量部署發(fā)布的實現(xiàn)步驟

    本文介紹了通過拆分項目jar包和使用類加載器實現(xiàn)Spring Boot的增量部署,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • Java Scanner 類的使用小結(jié)

    Java Scanner 類的使用小結(jié)

    在筆試編程過程中,關(guān)于數(shù)據(jù)的讀取如果迷迷糊糊,那后來的編程即使想法很對,實現(xiàn)很好,也是徒勞,于是在這里認真總結(jié)了Java Scanner 類的使用,需要的朋友可以參考下
    2018-10-10
  • spring boot idea maven依賴找不到問題處理方法

    spring boot idea maven依賴找不到問題處理方法

    這篇文章主要介紹了spring boot idea 偶爾maven依賴找不到問題,這里總結(jié)了幾種處理方法,方便嘗試排查,對spring boot idea  maven依賴找不到問題感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • Java中List轉(zhuǎn)字符串的5種方法解析

    Java中List轉(zhuǎn)字符串的5種方法解析

    在Java中將一個List轉(zhuǎn)換為字符串有多種方法,下面這篇文章主要給大家介紹了關(guān)于Java中List轉(zhuǎn)字符串的5種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • MyBatis使用自定義TypeHandler轉(zhuǎn)換類型的實現(xiàn)方法

    MyBatis使用自定義TypeHandler轉(zhuǎn)換類型的實現(xiàn)方法

    這篇文章主要介紹了MyBatis使用自定義TypeHandler轉(zhuǎn)換類型的實現(xiàn)方法,本文介紹使用TypeHandler 實現(xiàn)日期類型的轉(zhuǎn)換,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 解讀Spring?Bean的作用域

    解讀Spring?Bean的作用域

    這篇文章主要介紹了解讀Spring?Bean的作用域,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 解決SpringMvc中普通類注入Service為null的問題

    解決SpringMvc中普通類注入Service為null的問題

    這篇文章主要介紹了解決SpringMvc中普通類注入Service為null的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 深入了解Java中Synchronized關(guān)鍵字的實現(xiàn)原理

    深入了解Java中Synchronized關(guān)鍵字的實現(xiàn)原理

    synchronized是JVM的內(nèi)置鎖,基于Monitor機制實現(xiàn),每一個對象都有一個與之關(guān)聯(lián)的監(jiān)視器?(Monitor),這個監(jiān)視器充當了一種互斥鎖的角色,本文就詳細聊一聊Synchronized關(guān)鍵字的實現(xiàn)原理,需要的朋友可以參考下
    2023-06-06
  • JDK完全卸載超詳細步驟

    JDK完全卸載超詳細步驟

    這篇文章主要給大家介紹了關(guān)于JDK完全卸載超詳細步驟的相關(guān)資料,在安裝JDK之前,最好將原來可能安裝過的JDK卸載掉,以免影響到新JDK的使用,需要的朋友可以參考下
    2023-08-08

最新評論

鄱阳县| 乌苏市| 巴东县| 密山市| 祁东县| 吉隆县| 高碑店市| 玉山县| 赣州市| 井研县| 无棣县| 株洲县| 绥化市| 巴彦淖尔市| 抚宁县| 房产| 聂拉木县| 普兰县| 耒阳市| 安泽县| 新源县| 甘洛县| 灌南县| 镇巴县| 全南县| 东光县| 四川省| 武川县| 株洲县| 区。| 蚌埠市| 丰原市| 洛宁县| 金秀| 双流县| 托克逊县| 尉氏县| 洛南县| 海淀区| 林州市| 阳信县|