spring-cloud-netflix 上的 Eureka 具有基于 DNS 的配置,所有实例均显示为不可用
Eureka on spring-cloud-netflix with DNS based config, all instances showing up as unavailable
我正在尝试使用基于 DNS 的 EIP 配置在 aws 上设置一个 eureka 集群,如 https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud
中所述
似乎一切正常,但 eureka 仪表板坚持认为 eureka 实例不可用。我现在想知道这是否只是一个 ui 问题(我认为是)或者我是否遗漏了什么。
据我了解仪表板中的 "unavailable-replicas" 逻辑,这是因为尤里卡正在比较注册主机名和副本主机名。这些实例在发现客户端使用其内部 VPC ip 进行注册,但在寻找副本对等体时使用其 EIP 进行注册(很奇怪,在 eureka 日志中我可以看到内部它们也在使用内部 VPC ip)。
问题是:这只是我不应该担心的一些表面上的 ui 问题,还是由于某些配置错误而等待介入的更大问题?如果它只是一个 ui 的东西:我可以 "repair" 以某种方式吗?
编辑:
可能相关 https://github.com/spring-cloud/spring-cloud-netflix/issues/102#issuecomment-74446709
在相关 github 问题中@rozhok 的帮助下,我现在有了一个可行的解决方案。如果有人遇到同样的问题,这就是我所做的:
application.yml
eureka:
datacenter: cloud
client:
eurekaServerDNSName: your.dns.name
eurekaServerPort: 8761
eurekaServerURLContext: eureka
region: eu-west-1
registerWithEureka: true
fetchRegistry: true
useDnsForFetchingServiceUrls: true
server:
waitTimeInMsWhenSyncEmpty: 0
enableSelfPreservation: true
尤里卡服务器
@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class EurekaServer {
@Value("${server.port:8761}")
private int port;
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
@Bean
@Autowired
public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils) {
EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inetUtils);
AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka");
// Don't use spring cloud's hostname here.
// See comment below by Michal
config.setHostname(
info.get(AmazonInfo.MetaDataKey.publicHostname));
config.setIpAddress(info.get(AmazonInfo.MetaDataKey.publicIpv4));
config.setNonSecurePort(port);
config.setDataCenterInfo(info);
return config;
}
}
使用该配置,每个尤里卡服务器仅将其他服务器视为可用副本:
我正在尝试使用基于 DNS 的 EIP 配置在 aws 上设置一个 eureka 集群,如 https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud
中所述似乎一切正常,但 eureka 仪表板坚持认为 eureka 实例不可用。我现在想知道这是否只是一个 ui 问题(我认为是)或者我是否遗漏了什么。
据我了解仪表板中的 "unavailable-replicas" 逻辑,这是因为尤里卡正在比较注册主机名和副本主机名。这些实例在发现客户端使用其内部 VPC ip 进行注册,但在寻找副本对等体时使用其 EIP 进行注册(很奇怪,在 eureka 日志中我可以看到内部它们也在使用内部 VPC ip)。
问题是:这只是我不应该担心的一些表面上的 ui 问题,还是由于某些配置错误而等待介入的更大问题?如果它只是一个 ui 的东西:我可以 "repair" 以某种方式吗?
编辑:
可能相关 https://github.com/spring-cloud/spring-cloud-netflix/issues/102#issuecomment-74446709
在相关 github 问题中@rozhok 的帮助下,我现在有了一个可行的解决方案。如果有人遇到同样的问题,这就是我所做的:
application.yml
eureka:
datacenter: cloud
client:
eurekaServerDNSName: your.dns.name
eurekaServerPort: 8761
eurekaServerURLContext: eureka
region: eu-west-1
registerWithEureka: true
fetchRegistry: true
useDnsForFetchingServiceUrls: true
server:
waitTimeInMsWhenSyncEmpty: 0
enableSelfPreservation: true
尤里卡服务器
@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class EurekaServer {
@Value("${server.port:8761}")
private int port;
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
@Bean
@Autowired
public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils) {
EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inetUtils);
AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka");
// Don't use spring cloud's hostname here.
// See comment below by Michal
config.setHostname(
info.get(AmazonInfo.MetaDataKey.publicHostname));
config.setIpAddress(info.get(AmazonInfo.MetaDataKey.publicIpv4));
config.setNonSecurePort(port);
config.setDataCenterInfo(info);
return config;
}
}
使用该配置,每个尤里卡服务器仅将其他服务器视为可用副本: