Spring异常:java.lang.IllegalStateException: No instances available for XXX

mac2022-06-30  16

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

最新回复(0)