项目场景:

使用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异常相关推荐

  1. 微服务等于Spring Cloud?了解微服务架构和框架

    作者:TIM XU 来源:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/ 微服务初探 什么 ...

  2. Spring Cloud OpenFeign使用教程

    文章目录 Spring Cloud OpenFeign Demo 怎么配置OpenFeignServer 怎么配置OpenFeignClient 多个参数传递问题 FeignClient的日志问题 多 ...

  3. 服务迁移之路 | Spring Cloud向Service Mesh转变 | 技术干货

    戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 作者: 李宁 转自:博云技术社区 Sp ...

  4. 微服务等于Spring Cloud?一文告诉你微服务到底是什么

    作者:TIM XU 原文:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/ 1 微服务初探 ...

  5. Java 微服务框架选型(Dubbo 和 Spring Cloud?),大厂 HR 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 微服 ...

  6. 两大微服务框架dubbo和spring cloud对比

    一.基本介绍 dubbo Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案.简单的说,Dubbo 就是个服务框架,说白了就是个远程服务 ...

  7. ws配置 zuul_微服务网关 Spring Cloud Gateway

    1.  为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...

  8. 微服务等于 Spring Cloud?了解微服务架构和框架

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...

  9. Spring Cloud微服务简介

    1. 基础知识1 什么是微服务架构? 与单体系统的区别 如何实施微服务? 微服务优缺点 为什么选择Spring Cloud? 微服务技术选型 为什么选择Spring Cloud? Spring Clo ...

  10. Spring Cloud Kubernetes 中文文档

    本参考指南介绍了如何使用Spring Cloud Kubernetes. 1.为什么需要Spring Cloud Kubernetes? Spring Cloud Kubernetes提供了使用Kub ...

最新文章

  1. Redis 笔记(09)— 过期时间 expire(设置、查询、取消过期时间)
  2. 动态划分VLAN的方法中不包括(23)。【答案】C
  3. 「AI初识境」深度学习中常用的损失函数有哪些?
  4. 码农口述:AI创业两年,积蓄花光,重回职场敲代码
  5. Redis 常用操作命令
  6. redis安装全过程
  7. JS —— 存取器属性get()和set()
  8. 计算领域的致敬与前行
  9. python输出不重复的单词_Python情感分析(比较单词时,不计算文本中重复的单词)...
  10. python中+和join()的区别
  11. 轨道病害视觉检测:背景、方法与趋势
  12. java中 在一个异常处理中什么语句块是可多个的
  13. Material Design组件之NavigationView
  14. 面向对象进阶(day7)
  15. MariaDB的简单使用
  16. Linux 基本命令(自学笔记)
  17. redis LRU淘汰策略原理
  18. MySQL数据库建立数据库和表(命令行方式)
  19. Redis教程(全面实战教程)
  20. Eclipse SVN 忽略文件或文件夹

热门文章

  1. jsp 图片下载功能
  2. 仿苹果响应式官网(含代码!)
  3. U盘(移动硬盘)介质写入保护解决办法
  4. layui图标不显示的解决办法
  5. 计算机顶级会议排名以及英文投稿的一点经验
  6. c语言题 设圆的半径,C语言初学者:编程序:设圆半径r圆柱高h,求圆周长面积圆柱体积圆球表面积...
  7. 0ctf之simple
  8. Oracle 11gR2 dataguard 介绍
  9. 基于VUMAT复合材料夹层结构冲击仿真
  10. oracle 返回 xml解析,Oracle xmltable解析返回LPX-00209(Oracle xmltable parsing return LPX-00209)...