您的位置:首页 > 编程语言 > Java开发

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

2017-09-30 10:25 2061 查看
问题描述:

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<AwsEndpoint> getClusterEndpointsFromConfig() {

        String[] availZones = clientConfig.getAvailabilityZones(clientConfig.getRegion());

        String myZone = InstanceInfo.getZone(availZones, myInstanceInfo);

        Map<String, List<String>> serviceUrls = EndpointUtils

                .getServiceUrlsMapFromConfig(clientConfig, myZone, clientConfig.shouldPreferSameZoneEureka());

        List<AwsEndpoint> 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<String, List<String>> getServiceUrlsMapFromConfig(EurekaClientConfig clientConfig, String instanceZone, boolean preferSameZone) {

        Map<String, List<String>> 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<String> 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 客户端会根据 [b]defaultZone 中配置用,去解析当做server [/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Eureka Spring cloud
相关文章推荐