RestTemplate 添加了@LoadBalanced为什么不能使用ip调用接口

LoadBalancerClient

通过查看LoadBalancerClient的源码发现其默认实现类为:RibbonLoadBalancerClient

 @Bean
    @ConditionalOnMissingBean({LoadBalancerClient.class})
    public LoadBalancerClient loadBalancerClient() {
        return new RibbonLoadBalancerClient(this.springClientFactory());
    }

在RibbonLoadBalancerClient中 会通过ILoadBalancer 类会通过serviceId去获取server.(截取部分代码)

 public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint) throws IOException {
     ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);
     Server server = this.getServer(loadBalancer, hint);
     if (server == null) {
         throw new IllegalStateException("No instances available for " + serviceId);
     } else {
         RibbonLoadBalancerClient.RibbonServer ribbonServer = new RibbonLoadBalancerClient.RibbonServer(serviceId, server, this.isSecure(server, serviceId), this.serverIntrospector(serviceId).getMetadata(server));
         return this.execute(serviceId, (ServiceInstance)ribbonServer, (LoadBalancerRequest)request);
     }
 }

 public <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException {
        Server server = null;
        if (serviceInstance instanceof RibbonLoadBalancerClient.RibbonServer) {
            server = ((RibbonLoadBalancerClient.RibbonServer)serviceInstance).getServer();
        }

        if (server == null) {
            throw new IllegalStateException("No instances available for " + serviceId);
        } else {
            RibbonLoadBalancerContext context = this.clientFactory.getLoadBalancerContext(serviceId);
            RibbonStatsRecorder statsRecorder = new RibbonStatsRecorder(context, server);

            try {
                T returnVal = request.apply(serviceInstance);
                statsRecorder.recordStats(returnVal);
                return returnVal;
            } catch (IOException var8) {
                statsRecorder.recordStats(var8);
                throw var8;
            } catch (Exception var9) {
                statsRecorder.recordStats(var9);
                ReflectionUtils.rethrowRuntimeException(var9);
                return null;
            }
        }
    }

    protected ILoadBalancer getLoadBalancer(String serviceId) {
        return this.clientFactory.getLoadBalancer(serviceId);
    }

所以当通过serviceId获取server时获取为空,报错:
No instances available for ipXXXX

posted @ 2022-03-10 15:11  幻影黑子  阅读(481)  评论(0编辑  收藏  举报