Spring异常:java.lang.IllegalStateException: No instances available for XXX
引发原因:
导致该异常的起始就一种,即应用名称在注册列表中不存在!!!不过根据错误的引发点可以细分为以下两点:
- 使用ip+port代替应用名
- 使用的应用名称没有在Eruake中注册
只能使用应用名进行访问:
使用ribbon方式进行负载均衡时,只能使用在注册中心注册了的应用名,不能使用ip+portd的形式进行访问。rbbion的工作原理是,对请求进行拦截,获取url中的应用名称(当然该应用名称不一定正确),然后从Eureka获取注册服务列表,采用负载均衡策略进行访问。
实例:
案例一:
服务启动类
@SpringBootApplication
@EnableSwagger2
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@Bean
@LoadBalanced//使用负载均衡器Ribbon
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
业务实现类
@Service
public class ProductOrderImpl implements ProductOrderService {
@Autowired
private RestTemplate restTemplate;
@Override
public ProductOrder save(Integer userId, Integer productId) {
//获取商品详情
Object object = restTemplate.getForObject(
"http://localhost:8771/api/v1/product/find?id=" + productId, Object.class);
return object;
}
}
错误就在于http地址采用了ip+port的形式
异常解决:
Object object = restTemplate.getForObject(
"http://localhost:8771/api/v1/product/find?id=" + productId, Object.class);
将上述代码改为如下
Object object = restTemplate.getForObject(
"http://product-service/api/v1/product/find?id=" + productId, Object.class);
案例二:
我这里遇到的问题就是,即使改用了应用名称也一直报java.lang.IllegalStateException: No instances available for product-service
,提示显示product-service服务依然没有注册到注册中心,这是为什么呢???
实际上我们在这里需要区分注册实例应用名称(eureka.instance.appname)和应用名称(spring.application.name)
先来看一下几个不同的配置操作:
-
配置文件只配置了eureka.instance.appname
配置代码
eureka.instance.appname=product-service
注册中心
-
配置文件只配置spring.application.name
配置代码
spring.application.name=product-service
注册中心
-
全部配置
配置代码
eureka.instance.appname=product-service-a spring.application.name=product-service-b
注册中心
以上三个操作我们不难得出以下结论:
- eureka.instance.appname对应注册中心的Application列,是对一个微服务的统称
- spring.application.name对应注册中心的Status列
- 并且当eureka.instance.appname没有进行设置时,spring.application.name的内容将会自动覆盖eureka.instance.appname
错误分析:
第二种情况是因为只设置了eureka.instance.appname对应微服务的统称,实际上每个独立端口实例依然没有统一的名称,因此ribbon找不到对应的服务。
网络资源:
https://www.cnblogs.com/ejiyuan/p/11027229.html