欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决java.lang.IllegalStateException: No instances available for service-provider] with root cause java

程序员文章站 2022-07-15 16:16:31
...

解决java.lang.IllegalStateException: No instances available for service-provider] with root cause java问题

前提是服务已经在Consul注册成功了,但是service-provider服务健康检查未通过

浏览器访问订单页面

解决java.lang.IllegalStateException: No instances available for service-provider] with root cause java

后台报错

解决java.lang.IllegalStateException: No instances available for service-provider] with root cause java

检查Consul服务出现健康检查没有通过

解决java.lang.IllegalStateException: No instances available for service-provider] with root cause java

问题分析

1.出现Consul监控检查未通过,可以从以下几个方面进行检查:

1)检查pom文件中是否添加如下依赖:

 <!--spring boot actuator依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

2)检查application.yaml文件中,application与cloud是否对齐(我的是因为没有对齐才出现健康检查未通过)

server:
  port: 7070 # 端口
spring:
  application:
    name: service-provider # 应用名称
    # 配置Consul注册中心
  cloud:
    consul:
      # 注册中心的访问地址
      host: localhost
      port: 8500
      # 服务提供者信息
      discovery:
        register: true # 是否需要注册
        instance-id: ${spring.application.name}-01 # 注册实例id(必须唯一)
        service-name: ${spring.application.name} # 服务名称
        port: ${server.port} # 服务端口
        prefer-ip-address: true #是否使用ip地址注册
        ip-address: ${spring.cloud.client.ip-address} # 服务请求ip

2.出现java.lang.IllegalStateException: No instances available for service-provider] with root cause java,需要检查以下几个方面:

@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 根据主键查询订单
     * @param id
     * @return
     */
    @Override
    public Order selectOrderById(Integer id) {
        return new Order(id,"order-001","中国",22780D,selectProductListByLoadBalancerAnnotation());
    }

    private List<Product> selectProductListByLoadBalancerAnnotation() {
        //ResponseEntity:封装了返回数据
        ResponseEntity<List<Product>> response = restTemplate.exchange("http://service-provider/product/list",
                HttpMethod.GET, null, new ParameterizedTypeReference<List<Product>>() {
                });
        return response.getBody();
    }
}
@SpringBootApplication
public class ServiceConsumerApplication {
    /**
     * 注入restTemplate,使得restTemplate具有负载均衡的能力
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }
}

注意:
由于在启动类中引入了注解@LoadBalanced,所以OrderServiceImpl 类中exchange方法中的url必须采用的是http://应用名/product/list,其中应用名指的是application.yml文件中的
spring:
application:
name: service-provider # 应用名称

如果上述都检查没有问题,应该就不会出现java.lang.IllegalStateException: No instances available for service-provider] with root cause java这个错误了