Сервер Spring Cloud Eureka НЕ реплицирует друг друга, отображая предупреждение

Я использую два сервера Eureka в облаке Spring для репликации друг друга, когда открываю страницу по адресу http://localhost:8761 , Я увидел это сообщение:

ПРОДЛЕНИЯ МЕНЬШЕ ПОРОГА. РЕЖИМ САМОСОХРАНЕНИЯ ВЫКЛЮЧЕН. ЭТО МОЖЕТ НЕ ЗАЩИТИТЬ СРОК СРОКА ИНСТАНЦИИ В СЛУЧАЕ СЕТИ / ДРУГИХ ПРОБЛЕМ.

Файл 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, то я не вижу зарегистрированной микрослужбы.

Есть идеи, почему?


person user3006967    schedule 31.08.2015    source источник
comment
Предупреждение связано с количеством экземпляров сервисов, зарегистрированных с помощью eureka, а не с репликацией eureka.   -  person spencergibb    schedule 31.08.2015
comment
см. этот вопрос SO, чтобы узнать, как настроить репликацию одноранговых узлов: stackoverflow.com/questions / 30288959 /   -  person spencergibb    schedule 31.08.2015


Ответы (2)


Эврика: зарегистрируйте только первый успешный 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;
    }
}
person mostafa cs    schedule 17.03.2020
comment
Могу я спросить, что такое SimpleEurekaClientConfig? Вы создали свою реализацию интерфейса конфигурации или она находится в другой зависимости? - person Nenad; 25.11.2020
comment
@Nenad Да, это моя реализация. Я обновил ответ, включив в него код SimpleEurekaClientConfig. Спасибо - person mostafa cs; 26.11.2020
comment
@mostafacs Спасибо за пример, он работает, но при выключении клиента он работает только с defaultZone, а не с additionalZones, он все еще показывает экземпляр UP. - person Yougesh; 22.06.2021
comment
@Yougesh Можно ли создать демонстрационный проект с той же проблемой? тогда я могу помочь. Спасибо. - person mostafa cs; 23.06.2021
comment
@mostafacs Я создал пример в репо и добавил README.md для запуска проектов. github.com/ypkkhatri/sb-eureka-multi-zone-example - person Yougesh; 24.06.2021
comment
@Yougesh Я попытался удалить его с зарегистрированных дополнительных серверов eureka. Но я не могу. Я могу изменить статус только на Вниз. при удалении. Обновлю ответ. - person mostafa cs; 28.06.2021
comment
@Yougesh, я сделаю еще одну попытку позже сегодня. - person mostafa cs; 28.06.2021
comment
@mostafacs Спасибо, я подожду - person Yougesh; 28.06.2021
comment
@mostafacs Вы обновили приведенный выше код? - person Yougesh; 09.07.2021

Это не XML, вам нужно переименовать его в application.YML.

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

person rafambbr    schedule 04.09.2015