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

Spring中Eureka的服務(wù)下線詳解

 更新時間:2023年11月21日 09:42:49   作者:dalianpai  
這篇文章主要介紹了Spring中Eureka的服務(wù)下線詳解,根據(jù)默認的策略,如果在一定的時間內(nèi),客戶端沒有向注冊中心發(fā)送續(xù)約請求,那么注冊中心就會將該實例從注冊中心移除,需要的朋友可以參考下

Eureka 下線

// DiscoveryClient.java
   @PreDestroy
    @Override
    public synchronized void shutdown() {
        if (isShutdown.compareAndSet(false, true)) {
            logger.info("Shutting down DiscoveryClient ...");
 
            if (statusChangeListener != null && applicationInfoManager != null) {
                applicationInfoManager.unregisterStatusChangeListener(statusChangeListener.getId());
            }
 
            cancelScheduledTasks();
 
            // If APPINFO was registered
            if (applicationInfoManager != null
                    && clientConfig.shouldRegisterWithEureka()
                    && clientConfig.shouldUnregisterOnShutdown()) {
                //講服務(wù)實例的狀態(tài)設(shè)置為DOWN
                applicationInfoManager.setInstanceStatus(InstanceStatus.DOWN);
                //取消注冊
                unregister();
            }
 
            //關(guān)閉網(wǎng)絡(luò)通信組件
            if (eurekaTransport != null) {
                eurekaTransport.shutdown();
            }
 
            //關(guān)閉監(jiān)聽器
            heartbeatStalenessMonitor.shutdown();
            registryStalenessMonitor.shutdown();
 
            Monitors.unregisterObject(this);
 
            logger.info("Completed shut down of DiscoveryClient");
        }
    }
  • 調(diào)用 ApplicationInfoManager#setInstanceStatus(...) 方法,設(shè)置應(yīng)用實例為關(guān)閉( DOWN )。
  • 調(diào)用 #unregister() 方法,實現(xiàn)代碼如下:
// DiscoveryClient.java
void unregister() {
   // It can be null if shouldRegisterWithEureka == false
   if(eurekaTransport != null && eurekaTransport.registrationClient != null) {
       try {
           logger.info("Unregistering ...");
           EurekaHttpResponse<Void> httpResponse = eurekaTransport.registrationClient.cancel(instanceInfo.getAppName(), instanceInfo.getId());
           logger.info(PREFIX + appPathIdentifier + " - deregister  status: " + httpResponse.getStatusCode());
       } catch (Exception e) {
           logger.error(PREFIX + appPathIdentifier + " - de-registration failed" + e.getMessage(), e);
       }
   }
}
 
// AbstractJerseyEurekaHttpClient.java
@Override
public EurekaHttpResponse<Void> cancel(String appName, String id) {
    String urlPath = "apps/" + appName + '/' + id;
    ClientResponse response = null;
    try {
        Builder resourceBuilder = jerseyClient.resource(serviceUrl).path(urlPath).getRequestBuilder();
        addExtraHeaders(resourceBuilder);
        response = resourceBuilder.delete(ClientResponse.class);
        return anEurekaHttpResponse(response.getStatus()).headers(headersOf(response)).build();
    } finally {
        if (logger.isDebugEnabled()) {
            logger.debug("Jersey HTTP DELETE {}/{}; statusCode={}", serviceUrl, urlPath, response == null ? "N/A" : response.getStatus());
        }
        if (response != null) {
            response.close();
        }
    }
}
  • 調(diào)用 AbstractJerseyEurekaHttpClient#cancel(...) 方法,DELETE 請求 Eureka-Server 的 apps/${APP_NAME}/${INSTANCE_INFO_ID} 接口,實現(xiàn)應(yīng)用實例信息的下線。

com.netflix.eureka.resources.InstanceResource,處理單個應(yīng)用實例信息的請求操作的 Resource ( Controller )。

下線應(yīng)用實例信息的請求,映射 InstanceResource#cancelLease() 方法,實現(xiàn)代碼如下:

@DELETE
public Response cancelLease(
       @HeaderParam(PeerEurekaNode.HEADER_REPLICATION) String isReplication) {
   // 下線
   boolean isSuccess = registry.cancel(app.getName(), id, "true".equals(isReplication));
 
   if (isSuccess) { // 下線成功
       logger.debug("Found (Cancel): " + app.getName() + " - " + id);
       return Response.ok().build();
   } else { // 下線成功
       logger.info("Not Found (Cancel): " + app.getName() + " - " + id);
       return Response.status(Status.NOT_FOUND).build();
   }
}

調(diào)用 AbstractInstanceRegistry#cancel(...) 方法,下線應(yīng)用實例信息,實現(xiàn)代碼如下:

@Override
    public boolean cancel(String appName, String id, boolean isReplication) {
        return internalCancel(appName, id, isReplication);
    }
 
    /**
     * {@link #cancel(String, String, boolean)} method is overridden by {@link PeerAwareInstanceRegistry}, so each
     * cancel request is replicated to the peers. This is however not desired for expires which would be counted
     * in the remote peers as valid cancellations, so self preservation mode would not kick-in.
     */
    protected boolean internalCancel(String appName, String id, boolean isReplication) {
        read.lock();
        try {
            CANCEL.increment(isReplication);
            Map<String, Lease<InstanceInfo>> gMap = registry.get(appName);
            Lease<InstanceInfo> leaseToCancel = null;
            if (gMap != null) {
                leaseToCancel = gMap.remove(id);
            }
 
            //將服務(wù)實例加入最近下線的queue中
            recentCanceledQueue.add(new Pair<Long, String>(System.currentTimeMillis(), appName + "(" + id + ")"));
            InstanceStatus instanceStatus = overriddenInstanceStatusMap.remove(id);
            if (instanceStatus != null) {
                logger.debug("Removed instance id {} from the overridden map which has value {}", id, instanceStatus.name());
            }
            if (leaseToCancel == null) {
                CANCEL_NOT_FOUND.increment(isReplication);
                logger.warn("DS: Registry: cancel failed because Lease is not registered for: {}/{}", appName, id);
                return false;
            } else {
                //調(diào)用cancel,保存一個時間戳
                leaseToCancel.cancel();
 
                InstanceInfo instanceInfo = leaseToCancel.getHolder();
                String vip = null;
                String svip = null;
                if (instanceInfo != null) {
                    instanceInfo.setActionType(ActionType.DELETED);
                    //丟到最近改變的隊列中
                    recentlyChangedQueue.add(new RecentlyChangedItem(leaseToCancel));
                    //設(shè)置了最近一次變更的時間戳
                    instanceInfo.setLastUpdatedTimestamp();
                    vip = instanceInfo.getVIPAddress();
                    svip = instanceInfo.getSecureVipAddress();
 
                    //服務(wù)的注冊,下線,過期,都會代表這個服務(wù)實例變化了,都會將自己放入最近改變的隊列中
                    //這個最近改變的隊列,只會保留最近3分鐘的實例
                    //所以說eureka client拉取增量注冊表的時候,其實就是拉取最近3分鐘有變化的服務(wù)實例。
                }
                invalidateCache(appName, vip, svip);
                logger.info("Cancelled instance {}/{} (replication={})", appName, id, isReplication);
            }
        } finally {
            read.unlock();
        }
 
        synchronized (lock) {
            if (this.expectedNumberOfClientsSendingRenews > 0) {
                // Since the client wants to cancel it, reduce the number of clients to send renews.
                //修改期望值
                this.expectedNumberOfClientsSendingRenews = this.expectedNumberOfClientsSendingRenews - 1;
                updateRenewsPerMinThreshold();
            }
        }
 
        return true;
    }

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

相關(guān)文章

  • 一文詳解如何遷移IntelliJ?IDEA的配置插件目錄

    一文詳解如何遷移IntelliJ?IDEA的配置插件目錄

    這篇文章主要給大家介紹了關(guān)于如何遷移IntelliJ?IDEA的配置插件目錄,指導用戶將默認配置目錄(config/system)從C盤遷移到其他盤,通過修改idea.properties文件、創(chuàng)建新目錄結(jié)構(gòu)、復制文件夾并驗證操作,需要的朋友可以參考下
    2025-05-05
  • 分頁技術(shù)原理與實現(xiàn)之Java+Oracle代碼實現(xiàn)分頁(二)

    分頁技術(shù)原理與實現(xiàn)之Java+Oracle代碼實現(xiàn)分頁(二)

    這篇文章主要介紹了分頁技術(shù)原理與實現(xiàn)的第二篇:Java+Oracle代碼實現(xiàn)分頁,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 在Android中使用WebView在線查看PDF文件的方法示例

    在Android中使用WebView在線查看PDF文件的方法示例

    在Android應(yīng)用開發(fā)中,有時我們需要在客戶端展示PDF文件,以便用戶可以閱讀或交互,這篇文章主要介紹了在Android中使用WebView在線查看PDF文件的方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-09-09
  • SpringBoot中的@ConditionalOnMissingBean注解使用詳解

    SpringBoot中的@ConditionalOnMissingBean注解使用詳解

    這篇文章主要介紹了SpringBoot中的@ConditionalOnMissingBean注解使用詳解,@ConditionalOnMissingBean作用在@Bean定義上,也就是說在容器加載它作用的Bean時,檢查容器中是否存在目標類型,需要的朋友可以參考下
    2024-01-01
  • Springboot web項目打包實現(xiàn)過程解析

    Springboot web項目打包實現(xiàn)過程解析

    這篇文章主要介紹了Springboot web項目打包實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 深入解析Java中的InterruptedException從異常處理到最佳實踐方案

    深入解析Java中的InterruptedException從異常處理到最佳實踐方案

    在Java多線程編程中,InterruptedException 是一個常見但又容易被忽視的異常,本文將通過一個實際的日志案例,分析 InterruptedException 的產(chǎn)生原因、影響,并提供合理的解決方案和最佳實踐,感興趣的朋友一起看看吧
    2025-06-06
  • 使用JSONObject.toJSONString 過濾掉值為空的key

    使用JSONObject.toJSONString 過濾掉值為空的key

    這篇文章主要介紹了使用JSONObject.toJSONString 過濾掉值為空的key,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java Dubbo框架知識點梳理

    Java Dubbo框架知識點梳理

    這篇文章主要介紹了Java Dubbo框架知識點梳理,通過詳細的文字講解和代碼實例,梳理了Dubbo這個框架,需要的朋友可以參考下
    2021-06-06
  • Java下載項目中靜態(tài)文件方式

    Java下載項目中靜態(tài)文件方式

    這篇文章主要介紹了Java下載項目中靜態(tài)文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Mybatis源碼解析之初始化分析

    Mybatis源碼解析之初始化分析

    這篇文章主要介紹了Mybatis源碼解析之初始化分析,Mybatis的初始化過程就是mybatis配置文件的解析過程并將解析結(jié)果保存到Configuration類。,需要的朋友可以參考下
    2024-01-01

最新評論

定结县| 皮山县| 黑水县| 蓝山县| 汉中市| 邢台市| 山东| 马公市| 望都县| 饶阳县| 澳门| 温宿县| 乐业县| 无棣县| 邳州市| 宝坻区| 剑川县| 宜良县| 余江县| 安平县| 乐山市| 海宁市| 丹江口市| 沾化县| 正镶白旗| 宜丰县| 玛曲县| 大方县| 广丰县| 卓资县| 博爱县| 中超| 青阳县| 顺平县| 汝阳县| 社会| 盐津县| 吉林省| 惠州市| 永兴县| 广安市|