【问题标题】:Spring cloud eureka client to multiple eureka serversSpring cloud eureka客户端到多个eureka服务器
【发布时间】:2015-04-11 20:34:39
【问题描述】:

我能够让 eureka 服务器在点对点模式下运行。但我很好奇的一件事是如何让服务发现客户端注册到多个 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/

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

我可以看到它确实基于逗号分隔这些,但我的猜测是 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<>();
    }

【问题讨论】:

    标签: spring-cloud


    【解决方案1】:

    我刚刚查看了 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(action, 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 服务器。除非我错过了什么。

    【讨论】:

      【解决方案2】:

      应该为您的客户端应用程序提供一个 Eureka URL 列表。 URL 以逗号分隔。

      【讨论】:

      • 根据答案对我的第一个回复添加了更新
      【解决方案3】:

      是的,根据文档,流程是:

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

      因此,不仅不需要而且应该避免多次注册。

      【讨论】:

        【解决方案4】:

        请在 application.property 或 application.yml 文件中添加以下属性

        eureka.client.service-url.defaultZone = http://localhost:8761/eureka,http://localhost:8762/eureka

        服务将在两个 eureka 服务器上注册。如果一个 eureka 服务器关闭,则将从其他 eureka 服务器提供请求。

        【讨论】:

          【解决方案5】:

          如果您想要在多个 eureka 服务器上注册的解决方法。 请查看我对类似问题的回答:https://stackoverflow.com/a/60714917/7982168

          【讨论】:

            猜你喜欢
            • 2020-05-22
            • 2015-08-31
            • 2018-10-25
            • 1970-01-01
            • 1970-01-01
            • 2021-06-15
            • 2020-07-20
            • 2018-02-18
            • 2021-04-17
            相关资源
            最近更新 更多