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

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
    

    注册中心

0001.png

  • 配置文件只配置spring.application.name

    配置代码

    spring.application.name=product-service
    

    注册中心

0002.png

  • 全部配置

    配置代码

    eureka.instance.appname=product-service-a
    spring.application.name=product-service-b
    

    注册中心

0003.png

以上三个操作我们不难得出以下结论:

  • 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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值