使用Feign微服务首次访问不到的问题

来源:7-15 现有架构总结

bugcatt

2019-11-21

微服务首次启动后, 服务间首次使用feign访问会报错:

feign.RetryableException: Read timed out executing POST http://user-center/user-profile/init

可以看到, host位置的ip变成了微服务名称…

但是第二次访问就成功了…

这个很致命…如果重启服务器后首次被访问的是关键业务, 就完蛋了…

求教老师, 如何解决Nacos下注册的微服务间服务首次访问不到的问题

写回答

1回答

大目

2019-11-21

您好:

feign.RetryableException: Read timed out executing POST http://user-center/user-profile/init
可以看到, host位置的ip变成了微服务名称…

整合Ribbon后就是这样打印日志的。Ribbon会把URL中的这个名称解析成Nacos上的服务名称,然后找到对应微服务,再通过负载均衡算法计算请求哪个服务提供者实例。

--------

首次请求你超时一般是由Ribbon的懒加载导致。这个问题的解决方案有几种:

  1. 您可以参考视频6-13一节《饥饿加载》的讲解,为Ribbon配置饥饿加载。这样第一次请求会快很多,就不会超时了。

  2. 为Feign配置更长的超时时间,详见Feign自定义配置的相关章节。里面有超时怎么配置。

  3. 利用Spring Retry,实现重试,这样调用失败,会自动重试。不过要想重试,就得保证接口的幂等性。所以这种玩法成本其实比较高,视频中没有提及,另外Spring Retry也不是本套课程的知识点。如果您打算使用这种方案,可以参考我这篇文章:http://www.itmuch.com/spring-cloud-sum/spring-cloud-retry/

---------

此外,关于首次请求失败的问题,我曾经也专门写了一篇文章,也可以看看:http://www.itmuch.com/spring-cloud-feign-ribbon-first-request-fail/

1
1
bugcatt
好的, 谢谢老师
2019-11-21
共1条回复

Spring Cloud Alibaba微服务从入门到进阶

面向未来微服务:熟练掌握Spring Cloud Alibaba

3085 学习 · 1324 问题

查看课程