我能够让eureka服务器以点对点模式运行.但我很好奇的一件事是如何让服务发现客户端注册到多个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/
Run Code Online (Sandbox Code Playgroud)
它只注册到逗号分隔列表中的第一个.如果我在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<>();
}
Run Code Online (Sandbox Code Playgroud)
我刚刚查看了Eureka 1.1.147的源代码.它的工作方式与我的预期不同,但至少我现在知道了.
您可以在集合中放置多个服务URL
serviceUrl:
defaultZone: http://localhost:8762/eureka/, http://localhost:8761/eureka/
Run Code Online (Sandbox Code Playgroud)
但是注册操作只使用第一个注册.只有在尝试联系第一个失败时才使用剩余部分.
来自(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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪个叫
private ClientResponse makeRemoteCall(Action action) throws Throwable {
return makeRemoteCall(action, 0);
}
Run Code Online (Sandbox Code Playgroud)
它只在上述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;
}
Run Code Online (Sandbox Code Playgroud)
因此,您无法从此代码中同时注册到两台eureka服务器.除非我错过了什么.
| 归档时间: |
|
| 查看次数: |
4323 次 |
| 最近记录: |