eureka 客户端 异常 Invalid eureka server URI: /; removing from the server pool 分析解决

问题描述:

Spring cloud 项目

注册中心 Eureka,采用高可用方式 开启两个eureka server

 http://IP:8761/eureka/

http://IP:8762/eureka/

客户端每隔5分钟报info log

 Invalid eureka server URI: /; removing from the server pool


问题分析:

一开始没头绪,只能分析 eureka 客户端源码

info 信息出自

private List getClusterEndpointsFromConfig() {
        String[] availZones = clientConfig.getAvailabilityZones(clientConfig.getRegion());
        String myZone = InstanceInfo.getZone(availZones, myInstanceInfo);


        Map> serviceUrls = EndpointUtils
                .getServiceUrlsMapFromConfig(clientConfig, myZone, clientConfig.shouldPreferSameZoneEureka());


        List endpoints = new ArrayList<>();
        for (String zone : serviceUrls.keySet()) {
            for (String url : serviceUrls.get(zone)) {
                try {
                    endpoints.add(new AwsEndpoint(url, getRegion(), zone));
                } catch (Exception ignore) {
                    logger.warn("Invalid eureka server URI: {}; removing from the server pool", url);
                }
            }
        }


        if (logger.isDebugEnabled()) {
            logger.debug("Config resolved to {}", endpoints);
        }


        if (endpoints.isEmpty()) {
            logger.error("Cannot resolve to any endpoints from provided configuration: {}", serviceUrls);
        }


        return endpoints;
    }

根因

   public static Map> getServiceUrlsMapFromConfig(EurekaClientConfig clientConfig, String instanceZone, boolean preferSameZone) {
        Map> orderedUrls = new LinkedHashMap<>();
        String region = getRegion(clientConfig);
        String[] availZones = clientConfig.getAvailabilityZones(clientConfig.getRegion());
        if (availZones == null || availZones.length == 0) {
            availZones = new String[1];
            availZones[0] = DEFAULT_ZONE;
        }
        logger.debug("The availability zone for the given region {} are {}", region, Arrays.toString(availZones));
        int myZoneOffset = getZoneOffset(instanceZone, preferSameZone, availZones);


        String zone = availZones[myZoneOffset];
        List serviceUrls = clientConfig.getEurekaServerServiceUrls(zone);
        if (serviceUrls != null) {
            orderedUrls.put(zone, serviceUrls);
        }

   ...

此方法会返回一个map  解析配置文件

{defaultZone=[http://IP:8761/eureka/, http://IP:8762/eureka/,/]}

源配置

 defaultZone: http://IP:8761/eureka/,http://IP:8762/eureka/

问题就出在配置后面多了一个, 解析时候 多了个路径 /


解决方法:

defaultZone: http://IP:8761/eureka/,http://IP:8762/eureka/

去掉末尾,

defaultZone: http://IP:8761/eureka/,http://IP:8762/eureka/


注意事项:eureka 客户端会根据 defaultZone 中配置用,去解析当做server 


你可能感兴趣的:(微服务,Eureka,Spring,cloud)