Spring Cloud 出现No instances available for user-service异常
项目场景:
使用Spring Cloud Alibaba使用Nacos作为注册中心,从order-service订单服务调用user-service用户服务。
启动两个服务,访问nacos的web控制台,两个服务均能正确注册到Nacos。
使用的Spring Cloud Alibaba版本:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>
Nacos版本: 2.0.0-BETA,运行在一台物理机上。
user-service和order-service运行在同一台物理机。与nacos不在一台机器,但在一个局域网内。
问题描述:
当在order-service中调用user-service中的接口时,出现如下错误:
2021-02-20 14:18:57.099 INFO 5292 --- [nio-8011-exec-1] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client user-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=user-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:com.alibaba.cloud.nacos.ribbon.NacosServerList@19ec1163
2021-02-20 14:18:57.135 ERROR 5292 --- [nio-8011-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No instances available for user-service] with root causejava.lang.IllegalStateException: No instances available for user-serviceat org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:119) ~[spring-cloud-netflix-ribbon-2.2.5.RELEASE.jar:2.2.5.RELEASE]at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:99) ~[spring-cloud-netflix-ribbon-2.2.5.RELEASE.jar:2.2.5.RELEASE]
order-service调用user-service的代码:
@GetMapping("/order/create")
public String newOrder(long userId,String goodsId,int count){Object user = restTemplate.getForObject("http://user-service/user/info?userId={userId}",Object.class,Collections.singletonMap("userId", userId));System.out.println(user);System.out.println("生成订单,商品id:"+goodsId+",数量:"+count);return "ok";
}
原因分析:
首先排除法分析原因:
1、排除服务未成功注册到nacos,因为通过Nacos的web控制台可以看到已经成功注册服务。
2、排除RestTemplate类未加@LoadBalanced注解,再三确认RestTemplate Bean加了这个注解,此注解使用Ribbon进行服务调用负载均衡,通过上边的日志看出Ribbon是生效的。
3、通过Nacos提供的api,http://ip:8848/nacos/v1/ns/instance/list?serviceName=user-service,发现user-service服务列表为空,如下:
发现hosts为空,问题就出在这,服务从注册中心拉取其他服务的注册信息时,使用的就是这个接口,获取不到user-service的注册信息,在调用接口时Ribbon负责将url中的user-servicel替换成实例的ip地址和端口,发现没有该服务的实例,所以抛出了No instances available for user-service异常。同时查看上边的日志也可以看到这句:
DynamicServerListLoadBalancer for client user-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=user-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:com.alibaba.cloud.nacos.ribbon.NacosServerList@19ec1163
这句日志是info级别的,一般情况谁会在意info级别的日志。仔细看发现current list of Servers=[],为空,和通过接口查询的结果一致。
根本原因找到了,是Nacos提供的拉取服务信息的接口返回的数据不对。
那到底是什么原因导致的这个问题?
解决方案:
仔细查看Nacos中注册的服务信息,发现注册的服务ip地址不对,如下图:
我本机的IP地址是192.168.0.104这个192.168.60.1哪来的?
执行ipconfig:
发现服务注册的ip使用了VMware的虚拟网络。没有使用192.168.0.104的局域网,相当于多块网卡,在进行服务注册时候,选中了VMware虚拟网络。
将服务注册的ip改成192.168.0.104这个,使Nacos和服务之间在一个网段,方法如下:
在服务的application.yml中,加入配置:
spring.cloud.inetutils: preferred-networks=192.168.0 #服务注册时优先使用这个网段。
重启服务,然后重试,一切OK!
调用Nacos的openAPI,http://192.168.0.105:8848/nacos/v1/ns/instance/list?serviceName=user-service
Spring Cloud 出现No instances available for user-service异常相关推荐
- 微服务等于Spring Cloud?了解微服务架构和框架
作者:TIM XU 来源:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/ 微服务初探 什么 ...
- Spring Cloud OpenFeign使用教程
文章目录 Spring Cloud OpenFeign Demo 怎么配置OpenFeignServer 怎么配置OpenFeignClient 多个参数传递问题 FeignClient的日志问题 多 ...
- 服务迁移之路 | Spring Cloud向Service Mesh转变 | 技术干货
戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 作者: 李宁 转自:博云技术社区 Sp ...
- 微服务等于Spring Cloud?一文告诉你微服务到底是什么
作者:TIM XU 原文:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/ 1 微服务初探 ...
- Java 微服务框架选型(Dubbo 和 Spring Cloud?),大厂 HR 如何面试
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 微服 ...
- 两大微服务框架dubbo和spring cloud对比
一.基本介绍 dubbo Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案.简单的说,Dubbo 就是个服务框架,说白了就是个远程服务 ...
- ws配置 zuul_微服务网关 Spring Cloud Gateway
1. 为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...
- 微服务等于 Spring Cloud?了解微服务架构和框架
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...
- Spring Cloud微服务简介
1. 基础知识1 什么是微服务架构? 与单体系统的区别 如何实施微服务? 微服务优缺点 为什么选择Spring Cloud? 微服务技术选型 为什么选择Spring Cloud? Spring Clo ...
- Spring Cloud Kubernetes 中文文档
本参考指南介绍了如何使用Spring Cloud Kubernetes. 1.为什么需要Spring Cloud Kubernetes? Spring Cloud Kubernetes提供了使用Kub ...
最新文章
- Redis 笔记(09)— 过期时间 expire(设置、查询、取消过期时间)
- 动态划分VLAN的方法中不包括(23)。【答案】C
- 「AI初识境」深度学习中常用的损失函数有哪些?
- 码农口述:AI创业两年,积蓄花光,重回职场敲代码
- Redis 常用操作命令
- redis安装全过程
- JS —— 存取器属性get()和set()
- 计算领域的致敬与前行
- python输出不重复的单词_Python情感分析(比较单词时,不计算文本中重复的单词)...
- python中+和join()的区别
- 轨道病害视觉检测:背景、方法与趋势
- java中 在一个异常处理中什么语句块是可多个的
- Material Design组件之NavigationView
- 面向对象进阶(day7)
- MariaDB的简单使用
- Linux 基本命令(自学笔记)
- redis LRU淘汰策略原理
- MySQL数据库建立数据库和表(命令行方式)
- Redis教程(全面实战教程)
- Eclipse SVN 忽略文件或文件夹
热门文章
- jsp 图片下载功能
- 仿苹果响应式官网(含代码!)
- U盘(移动硬盘)介质写入保护解决办法
- layui图标不显示的解决办法
- 计算机顶级会议排名以及英文投稿的一点经验
- c语言题 设圆的半径,C语言初学者:编程序:设圆半径r圆柱高h,求圆周长面积圆柱体积圆球表面积...
- 0ctf之simple
- Oracle 11gR2 dataguard 介绍
- 基于VUMAT复合材料夹层结构冲击仿真
- oracle 返回 xml解析,Oracle xmltable解析返回LPX-00209(Oracle xmltable parsing return LPX-00209)...