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<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 客户端会根据 defaultZone 中配置用,去解析当做server 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值