Spring Cloud Eureka服务器不会相互复制,显示警告

时间:2015-08-31 05:36:37

标签: spring spring-cloud netflix-eureka

我在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,则会看到没有注册的微服务。

知道为什么吗?

2 个答案:

答案 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;

https://en.wikipedia.org/wiki/YAML