国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spring eureka集群相關(guān)問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了spring eureka集群相關(guān)問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、集群節(jié)點(diǎn)信息如何更新?

EurekaServer節(jié)點(diǎn)啟動(dòng)的時(shí)候,DefaultEurekaServerContext.init()方法調(diào)用PeerEurekaNodes.start()方法,start方法中resolvePeerUrls()會(huì)從配置文件讀取serviceUrl屬性值獲得集群最新節(jié)點(diǎn)信息,通過(guò)updatePeerEurekaNodes()方法將最新節(jié)點(diǎn)信息更新到PeerEurekaNodes類的屬性peerEurekaNodes和peerEurekaNodeUrls中。

PeerEurekaNodes.start()還提供了一個(gè)更新節(jié)點(diǎn)信息的定時(shí)任務(wù),每隔PeerEurekaNodesUpdateIntervalMs (默認(rèn)10min) 時(shí)間執(zhí)行一次。

spring eureka集群相關(guān)問(wèn)題,spring,eureka,java,集群同步,微服務(wù)

針對(duì)上述這個(gè)過(guò)程,需要注意的是(網(wǎng)上很多文章表述有誤):peerEurekaNodesUpdateIntervalMs這個(gè)參數(shù)并不是集群節(jié)點(diǎn)注冊(cè)信息的同步間隔時(shí)間。為什么這么說(shuō)呢?我們可以看上圖中的定時(shí)任務(wù)peersUpdateTask做了什么事情即可,其實(shí)只要看updatePeerEurekaNodes(resolvePeerUrls())做了什么即可。

通過(guò)源碼跟蹤:resolvePeerUrls()方法默認(rèn)即執(zhí)行了EndpointUtils.getServiceUrlsFromConfig(),即從配置文件讀取服務(wù)節(jié)點(diǎn)urls信息。updatePeerEurekaNodes()方法則把獲取得到的urls與之前urls信息進(jìn)行對(duì)比,該新增的放到新增list,該刪除的放到刪除list,如果既沒(méi)有新增的節(jié)點(diǎn)也沒(méi)有待刪除的節(jié)點(diǎn),則返回不做任何處理。下面是代碼:

spring eureka集群相關(guān)問(wèn)題,spring,eureka,java,集群同步,微服務(wù)

針對(duì)要?jiǎng)h除的節(jié)點(diǎn),處理方式是從節(jié)點(diǎn)列表移除,同時(shí)調(diào)用該節(jié)點(diǎn)的shutDown方法;針對(duì)要新增的節(jié)點(diǎn),則加入到節(jié)點(diǎn)列表中,并創(chuàng)建新的節(jié)點(diǎn),調(diào)用方法createPeerEurekaNode(String peerEurekaNodeUrl);創(chuàng)建節(jié)點(diǎn)最終調(diào)用了構(gòu)造方法:

new PeerEurekaNode(registry, targetHost, peerEurekaNodeUrl, replicationClient, serverConfig);

上述構(gòu)造方法會(huì)從服務(wù)其他節(jié)點(diǎn)獲取注冊(cè)服務(wù)信息同步到新創(chuàng)建的服務(wù)節(jié)點(diǎn)中。

那么接下來(lái)就要問(wèn)第二個(gè)問(wèn)題了。

二、注冊(cè)服務(wù)信息如何在集群節(jié)點(diǎn)中同步?

注冊(cè)服務(wù)信息在集群節(jié)點(diǎn)中的同步有兩種場(chǎng)景:一種是新增服務(wù)節(jié)點(diǎn)如何從其他服務(wù)節(jié)點(diǎn)同步服務(wù)注冊(cè)信息;另一種是穩(wěn)定的集群中,各節(jié)點(diǎn)之間是如何同步服務(wù)注冊(cè)信息。

我們先來(lái)看第一種場(chǎng)景,新增節(jié)點(diǎn)如何從其他服務(wù)節(jié)點(diǎn)同步服務(wù)注冊(cè)信息。

(1)Eureka Server節(jié)點(diǎn)啟動(dòng)時(shí)的服務(wù)同步

spring eureka集群相關(guān)問(wèn)題,spring,eureka,java,集群同步,微服務(wù)

Eureka Server啟動(dòng)時(shí),EurekaServerBootStrap調(diào)用PeerAwareInstanceRegistryImpl.syncUp(),同步注冊(cè)服務(wù)信息。

// Copy registry from neighboring eureka node
int registryCount = this.registry.syncUp();
this.registry.openForTraffic(this.applicationInfoManager, registryCount);

syncUp()進(jìn)行注冊(cè)服務(wù)信息的同步:

    /**
     * Populates the registry information from a peer eureka node. This
     * operation fails over to other nodes until the list is exhausted if the
     * communication fails.
     */
    @Override
    public int syncUp() {
        // Copy entire entry from neighboring DS node
        int count = 0;
?
        for (int i = 0; ((i < serverConfig.getRegistrySyncRetries()) && (count == 0)); i++) {
            if (i > 0) {
                try {
                    Thread.sleep(serverConfig.getRegistrySyncRetryWaitMs());
                } catch (InterruptedException e) {
                    logger.warn("Interrupted during registry transfer..");
                    break;
                }
            }
            Applications apps = eurekaClient.getApplications();
            for (Application app : apps.getRegisteredApplications()) {
                for (InstanceInfo instance : app.getInstances()) {
                    try {
                        if (isRegisterable(instance)) {
                            register(instance, instance.getLeaseInfo().getDurationInSecs(), true);
                            count++;
                        }
                    } catch (Throwable t) {
                        logger.error("During DS init copy", t);
                    }
                }
            }
        }
        return count;
    }

首先會(huì)從EurekaClient.getApplications獲取所有的注冊(cè)服務(wù)信息,然后調(diào)用register()進(jìn)行服務(wù)注冊(cè)。

如果同步失敗,則會(huì)sleep serverConfig.getRegistrySyncRetryWaitMs()后,再次進(jìn)行同步。

同步完成后,調(diào)用PeerAwareInstanceRegistryImpl.openForTraffic()方法,進(jìn)行自我保護(hù)閥值的計(jì)算:

   public void openForTraffic(ApplicationInfoManager applicationInfoManager, int count) {
        // Renewals happen every 30 seconds and for a minute it should be a factor of 2.
        this.expectedNumberOfClientsSendingRenews = count;
        updateRenewsPerMinThreshold();
        logger.info("Got {} instances from neighboring DS node", count);
        logger.info("Renew threshold is: {}", numberOfRenewsPerMinThreshold);
        this.startupTime = System.currentTimeMillis();
        if (count > 0) {
            this.peerInstancesTransferEmptyOnStartup = false;
        }
        DataCenterInfo.Name selfName = applicationInfoManager.getInfo().getDataCenterInfo().getName();
        boolean isAws = Name.Amazon == selfName;
        if (isAws && serverConfig.shouldPrimeAwsReplicaConnections()) {
            logger.info("Priming AWS connections for all replicas..");
            primeAwsReplicas(applicationInfoManager);
        }
        logger.info("Changing status to UP");
        applicationInfoManager.setInstanceStatus(InstanceStatus.UP);
        super.postInit();
    }

至此,Eureka Server啟動(dòng)時(shí)的節(jié)點(diǎn)復(fù)制就進(jìn)行完了。

備注

最大同步重試次數(shù)=serverConfig.getRegistrySyncRetries(),默認(rèn)5次。

同步失敗后每次同步的間隔時(shí)間=serverConfig.getRegistrySyncRetryWaitMs(),默認(rèn)30s。

如果啟動(dòng)時(shí)同步服務(wù)注冊(cè)信息失敗,一段時(shí)間不對(duì)外提供服務(wù)注冊(cè)功能,waitTimeInMsWhenSyncEmpty,默認(rèn)5min。

第二種場(chǎng)景:

(2)Eureka Server接收到Register、renew、cancel時(shí)的服務(wù)同步

spring eureka集群相關(guān)問(wèn)題,spring,eureka,java,集群同步,微服務(wù)

處理Register、renew、cancel同步時(shí)比較復(fù)雜,包括好幾個(gè)隊(duì)列的轉(zhuǎn)換處理以及異常處理。這里算是個(gè)簡(jiǎn)圖吧,省略了隊(duì)列的轉(zhuǎn)換和異常處理。

Eureka Server接收到Register、renew或cancel事件后,執(zhí)行向其他節(jié)點(diǎn)同步:

 /**
     * Replicates all eureka actions to peer eureka nodes except for replication
     * traffic to this node.
     *
     */
    private void replicateToPeers(Action action, String appName, String id,
                                  InstanceInfo info /* optional */,
                                  InstanceStatus newStatus /* optional */, boolean isReplication) {
        Stopwatch tracer = action.getTimer().start();
        try {
            if (isReplication) {
                numberOfReplicationsLastMin.increment();
            }
            // If it is a replication already, do not replicate again as this will create a poison replication
            if (peerEurekaNodes == Collections.EMPTY_LIST || isReplication) {
                return;
            }
?
            for (final PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) {
                // If the url represents this host, do not replicate to yourself.
                if (peerEurekaNodes.isThisMyUrl(node.getServiceUrl())) {
                    continue;
                }
                replicateInstanceActionsToPeers(action, appName, id, info, newStatus, node);
            }
        } finally {
            tracer.stop();
        }
    }
    /**
     * Replicates all instance changes to peer eureka nodes except for
     * replication traffic to this node.
     *
     */
    private void replicateInstanceActionsToPeers(Action action, String appName,
                                                 String id, InstanceInfo info, InstanceStatus newStatus,
                                                 PeerEurekaNode node) {
        try {
            InstanceInfo infoFromRegistry = null;
            CurrentRequestVersion.set(Version.V2);
            switch (action) {
                case Cancel:
                    node.cancel(appName, id);
                    break;
                case Heartbeat:
                    InstanceStatus overriddenStatus = overriddenInstanceStatusMap.get(id);
                    infoFromRegistry = getInstanceByAppAndId(appName, id, false);
                    node.heartbeat(appName, id, infoFromRegistry, overriddenStatus, false);
                    break;
                case Register:
                    node.register(info);
                    break;
                case StatusUpdate:
                    infoFromRegistry = getInstanceByAppAndId(appName, id, false);
                    node.statusUpdate(appName, id, newStatus, infoFromRegistry);
                    break;
                case DeleteStatusOverride:
                    infoFromRegistry = getInstanceByAppAndId(appName, id, false);
                    node.deleteStatusOverride(appName, id, infoFromRegistry);
                    break;
            }
        } catch (Throwable t) {
            logger.error("Cannot replicate information to {} for action {}", node.getServiceUrl(), action.name(), t);
        }
    }

以Register為例(邏輯是一樣的),Eureka Server循環(huán)遍歷其他節(jié)點(diǎn),然后調(diào)用node.register(info):

/**
     * Sends the registration information of {@link InstanceInfo} receiving by
     * this node to the peer node represented by this class.
     *
     * @param info
     *            the instance information {@link InstanceInfo} of any instance
     *            that is send to this instance.
     * @throws Exception
     */
    public void register(final InstanceInfo info) throws Exception {
        long expiryTime = System.currentTimeMillis() + getLeaseRenewalOf(info);
        batchingDispatcher.process(
                taskId("register", info),
                new InstanceReplicationTask(targetHost, Action.Register, info, null, true) {
                    public EurekaHttpResponse<Void> execute() {
                        return replicationClient.register(info);
                    }
                },
                expiryTime
        );
    }

這里執(zhí)行TaskDispatcher的process,實(shí)際底層轉(zhuǎn)到了AcceptorExecutor.process():

acceptorExecutor.process(id, task, expiryTime);

然后acceptorExecutor里會(huì)開(kāi)啟內(nèi)部線程AcceptorRunner進(jìn)行處理,處理邏輯有點(diǎn)復(fù)雜(包括隊(duì)列的轉(zhuǎn)換和異常處理),最終將處理好的結(jié)果放到BlockingQueue> batchWorkQueue中。

TaskExecutors中會(huì)在內(nèi)部開(kāi)啟WokerRunnable線程組(ThreadGroup),循環(huán)poll batchWorkQueue隊(duì)列中的Task,然后調(diào)用InstanceReplicationTask的execute方法,將register事件推送到其他Eureka Server節(jié)點(diǎn)。

public void run() {
     try {
                while (!isShutdown.get()) {
                    List<TaskHolder<ID, T>> holders = getWork();
                    metrics.registerExpiryTimes(holders);
?
                    List<T> tasks = getTasksOf(holders);
                    ProcessingResult result = processor.process(tasks);
                    switch (result) {
                        case Success:
                            break;
                        case Congestion:
                        case TransientError:
                            taskDispatcher.reprocess(holders, result);
                            break;
                        case PermanentError:
                            logger.warn("Discarding {} tasks of {} due to permanent error", holders.size(), workerName);
                    }
                    metrics.registerTaskResult(result, tasks.size());
                }
            } catch (InterruptedException e) {
                // Ignore
            } catch (Throwable e) {
                // Safe-guard, so we never exit this loop in an uncontrolled way.
                logger.warn("Discovery WorkerThread error", e);
            }
        }

register、renew、cancel的處理邏輯一樣,只不過(guò)調(diào)用的同步接口不同罷了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-823095.html

到了這里,關(guān)于spring eureka集群相關(guān)問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Eureka(服務(wù)注冊(cè)和發(fā)現(xiàn))——Eureka的簡(jiǎn)介和原理 & Eureka的使用和分析 & 心跳續(xù)約策略,服務(wù)的下線和剔除,自我保護(hù) & Eureka集群的搭建

    Eureka(服務(wù)注冊(cè)和發(fā)現(xiàn))——Eureka的簡(jiǎn)介和原理 & Eureka的使用和分析 & 心跳續(xù)約策略,服務(wù)的下線和剔除,自我保護(hù) & Eureka集群的搭建

    Eureka:服務(wù)注冊(cè)與發(fā)現(xiàn)組件,用于實(shí)現(xiàn)服務(wù)的自動(dòng)注冊(cè)與發(fā)現(xiàn),Spring Cloud Eureka 是對(duì)Netflix公司的Eureka的二次封裝,它實(shí)現(xiàn)了服務(wù)治理的功能,Spring Cloud Eureka提供服務(wù)端與客戶端,服務(wù)端即是Eureka服務(wù)注冊(cè)中心,客戶端完成微服務(wù)向Eureka服務(wù)的注冊(cè)與發(fā)現(xiàn)。服務(wù)端和客戶端均采

    2024年02月05日
    瀏覽(22)
  • k8s發(fā)布eureka集群,創(chuàng)建微服務(wù)項(xiàng)目

    k8s發(fā)布eureka集群,創(chuàng)建微服務(wù)項(xiàng)目

    1.1創(chuàng)建父級(jí)項(xiàng)目,父級(jí)項(xiàng)目pom.xml文件中的打包類型為pom 1.2創(chuàng)建eureka服務(wù) 1.1.2配置pom.xml依賴 1.1.3創(chuàng)建eureka的application.yml文件 1.2構(gòu)建項(xiàng)目推送到docke倉(cāng)庫(kù) 此步驟省略可參考以下連接 1.2.1-docker安裝配置 1.2.2-Dockerfile 文件編寫(xiě) 1.2.3 -jenkins構(gòu)建項(xiàng)目 1.2.4-Harbor倉(cāng)庫(kù)搭建 2.1 由于eureka是

    2024年02月02日
    瀏覽(17)
  • 【Spring Boot Admin】客戶端服務(wù)無(wú)法注冊(cè)到監(jiān)控平臺(tái)的相關(guān)問(wèn)題及解決方案

    1、客戶端服務(wù)整合了Spring Security 通過(guò)URL注冊(cè),需在客戶端服務(wù)中添加如下配置 通過(guò)注冊(cè)中心注冊(cè),需在客戶端服務(wù)中添加如下配置 2、客戶端服務(wù)配置了server.port.context-path參數(shù),并且客戶端服務(wù)通過(guò)注冊(cè)中心注冊(cè) 需在客戶端服務(wù)中添加如下配置 3、Spring Boot Admin 監(jiān)控平臺(tái)使

    2024年02月16日
    瀏覽(94)
  • Nacos(一):簡(jiǎn)介 如何安裝 服務(wù)注冊(cè)與發(fā)現(xiàn) 集群 權(quán)重 與Eureka區(qū)別

    Nacos(一):簡(jiǎn)介 如何安裝 服務(wù)注冊(cè)與發(fā)現(xiàn) 集群 權(quán)重 與Eureka區(qū)別

    當(dāng)服務(wù)調(diào)用越來(lái)越多,服務(wù)的地址需要管理起來(lái),并實(shí)現(xiàn)動(dòng)態(tài)調(diào)用而不是硬編碼在接口中。此時(shí)需要一個(gè)注冊(cè)中心來(lái)幫助我們管理服務(wù)。 ? ?流程如下: 商品微服務(wù)注冊(cè)IP和端口到注冊(cè)中心 訂單微服務(wù)先從注冊(cè)中心獲取到商品微服務(wù)的IP和端口 訂單微服務(wù)中使用獲取到的IP和

    2024年02月13日
    瀏覽(19)
  • 2-Spring cloud之Eureka快速剔除失效服務(wù) 以及 Eureka原理

    2-Spring cloud之Eureka快速剔除失效服務(wù) 以及 Eureka原理

    添加如下配置: 每個(gè)服務(wù)的yml配置如下: 如下: 更多可以參考下面的文章,說(shuō)的不錯(cuò) Eureka服務(wù)端掛了,為什么微服務(wù)還能調(diào)通?(原理分析).

    2024年02月13日
    瀏覽(296)
  • 【Spring Cloud 三】Eureka服務(wù)注冊(cè)與服務(wù)發(fā)現(xiàn)

    【Spring Cloud 三】Eureka服務(wù)注冊(cè)與服務(wù)發(fā)現(xiàn)

    【Spring Cloud一】微服務(wù)基本知識(shí) 目前公司項(xiàng)目使用的注冊(cè)中心主要是Spring Cloud Alibaba的Nacos做的注冊(cè)中心和配置中心。之前也是對(duì)Nacos的基本原理通過(guò)手寫(xiě)代碼的方式進(jìn)行了實(shí)現(xiàn)。出于對(duì)于Eureka的好奇所以就對(duì)Spring Cloud Neflix的Eureka進(jìn)行理論學(xué)習(xí)和實(shí)踐。 Eureka是一個(gè) 注冊(cè)發(fā)現(xiàn)中

    2024年02月14日
    瀏覽(986)
  • Spring Cloud Eureka:服務(wù)注冊(cè)與發(fā)現(xiàn)

    Spring Cloud Eureka:服務(wù)注冊(cè)與發(fā)現(xiàn)

    ??wei_shuo的個(gè)人主頁(yè) ??wei_shuo的學(xué)習(xí)社區(qū) ??Hello World ! Spring Cloud Eureka是Spring Cloud生態(tài)系統(tǒng)中的一個(gè)組件,它是用于實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)的服務(wù)治理組件。在微服務(wù)架構(gòu)中,服務(wù)之間存在復(fù)雜的依賴關(guān)系,而Spring Cloud Eureka可以幫助解決服務(wù)之間相互查找和通信的問(wèn)題 Eurek

    2024年02月09日
    瀏覽(89)
  • Eureka:Spring Cloud服務(wù)注冊(cè)與發(fā)現(xiàn)組件

    Eureka:Spring Cloud服務(wù)注冊(cè)與發(fā)現(xiàn)組件

    Eureka 一詞來(lái)源于古希臘詞匯,是“發(fā)現(xiàn)了”的意思。在軟件領(lǐng)域,Eureka 是 Netflix 公司開(kāi)發(fā)的一款開(kāi)源的服務(wù)注冊(cè)與發(fā)現(xiàn)組件。 Spring Cloud 將 Eureka 與 Netflix 中的其他開(kāi)源服務(wù)組件(例如 Ribbon、Feign 以及 Hystrix 等)一起整合進(jìn) Spring Cloud Netflix 模塊中,整合后的組件全稱為 Spr

    2024年02月03日
    瀏覽(94)
  • Spring Cloud Netflix微服務(wù)組件-Eureka

    Spring Cloud Netflix微服務(wù)組件-Eureka

    目錄 CAP理論 注冊(cè)中心對(duì)比 為什么注冊(cè)中心更適合用AP? 分布式系統(tǒng)AP和CP如何取舍? Eureka核心功能點(diǎn) Euraka server啟動(dòng)的主線流程 總體流程圖 @EnableEurekaServer 流程圖 EurekaServerAutoConfiguration EurekaServerInitializerConfiguration Euraka client啟動(dòng)的主線流程 總體流程圖 EurekaClientAutoConfigurat

    2024年02月01日
    瀏覽(1757)
  • 【spring cloud學(xué)習(xí)】2、Eureka服務(wù)注冊(cè)與發(fā)現(xiàn)

    【spring cloud學(xué)習(xí)】2、Eureka服務(wù)注冊(cè)與發(fā)現(xiàn)

    一套微服務(wù)架構(gòu)的系統(tǒng)由很多單一職責(zé)的服務(wù)單元組成,而每個(gè)服務(wù)單元又有眾多運(yùn)行實(shí)例。由于各服務(wù)單元顆粒度較小、數(shù)量眾多,相互之間呈現(xiàn)網(wǎng)狀依賴關(guān)系,因此需要服務(wù)注冊(cè)中心來(lái)統(tǒng)一管理微服務(wù)實(shí)例,維護(hù)各服務(wù)實(shí)例的健康狀態(tài)。 從宏觀角度,微服務(wù)架構(gòu)下的系統(tǒng)

    2024年02月10日
    瀏覽(230)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包