No instances available for IP

时间:2025-03-17 07:24:11

: No instances available for 10.114.10.121
 .(:84) ~[spring-cloud-loadbalancer-3.1.:3.1.1]
 (:56) ~[spring-cloud-commons-3.1.:3.1.1]
 $(:93) ~[spring-web-5.3.:5.3.15]
 (:77) (:48) (:66) 
(:776) 
(:660) 

 (:84)   

// 这个http访问时进行了进一步的实现,会通过 注册中心的 服务名称寻找对应的 微服务,通过服务名称进行调用,我在这里配置IP之后,它那这个IP不能找到对应的服务实例,就报错了。
	@Override
	public <T> ServiceInstance choose(String serviceId, Request<T> request) {
		ReactiveLoadBalancer<ServiceInstance> loadBalancer = (serviceId);
		if (loadBalancer == null) {
			return null;
		}
		Response<ServiceInstance> loadBalancerResponse = ((request)).block();
		if (loadBalancerResponse == null) {
			return null;
		}
		return ();
	}

处理,排除jia,这个jar对微服务的请求进行的进一步的实现,导致不可通过ip直接访问注册中心的服务接口

		<dependency>
			<groupId></groupId>
			<artifactId>spring-cloud-starter-loadbalancer</artifactId>
		</dependency>

情形2:

SpringCloud调用RestTemplate报错:No instances available for

: No instances available for 

    at (:89)
    at (:55)
    at $(:92)
    at (:76)
    at (:48)
    at (:53)
    at (:723)
    at (:698)
    at (:350)
    at (:26)
    at .invoke0(Native Method)
    at (:62)
    at (:43)
    at (:497)
    at $(:50)
    at (:12)
    at (:47)
    at (:17)

原因:

使用了Ribbon进行负载均衡

    @Bean
    @LoadBalanced // 负载均衡  必须使用注册中心上的服务名 不能用ip或域名
    @ConditionalOnMissingBean({})
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

原理:

    @Override
    public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {
        ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
        Server server = getServer(loadBalancer);// 这里会获取服务名 因为我们是IP或域名访问 所以找不到server 抛异常
        if (server == null) {
            throw new IllegalStateException("No instances available for " + serviceId);
        }
        RibbonServer ribbonServer = new RibbonServer(serviceId, server, isSecure(server,
                serviceId), serverIntrospector(serviceId).getMetadata(server));

        return execute(serviceId, ribbonServer, request);
    }

因为ribbon的作用是负载均衡,那么你直接使用ip地址,那么就无法起到负载均衡的作用,因为每次都是调用同一个服务,当你使用的是服务名称的时候,他会根据自己的算法去选择具有该服务名称的服务。
链接:/p/2b50393de3a3