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

SpringCloud Eureka 服務(wù)注冊(cè)實(shí)現(xiàn)過程

 更新時(shí)間:2019年10月16日 09:42:11   作者:巡山小妖N  
這篇文章主要介紹了SpringCloud Eureka 服務(wù)注冊(cè)實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一、將服務(wù)注冊(cè)到Eureka

一個(gè)SpringBoot應(yīng)用如果要注冊(cè)到Spring Cloud環(huán)境(Greenwich.SR3版本),步驟很簡單:

pom.xml中添加啟動(dòng)器:spring-cloud-starter-netflix-eureka-client;

增加配置:eureka.client.serviceUrl.defaultZone: http://localhost:8100/eureka/;

啟動(dòng)應(yīng)用;

如果注冊(cè)中心正常,此時(shí)就能在注冊(cè)中心發(fā)現(xiàn)這個(gè)應(yīng)用了,如下圖紅框所示:

按照spring.factories中的配置,EurekaClientAutoConfiguration中的配置都會(huì)生效,包括下面這段代碼返回的bean:

@Bean
public DiscoveryClient discoveryClient(EurekaInstanceConfig config, EurekaClient client) {
  return new EurekaDiscoveryClient(config, client);
}

spring容器初始化時(shí)會(huì)實(shí)例化所有單例bean,就會(huì)執(zhí)行EurekaClientAutoConfiguration的discoveryClient方法獲取這個(gè)bean實(shí)例,于是就構(gòu)造了一個(gè)EurekaDiscoveryClient對(duì)象;

注意EurekaDiscoveryClient的構(gòu)造方法,第二個(gè)入?yún)⑹莄om.netflix.discovery.EurekaClient類型,此對(duì)象同樣來自EurekaClientAutoConfiguration類,如下方法:

@Bean(destroyMethod = "shutdown")
@ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT)
@org.springframework.cloud.context.config.annotation.RefreshScope
@Lazy
public EurekaClient eurekaClient(ApplicationInfoManager manager, EurekaClientConfig config, EurekaInstanceConfig instance) {
  manager.getInfo(); // force initialization
  return new CloudEurekaClient(manager, config, this.optionalArgs,this.context);
}

CloudEurekaClient的父類com.netflix.discovery.DiscoveryClient來自netflix發(fā)布的eureka-client包中,所以可以這么理解:EurekaDiscoveryClient類是個(gè)代理身份,真正的服務(wù)注冊(cè)發(fā)現(xiàn)是委托給netflix的開源包來完成的,我們可以專心的使用SpringCloud提供的服務(wù)注冊(cè)發(fā)現(xiàn)功能,只需要知道EurekaDiscoveryClient即可,真正的服務(wù)是eureka-client來完成的;

接下來需要關(guān)注com.netflix.discovery.DiscoveryClient的構(gòu)造方法,因?yàn)檫@里面有服務(wù)注冊(cè)的邏輯,整個(gè)構(gòu)造方法內(nèi)容太多,無需都細(xì)看,只看關(guān)鍵代碼即可;

DiscoveryClient的構(gòu)造方法中,最熟悉的應(yīng)該是下圖紅框中這段日志輸出的了:

對(duì)應(yīng)的應(yīng)用啟動(dòng)日志中就有這段日志輸出,如下圖紅框:

紅框中的”us-east-1”,是默認(rèn)的region,來自配置類EurekaClientConfigBean,這里面有各種eureka相關(guān)的配置信息,以及默認(rèn)配置,如下圖:

繼續(xù)看DiscoveryClient的構(gòu)造方法,服務(wù)注冊(cè)相關(guān)的initScheduledTasks方法在此被調(diào)用,如下圖:

initScheduledTasks方法的內(nèi)容如下,請(qǐng)注意中文注釋:

  private void initScheduledTasks() {
    //獲取服務(wù)注冊(cè)列表信息
    if (clientConfig.shouldFetchRegistry()) {
      //服務(wù)注冊(cè)列表更新的周期時(shí)間
      int registryFetchIntervalSeconds = clientConfig.getRegistryFetchIntervalSeconds();
      int expBackOffBound = clientConfig.getCacheRefreshExecutorExponentialBackOffBound();
      //定時(shí)更新服務(wù)注冊(cè)列表
      scheduler.schedule(
          new TimedSupervisorTask(
              "cacheRefresh",
              scheduler,
              cacheRefreshExecutor,
              registryFetchIntervalSeconds,
              TimeUnit.SECONDS,
              expBackOffBound,
              new CacheRefreshThread() //該線程執(zhí)行更新的具體邏輯
          ),
          registryFetchIntervalSeconds, TimeUnit.SECONDS);
    }
    if (clientConfig.shouldRegisterWithEureka()) {
      //服務(wù)續(xù)約的周期時(shí)間
      int renewalIntervalInSecs = instanceInfo.getLeaseInfo().getRenewalIntervalInSecs();
      int expBackOffBound = clientConfig.getHeartbeatExecutorExponentialBackOffBound();
      //應(yīng)用啟動(dòng)可見此日志,內(nèi)容是:Starting heartbeat executor: renew interval is: 30
      logger.info("Starting heartbeat executor: " + "renew interval is: " + renewalIntervalInSecs);
      // 定時(shí)續(xù)約
      scheduler.schedule(
          new TimedSupervisorTask(
              "heartbeat",
              scheduler,
              heartbeatExecutor,
              renewalIntervalInSecs,
              TimeUnit.SECONDS,
              expBackOffBound,
              new HeartbeatThread() //該線程執(zhí)行續(xù)約的具體邏輯
          ),
          renewalIntervalInSecs, TimeUnit.SECONDS);

      //這個(gè)Runable中含有服務(wù)注冊(cè)的邏輯
      instanceInfoReplicator = new InstanceInfoReplicator(
          this,
          instanceInfo,
          clientConfig.getInstanceInfoReplicationIntervalSeconds(),
          2); // burstSize

      statusChangeListener = new ApplicationInfoManager.StatusChangeListener() {
        @Override
        public String getId() {
          return "statusChangeListener";
        }

        @Override
        public void notify(StatusChangeEvent statusChangeEvent) {
          if (InstanceStatus.DOWN == statusChangeEvent.getStatus() ||
              InstanceStatus.DOWN == statusChangeEvent.getPreviousStatus()) {
            // log at warn level if DOWN was involved
            logger.warn("Saw local status change event {}", statusChangeEvent);
          } else {
            logger.info("Saw local status change event {}", statusChangeEvent);
          }
          instanceInfoReplicator.onDemandUpdate();
        }
      };

      if (clientConfig.shouldOnDemandUpdateStatusChange()) {
        applicationInfoManager.registerStatusChangeListener(statusChangeListener);
      }
      //服務(wù)注冊(cè)
      instanceInfoReplicator.start(clientConfig.getInitialInstanceInfoReplicationIntervalSeconds());
    } else {
      logger.info("Not registering with Eureka server per configuration");
    }
  }

上述代碼中有幾處需要注意,這些關(guān)鍵點(diǎn)在后面的章節(jié)將繼續(xù)展開:

a. 周期性更新服務(wù)列表;

b. 周期性服務(wù)續(xù)約;

c. 服務(wù)注冊(cè)邏輯被放入Runnable實(shí)現(xiàn)類InstanceInfoReplicator之中,在新線程中執(zhí)行;

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JVM 命令行工具的使用

    JVM 命令行工具的使用

    造成Java應(yīng)用出現(xiàn)性能問題的因素非常多,想要定位這些問題,一款優(yōu)秀的性能診斷工具必不可少,本文主要介紹了JVM 命令行工具的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • SpringBoot實(shí)現(xiàn)ORM操作MySQL的幾種方法

    SpringBoot實(shí)現(xiàn)ORM操作MySQL的幾種方法

    本文主要介紹了SpringBoot實(shí)現(xiàn)ORM操作MySQL的幾種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • JAVA構(gòu)造函數(shù)(方法)示例詳解

    JAVA構(gòu)造函數(shù)(方法)示例詳解

    構(gòu)造函數(shù),是一種特殊的方法,主要用來在創(chuàng)建對(duì)象時(shí)初始化對(duì)象,即為對(duì)象成員變量賦初始值,總與new運(yùn)算符一起使用在創(chuàng)建對(duì)象的語句中,這篇文章主要給大家介紹了關(guān)于JAVA構(gòu)造函數(shù)(方法)的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • java實(shí)現(xiàn)文件上傳、下載、圖片預(yù)覽

    java實(shí)現(xiàn)文件上傳、下載、圖片預(yù)覽

    這篇文章主要介紹了java實(shí)現(xiàn)文件上傳、下載、圖片預(yù)覽,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java超級(jí)實(shí)用的Freemarker工具類

    Java超級(jí)實(shí)用的Freemarker工具類

    這篇文章主要介紹了Java超級(jí)實(shí)用的Freemarker工具類,文章圍繞相關(guān)資料介紹以及代碼描述非常詳細(xì),需要的小伙伴可以參考一下,希望對(duì)你得學(xué)習(xí)有所幫助
    2022-02-02
  • java實(shí)現(xiàn)在線聊天系統(tǒng)

    java實(shí)現(xiàn)在線聊天系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)在線聊天系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Spring?Gateway基礎(chǔ)教程

    Spring?Gateway基礎(chǔ)教程

    本文主要總結(jié)Spring?Gateway的基礎(chǔ)用法,內(nèi)容包括網(wǎng)關(guān)、Spring?Gateway工作流程、Spring?Cloud?Gateway搭建、路由配置方式、負(fù)載均衡實(shí)現(xiàn)、斷言工廠這幾個(gè)部分,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • java迭代器原理及迭代map的四種方式

    java迭代器原理及迭代map的四種方式

    本文我們將了解一下java迭代器原理及其在Java中迭代Map各種不同方法。具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-09-09
  • springboot實(shí)現(xiàn)登錄功能的完整步驟

    springboot實(shí)現(xiàn)登錄功能的完整步驟

    這篇文章主要給大家介紹了關(guān)于springboot實(shí)現(xiàn)登錄功能的完整步驟,在web應(yīng)用程序中,用戶登錄權(quán)限驗(yàn)證是非常重要的一個(gè)步驟,文中通過代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • mybatis?實(shí)體類字段大小寫問題?字段獲取不到值的解決

    mybatis?實(shí)體類字段大小寫問題?字段獲取不到值的解決

    這篇文章主要介紹了mybatis?實(shí)體類字段大小寫問題?字段獲取不到值的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論

鲜城| 永德县| 浠水县| 琼结县| 水城县| 荥阳市| 江城| 清流县| 武隆县| 静乐县| 航空| 依兰县| 吉林市| 定远县| 鹤山市| 易门县| 平乡县| 石景山区| 福安市| 祥云县| 册亨县| 额敏县| 勐海县| 色达县| 略阳县| 皋兰县| 红河县| 洛阳市| 七台河市| 宁国市| 天津市| 呼伦贝尔市| 岳西县| 乌鲁木齐县| 盘山县| 神木县| 长岛县| 太仆寺旗| 藁城市| 巴青县| 阿城市|