Apollo自動更新配置源碼分析

源碼閱讀—定時拉取配置

AbstractConfigRepository

  • 提供模板方法trySync(),具體實現交由子類
  • 管理監聽者集合(添加,刪除)
  • fire!!通知監聽者拉取配置改變狀態
       protected void fireRepositoryChange(String namespace, Properties newProperties) {
    for (RepositoryChangeListener listener : m_listeners) {
      try {
        listener.onRepositoryChange(namespace, newProperties);
      } catch (Throwable ex) {
        Tracer.logError(ex);
        logger.error("Failed to invoke repository change listener {}", listener.getClass(), ex);
      }
    }
  }

RemoteConfigRepository

 static {
    m_executorService = Executors.newScheduledThreadPool(1,
        ApolloThreadFactory.create("RemoteConfigRepository", true));
  }

單線程維持調用

   if (!m_loadConfigRateLimiter.tryAcquire(5, TimeUnit.SECONDS)) {
      //wait at most 5 seconds
      try {
        TimeUnit.SECONDS.sleep(5);
      } catch (InterruptedException e) {
      }
    }

很有意思防止快速重試設置了等待時間
==assembleQueryConfigUrl()==組裝請求的URL(根據appid,cluster,namespace)

  Transaction transaction = Tracer.newTransaction("Apollo.ConfigService", "queryConfig");
        transaction.addData("Url", url);

開啓事務,完成查詢之後返回結果

      if (previous != current) {
        logger.debug("Remote Config refreshed!");
        m_configCache.set(current);
        this.fireRepositoryChange(m_namespace, this.getConfig());
      }

      if (current != null) {
        Tracer.logEvent(String.format("Apollo.Client.Configs.%s", current.getNamespaceName()),
            current.getReleaseKey());
      }

將結果和本地的數據進行比較如果不同,出發fire!!將配置更新到所有監聽者.

長輪詢

長輪詢的開啓入口在構造方法,調用下面的方法進入長輪詢

  private void scheduleLongPollingRefresh() {
    remoteConfigLongPollService.submit(m_namespace, this);
  }

完成長輪詢之後執行通知繼續新一輪的長輪詢

 for (RemoteConfigRepository remoteConfigRepository : toBeNotified) {
        try {
          remoteConfigRepository.onLongPollNotified(lastServiceDto, remoteMessages);
        } catch (Throwable ex) {
          Tracer.logError(ex);
        }
      }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章