Spring云eureka客户端到多个eureka服务器
Spring cloud eureka client to multiple eureka servers
我能够让 eureka 服务器以对等模式运行。但是我很好奇的一件事是如何让服务发现客户端注册到多个 eureka 服务器。
我的用例是这样的:
假设我有一个服务注册到其中一个尤里卡服务器(例如服务器 A),并且该注册被复制到它的对等方。该服务实际上指向服务器 A。如果服务器 A 出现故障,并且客户端希望与服务器 A 续订,如果服务器 A 不再存在,续订将如何进行。
我是否需要同时注册,如果不需要,那么如果客户端无法与服务器 A 通信,如何进行更新。它是否对服务器 B 有一些了解(从其最初的 and/or 随后与 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 不会在下面使用它(来自 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<>();
}
您的客户端应用程序应提供一个 Eureka URL 列表。网址以逗号分隔。
我刚刚查看了 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 服务器
- 注册人信息在 eureka 服务器节点之间复制。
所以多次注册不仅不需要而且应该避免。
请在application.property或application.yml文件
中添加以下属性
eureka.client.service-url.defaultZone = http://localhost:8761/eureka,http://localhost:8762/eureka
服务将注册到两个 eureka server.If 一个 eureka 服务器关闭,然后请求将从其他 eureka 服务器提供服务。
如果你想解决在多个尤里卡服务器上注册的问题。
请查看我对类似问题的回答:
我能够让 eureka 服务器以对等模式运行。但是我很好奇的一件事是如何让服务发现客户端注册到多个 eureka 服务器。
我的用例是这样的:
假设我有一个服务注册到其中一个尤里卡服务器(例如服务器 A),并且该注册被复制到它的对等方。该服务实际上指向服务器 A。如果服务器 A 出现故障,并且客户端希望与服务器 A 续订,如果服务器 A 不再存在,续订将如何进行。
我是否需要同时注册,如果不需要,那么如果客户端无法与服务器 A 通信,如何进行更新。它是否对服务器 B 有一些了解(从其最初的 and/or 随后与 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 不会在下面使用它(来自 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<>();
}
您的客户端应用程序应提供一个 Eureka URL 列表。网址以逗号分隔。
我刚刚查看了 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 服务器
- 注册人信息在 eureka 服务器节点之间复制。
所以多次注册不仅不需要而且应该避免。
请在application.property或application.yml文件
中添加以下属性eureka.client.service-url.defaultZone = http://localhost:8761/eureka,http://localhost:8762/eureka
服务将注册到两个 eureka server.If 一个 eureka 服务器关闭,然后请求将从其他 eureka 服务器提供服务。
如果你想解决在多个尤里卡服务器上注册的问题。 请查看我对类似问题的回答: