: 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