首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring eureka客户端到多个eureka服务器

Spring eureka客户端到多个eureka服务器
EN

Stack Overflow用户
提问于 2015-02-11 12:54:42
回答 5查看 6.8K关注 0票数 9

我能够让eureka服务器在对等模式下运行。但有一件事我很好奇,那就是如何让一个服务发现客户端注册到多个eureka服务器。

我的用例是:

假设我有一个服务注册到其中一个eureka服务器(例如服务器A),并且该注册被复制到它的对等服务器。该服务实际上指向服务器A。如果服务器A出现故障,客户端希望与服务器A续订,如果服务器A不再存在,更新工作将如何进行。我是否需要两者都注册,如果客户端无法与服务器A通信,那么更新是如何发生的?它是否对服务器B(从其初始和/或随后与A的通信)有一些了解,并未能在那里进行注册更新?这在任何一个文档中都不清楚,我需要验证

因此,根据答案,我在我的application.yml中添加了以下内容

代码语言:javascript
复制
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/

它只注册到逗号分隔列表中的第一个。如果我在eureka服务器之间切换注册。

我可以看到它确实根据逗号分隔这些,但我猜尤里卡没有在下面使用这个(来自EurekaClientConfigBean.java)。

代码语言:javascript
复制
    @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<>();
    }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-02-18 00:50:28

我刚刚查看了Eureka 1.1.147的源代码。它的工作方式与我所期望的不同,但至少我现在知道了。

您可以在集合中放置多个服务urls。

代码语言:javascript
复制
serviceUrl:
      defaultZone: http://localhost:8762/eureka/, http://localhost:8761/eureka/

但是注册操作只使用第一个注册操作。只有当试图联系第一个失败时,才会使用剩余的。

来自(DiscoveryClient.java)

代码语言:javascript
复制
   /**
     * 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();
            }
        }
    }

打电话

代码语言:javascript
复制
private ClientResponse makeRemoteCall(Action action) throws Throwable {
    return makeRemoteCall(action, 0);
}

它只在上述makeRemoteCall(action,0)调用中抛出异常时调用备份。

代码语言:javascript
复制
   } 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服务器。除非我错过了什么。

票数 10
EN

Stack Overflow用户

发布于 2015-02-14 04:01:03

您的客户端应用程序应该得到一个Eureka URL列表。URL是逗号分隔的。

票数 1
EN

Stack Overflow用户

发布于 2016-12-12 12:50:58

是的,根据文件,流程如下:

  1. 客户端注册到第一个可用的eureka服务器。
  2. 注册者信息在eureka服务器节点之间复制。

因此,不仅不需要多次注册,而且应该提倡多重注册。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28454916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档