2015-02-11 84 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服务器节点之间的复制。

因此,多次登记不仅是不必要的,而应该是有效的。

相关问题