引发原因:
导致该异常的起始就一种,即应用名称在注册列表中不存在!!!不过根据错误的引发点可以细分为以下两点:
使用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