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

Spring的Eureka續(xù)約(心跳檢測)詳解

 更新時(shí)間:2023年11月21日 09:37:51   作者:dalianpai  
這篇文章主要介紹了Spring的Eureka續(xù)約(心跳檢測)詳解,eureka?client每隔一定的時(shí)間,會(huì)給eureka?server發(fā)送心跳,保持心跳,讓eureka?server知道自己還活著,需要的朋友可以參考下

Eureka 續(xù)約 (心跳檢測)

心跳,eureka client每隔一定的時(shí)間,會(huì)給eureka server發(fā)送心跳,保持心跳,讓eureka server知道自己還活著,lease renewal,續(xù)約,心跳.

Eureka-Client 向 Eureka-Server 發(fā)起注冊應(yīng)用實(shí)例成功后獲得租約 ( Lease )。 Eureka-Client 固定間隔向 Eureka-Server 發(fā)起續(xù)租( renew ),避免租約過期。

默認(rèn)情況下,租約有效期為 90 秒,續(xù)租頻率為 30 秒。兩者比例為 1 : 3 ,保證在網(wǎng)絡(luò)異常等情況下,有三次重試的機(jī)會(huì)。

(1)DiscoveryClient初始化的時(shí)候,會(huì)去調(diào)度一堆定時(shí)任務(wù),其中有一個(gè)就是HeartbeatThread,心跳線程

image-20211011172001382

(2)在這里可以看到,默認(rèn)是每隔30秒去發(fā)送一次心跳,每隔30秒執(zhí)行一次HeartbeatTHread線程的邏輯,發(fā)送心跳

(3)這邊的話就是去發(fā)送這個(gè)心跳,走的是EurekaHttpClient的sendHeartbeat()方法,//localhost:8080/v2/apps/ServiceA/i-000000-1,走的是put請求

/**
     * The heartbeat task that renews the lease in the given intervals.
     */
    private class HeartbeatThread implements Runnable {
 
        public void run() {
            if (renew()) {
                lastSuccessfulHeartbeatTimestamp = System.currentTimeMillis();
            }
        }
    }
 
    /**
     * Renew with the eureka service by making the appropriate REST call
     */
    boolean renew() {
        EurekaHttpResponse<InstanceInfo> httpResponse;
        try {
            httpResponse = eurekaTransport.registrationClient.sendHeartBeat(instanceInfo.getAppName(), instanceInfo.getId(), instanceInfo, null);
            logger.debug(PREFIX + "{} - Heartbeat status: {}", appPathIdentifier, httpResponse.getStatusCode());
            if (httpResponse.getStatusCode() == Status.NOT_FOUND.getStatusCode()) {
                REREGISTER_COUNTER.increment();
                logger.info(PREFIX + "{} - Re-registering apps/{}", appPathIdentifier, instanceInfo.getAppName());
                long timestamp = instanceInfo.setIsDirtyWithTime();
                boolean success = register();
                if (success) {
                    instanceInfo.unsetIsDirty(timestamp);
                }
                return success;
            }
            return httpResponse.getStatusCode() == Status.OK.getStatusCode();
        } catch (Throwable e) {
            logger.error(PREFIX + "{} - was unable to send heartbeat!", appPathIdentifier, e);
            return false;
        }
    }

(4)負(fù)責(zé)承接服務(wù)實(shí)例的心跳相關(guān)的這些操作的,是ApplicationsResource,服務(wù)相關(guān)的controller。找到ApplicationResource,再次找到InstanceResource,通過PUT請求,可以找到renewLease方法。

@PUT
    public Response renewLease(
            @HeaderParam(PeerEurekaNode.HEADER_REPLICATION) String isReplication,
            @QueryParam("overriddenstatus") String overriddenStatus,
            @QueryParam("status") String status,
            @QueryParam("lastDirtyTimestamp") String lastDirtyTimestamp) {
        boolean isFromReplicaNode = "true".equals(isReplication);
        boolean isSuccess = registry.renew(app.getName(), id, isFromReplicaNode);
 
        // Not found in the registry, immediately ask for a register
        if (!isSuccess) {
            logger.warn("Not Found (Renew): {} - {}", app.getName(), id);
            return Response.status(Status.NOT_FOUND).build();
        }
        // Check if we need to sync based on dirty time stamp, the client
        // instance might have changed some value
        Response response;
        if (lastDirtyTimestamp != null && serverConfig.shouldSyncWhenTimestampDiffers()) {
            response = this.validateDirtyTimestamp(Long.valueOf(lastDirtyTimestamp), isFromReplicaNode);
            // Store the overridden status since the validation found out the node that replicates wins
            if (response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()
                    && (overriddenStatus != null)
                    && !(InstanceStatus.UNKNOWN.name().equals(overriddenStatus))
                    && isFromReplicaNode) {
                registry.storeOverriddenStatusIfRequired(app.getAppName(), id, InstanceStatus.valueOf(overriddenStatus));
            }
        } else {
            response = Response.ok().build();
        }
        logger.debug("Found (Renew): {} - {}; reply status={}", app.getName(), id, response.getStatus());
        return response;
    }

(5)通過注冊表的renew()方法,進(jìn)去完成服務(wù)續(xù)約,實(shí)際進(jìn)入AbstractInstanceRegistry的renew()方法

/**
     * Marks the given instance of the given app name as renewed, and also marks whether it originated from
     * replication.
     *
     * @see com.netflix.eureka.lease.LeaseManager#renew(java.lang.String, java.lang.String, boolean)
     */
    public boolean renew(String appName, String id, boolean isReplication) {
        RENEW.increment(isReplication);
        Map<String, Lease<InstanceInfo>> gMap = registry.get(appName);
        Lease<InstanceInfo> leaseToRenew = null;
        if (gMap != null) {
            leaseToRenew = gMap.get(id);
        }
        if (leaseToRenew == null) {
            RENEW_NOT_FOUND.increment(isReplication);
            logger.warn("DS: Registry: lease doesn't exist, registering resource: {} - {}", appName, id);
            return false;
        } else {
            InstanceInfo instanceInfo = leaseToRenew.getHolder();
            if (instanceInfo != null) {
                // touchASGCache(instanceInfo.getASGName());
                InstanceStatus overriddenInstanceStatus = this.getOverriddenInstanceStatus(
                        instanceInfo, leaseToRenew, isReplication);
                if (overriddenInstanceStatus == InstanceStatus.UNKNOWN) {
                    logger.info("Instance status UNKNOWN possibly due to deleted override for instance {}"
                            + "; re-register required", instanceInfo.getId());
                    RENEW_NOT_FOUND.increment(isReplication);
                    return false;
                }
                if (!instanceInfo.getStatus().equals(overriddenInstanceStatus)) {
                    logger.info(
                            "The instance status {} is different from overridden instance status {} for instance {}. "
                                    + "Hence setting the status to overridden status", instanceInfo.getStatus().name(),
                                    overriddenInstanceStatus.name(),
                                    instanceInfo.getId());
                    instanceInfo.setStatusWithoutDirty(overriddenInstanceStatus);
 
                }
            }
            // 新增 續(xù)租每分鐘次數(shù)
            renewsLastMin.increment();
            // 設(shè)置 租約最后更新時(shí)間(續(xù)租)
            leaseToRenew.renew();
            return true;
        }
    }

實(shí)際的服務(wù)續(xù)約的邏輯,其實(shí)就是在Lease對象中,更新一下lastUpdateTimestamp這個(gè)時(shí)間戳,每次續(xù)約,就更新一下,duration這里加了一遍,也是eureka的bug,但是官網(wǎng)并不做修改。

public void renew() {
    lastUpdateTimestamp = System.currentTimeMillis() + duration;
}

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

相關(guān)文章

  • 淺談Java 線程池線程數(shù)怎么定

    淺談Java 線程池線程數(shù)怎么定

    在 Java 后端開發(fā)中,線程池幾乎是必不可少的基礎(chǔ)組件,但線程數(shù)該如何配置卻常常讓人困惑,不同任務(wù)對 CPU 的使用方式差異很大,直接決定了線程池的合理線程數(shù),本文從 IO 密集型、CPU 密集型以及混合型任務(wù)三種常見場景出發(fā),下面就來詳細(xì)了解一下
    2026-02-02
  • 基于javaweb+jsp的游泳館會(huì)員管理系統(tǒng)(附源碼)

    基于javaweb+jsp的游泳館會(huì)員管理系統(tǒng)(附源碼)

    這篇文章主要介紹了基于javaweb+jsp的游泳館會(huì)員管理系統(tǒng),開發(fā)工具eclipse/idea/myeclipse/sts等均可配置運(yùn)行,此源代碼社和課程設(shè)計(jì),大作業(yè)及畢業(yè)設(shè)計(jì)項(xiàng)目,需要的朋友可以參考下
    2022-04-04
  • MP(MyBatis-Plus)實(shí)現(xiàn)樂觀鎖更新功能的示例代碼

    MP(MyBatis-Plus)實(shí)現(xiàn)樂觀鎖更新功能的示例代碼

    這篇文章主要介紹了MP(MyBatis-Plus)實(shí)現(xiàn)樂觀鎖更新功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列(堆)圖文詳解

    Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列(堆)圖文詳解

    優(yōu)先級隊(duì)列是比棧和隊(duì)列更專用的結(jié)構(gòu),在多數(shù)情況下都非常有用,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列(堆)的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Java HashMap算法原理詳細(xì)講解

    Java HashMap算法原理詳細(xì)講解

    在java開發(fā)中,HashMap是最常用、最常見的集合容器類之一,文中通過示例代碼介紹HashMap為啥要二次Hash,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • 使用logstash同步mysql數(shù)據(jù)到elasticsearch實(shí)現(xiàn)

    使用logstash同步mysql數(shù)據(jù)到elasticsearch實(shí)現(xiàn)

    這篇文章主要為大家介紹了使用logstash同步mysql數(shù)據(jù)到elasticsearch實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • spring的data派生查詢機(jī)制的實(shí)現(xiàn)

    spring的data派生查詢機(jī)制的實(shí)現(xiàn)

    SpringData的派生查詢是一種通過方法名約定自動(dòng)生成數(shù)據(jù)庫查詢的機(jī)制,無需手動(dòng)編寫SQL或JPQL,下面就來介紹一下spring data派生查詢的實(shí)現(xiàn),感興趣的可以了解一下
    2025-03-03
  • Java實(shí)現(xiàn)動(dòng)態(tài)驗(yàn)證碼生成

    Java實(shí)現(xiàn)動(dòng)態(tài)驗(yàn)證碼生成

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)動(dòng)態(tài)驗(yàn)證碼生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Maven Repository倉庫的具體使用

    Maven Repository倉庫的具體使用

    本文主要介紹了Maven Repository倉庫的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類型

    詳解SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類型

    本文主要介紹了SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類型,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

沅陵县| 鹤峰县| 屏边| 增城市| 镇康县| 泽州县| 开平市| 仙居县| 漳浦县| 南昌市| 肇东市| 孙吴县| 榆林市| 马龙县| 乌什县| 上饶市| 阜南县| 乌鲁木齐市| 桂阳县| 普兰店市| 阳朔县| 左权县| 德庆县| 木兰县| 洛阳市| 邻水| 体育| 房产| 中西区| 天长市| 白银市| 哈尔滨市| 苏尼特左旗| 丁青县| 淮南市| 上思县| 红原县| 稻城县| 阳泉市| 南召县| 屏东市|