问题
I am using two Eureka server in spring cloud to replicate each other, when I open the page at http://localhost:8761, I saw this message:
RENEWALS ARE LESSER THAN THE THRESHOLD. THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
The eureka application.xml is this:
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/
So if I go to http://localhost:8761, I see all the services registered, but if I go to http://localhost:8762, I then see no micro-service registered.
Any idea why?
回答1:
Eureka: register only the first success url. In your case the first success url is http://localhost:8761/eureka/ so it's not continue to register the next url http://localhost:8762/eureka/.
You can override that by:
Application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
additionalZones: http://localhost:8762/eureka
Your 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());
}
}
回答2:
It's not a XML you need rename it to "application.YML"
https://en.wikipedia.org/wiki/YAML
来源:https://stackoverflow.com/questions/32304566/spring-cloud-eureka-server-is-not-replicating-each-other-displaying-warning