我在Spring云中使用两个Eureka服务器互相复制,当我在http://localhost:8761打开页面时,我看到了这样的消息:
更新比THTHHOLD更糟糕。自我保存模式已关闭。在网络/其他问题的情况下,可能无法保护实例。
eureka application.xml是这样的:
server:
port: ${server.instance.port:5678}
spring:
application:
name: nodeservice
sidecar:
port: ${nodeserver.instance.port:3000}
health-uri: http://localhost:${nodeserver.instance.port:3000}/health.json
eureka:
instance:
hostname: ${nodeserver.instance.name:localhost}
preferIpAddress: ${preferipaddress:false}
leaseRenewalIntervalInSeconds: 5 #default is 30, recommended to keep default
metadataMap:
instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
因此,如果我转到http://localhost:8761,我会看到已注册的所有服务,但如果我转到http://localhost:8762,则会看到没有注册的微服务。
知道为什么吗?
答案 0 :(得分:2)
Eureka:仅注册第一个成功URL。在您的情况下,第一个成功URL是http:// localhost:8761 / eureka /,因此不会继续注册下一个URL http:// localhost:8762 / eureka /。
您可以通过以下方式覆盖它:
Application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
additionalZones: http://localhost:8762/eureka
您的Application.java
@SpringBootApplication
@EnableEurekaClient
public class Application implements ApplicationContextAware {
@Value("${eureka.client.serviceUrl.additionalZones:}")
String additionalZones;
ConfigurableApplicationContext applicationContext;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public Map<String, EurekaClient> additionalEurekaClients(ApplicationInfoManager manager,
@Autowired(required = false) HealthCheckHandler healthCheckHandler) {
HashMap clients = new HashMap<>();
if(Text.isEmpty(additionalZones))
return clients;
String[] hosts = additionalZones.split(",");
for(int i=0; i < hosts.length; i++)
{
EurekaClient client = new CloudEurekaClient(manager, new SimpleEurekaClientConfig(hosts[i].trim(),"defaultZone"), null,
this.applicationContext);
client.registerHealthCheck(healthCheckHandler);
String clientName = "client_"+ (i+1);
clients.put(clientName, client);
}
return clients;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = (ConfigurableApplicationContext) applicationContext;
}
@PreDestroy
public void unRegisterInAllConfiguredDiscovery() {
Map<String, EurekaClient> additionalEurekaClients = this.applicationContext.getBean("additionalEurekaClients", Map.class);
additionalEurekaClients.forEach((k, v) -> v.shutdown());
}
}
SimpleEurekaClient.java
package com.netflix.eureka;
import org.springframework.cloud.netflix.eureka.EurekaClientConfigBean;
import java.util.Arrays;
import java.util.List;
public class SimpleEurekaClientConfig extends EurekaClientConfigBean {
private String eurekaUrl;
private String zone;
private String region = "us-east-1";
public SimpleEurekaClientConfig(String eurekaUrl, String zone, String region) {
this.eurekaUrl = eurekaUrl;
this.zone = zone;
this.region = region;
}
public SimpleEurekaClientConfig(String eurekaUrl, String zone) {
this.eurekaUrl = eurekaUrl;
this.zone = zone;
}
@Override
public String getRegion() {
return region;
}
@Override
public String[] getAvailabilityZones(String s) {
return new String[] {zone};
}
@Override
public List<String> getEurekaServerServiceUrls(String s) {
return Arrays.asList(eurekaUrl);
}
@Override
public boolean shouldEnforceRegistrationAtInit() {
return true;
}
@Override
public boolean shouldRegisterWithEureka() {
return true;
}
}
答案 1 :(得分:0)
您不需要将XML重命名为&#34; application.YML&#34;