2015-02-11 132 views
4

我能夠讓尤里卡服務器以點對點模式運行。但我很好奇的一件事是如何讓服務發現客戶端註冊到多個eureka服務器。春雲尤里卡客戶端到多個尤里卡服務器

我的用例是這樣的:
假設我有一個服務註冊到一個尤里卡服務器(例如服務器A),並且註冊被複制到它的對等體。該服務實際上指向服務器A.如果服務器A關閉,並且客戶端期望與服務器A續約,則如​​果服務器A不再存在,更新如何工作。 我是否需要在兩者之間進行註冊?如果不是,那麼如果客戶端無法與服務器A進行通信,又如何進行更新?它是否具有服務器B的一些知識(從A的初始和/或後續通信)並故障切換到在那裏註冊續簽?這不是在任何文檔的清楚的,我需要驗證

因此,基於答案,我增加了以下我application.yml

eureka: 
    # these are settings for the client that gets services 
    client: 
    # enable these two settings if you want discovery to work 
    registerWithEureka: true 
    fetchRegistry: true 
    serviceUrl: 
     defaultZone: http://localhost:8762/eureka/, http://localhost:8761/eureka/ 

只註冊到首次在分開的逗號名單。如果我將它們切換到尤里卡服務器之間的註冊翻頁。

我可以看到,它並基於逗號分隔這些,但我的猜測是,尤里卡不使用此之下(從EurekaClientConfigBean.java)

@Override 
    public List<String> getEurekaServerServiceUrls(String myZone) { 
     String serviceUrls = this.serviceUrl.get(myZone); 
     if (serviceUrls == null || serviceUrls.isEmpty()) { 
      serviceUrls = this.serviceUrl.get(DEFAULT_ZONE); 
     } 
     if (serviceUrls != null) { 
      return Arrays.asList(serviceUrls.split(",")); 
     } 

     return new ArrayList<>(); 
    } 

回答

1

客戶端應用程序應提供尤里卡的URL列表。這些網址用逗號分隔。

+0

根據答案添加了對我的第一個響應的更新 – EvilJinious1 2015-02-17 23:10:44

4

我剛剛回顧了Eureka 1.1.147的源代碼。它的工作原理與我預期的不同,但至少現在我知道了。

你可以把多個服務URL集合中的

serviceUrl: 
     defaultZone: http://localhost:8762/eureka/, http://localhost:8761/eureka/ 

,但寄存器操作僅使用第一個報名。只有在嘗試聯繫第一個失敗時纔會使用剩餘部分。

從(DiscoveryClient.java)

/** 
    * Register with the eureka service by making the appropriate REST call. 
    */ 
    void register() { 
     logger.info(PREFIX + appPathIdentifier + ": registering service..."); 
     ClientResponse response = null; 
     try { 
      response = makeRemoteCall(Action.Register); 
      isRegisteredWithDiscovery = true; 
      logger.info(PREFIX + appPathIdentifier + " - registration status: " 
        + (response != null ? response.getStatus() : "not sent")); 
     } catch (Throwable e) { 
      logger.error(PREFIX + appPathIdentifier + " - registration failed" 
        + e.getMessage(), e); 
     } finally { 
      if (response != null) { 
       response.close(); 
      } 
     } 
    } 

它調用

private ClientResponse makeRemoteCall(Action action) throws Throwable { 
    return makeRemoteCall(action, 0); 
} 

它僅調用異常時在被拋出上述makeRemoteCall備份(動作,0)調用

} catch (Throwable t) { 
      closeResponse(response); 
      String msg = "Can't get a response from " + serviceUrl + urlPath; 
      if (eurekaServiceUrls.get().size() > (++serviceUrlIndex)) { 
       logger.warn(msg, t); 
       logger.warn("Trying backup: " + eurekaServiceUrls.get().get(serviceUrlIndex)); 
       SERVER_RETRY_COUNTER.increment(); 
       return makeRemoteCall(action, serviceUrlIndex); 
      } else { 
       ALL_SERVER_FAILURE_COUNT.increment(); 
       logger.error(
         msg 
           + "\nCan't contact any eureka nodes - possibly a security group issue?", 
         t); 
       throw t; 
      } 

所以你不能從這個代碼同時註冊到兩個eureka服務器。除非我錯過了什麼。

1

是的,作爲每文檔,流量:

  1. 客戶端註冊到第一個可用的尤里卡服務器
  2. 登記人信息是Eureka服務器節點之間的複製。

因此,多次登記不僅是不必要的,而應該是有效的。

相關問題