目录
1、如果没有开启熔断器,可以利用 Feign 组件的配置,设置连接超时和读取超时这的请求超时时间:
2、如果开启熔断器,可以利用熔断器hystrix的配置,来设置熔断器判断异常的时间,或者关闭熔断器的异常检测。
三、问题解决:希望能够给遇到该问题的朋友们一个有效的帮助。编辑编辑
一、场景介绍
遇到的问题,如上图及标题,主要是一个读取数据超时问题导致的,为了让大家明白问题所在,首先先给大家说下我运行的项目框架,主要是一个由Spring CloudAlibaba+Mybatis+Redis+Nacos+OpenFeign等技术组成的一个分布式微服互联网项目。
在运行主页面显示商品类型的时候,内容却显示不出来,报如上问题,但是我的服务提供确显示数据读取正常,为了让大家看的更清晰,我在服务端页面特意加了缓存的备注,第一次拿出的数据是通过服务端数据库拿到的,完全正常,但是消费者客户端就报错了,这就是我说的读取数据超时问题。
原因:因为第一次运行拿数据需要调用服务从数据库拿数据,一旦需要查询的数据内容过多执行次数也就多,那么连接和读取的时间也会随之增加,而Feign调用服务的默认时长是1秒,也就是说超过这个时间,就会连接不上或者未响应,紧接着就报错了,而这时服务提供者还在老实本分的完成工作,完成后将查到的数据存入Redis,所以这就导致了服务正常,客户端报错,然后等服务端完成了工作,缓存也有了,前端页面再次刷新就正常了,直接从缓存中拿到数据,如下图:
有的小伙伴就会说,我怎么没有遇到过这样的问题? 那是因为你数据不多,服务器很快就处理完了,所以不会触发,当你后面遇到的时候就头疼了。还有的会说哪既然这样,让用户多刷新两次不就好了? 说这样话的小伙伴可以去问问你的上面行不行,而且如果不解决,后期涉及熔断器内容的时候,用户第一次进入就会因为报错而跳走,所以今天遇到顺便分享下,也省的踩这个坑。
二、处理方式,在api客户端工程配置文件中添加
1、如果没有开启熔断器,可以利用 Feign 组件的配置,设置连接超时和读取超时这的请求超时时间:
这里的10秒并不是说让你的程序运行10秒,而是延长了超时检测的这个时间,比如你项目查询完内容是2秒,那就是2秒,只要不到10秒,都是属于正常的。
#feign客户端连接超时时间设置 /10秒
feign.client.config.default.connectTimeout=10000
#feign客户端读取超时时间设置 /10秒
feign.client.config.default.readTimeout=10000
2、如果开启熔断器,可以利用熔断器hystrix的配置,来设置熔断器判断异常的时间,或者关闭熔断器的异常检测。
当然这里的10秒仅是延长了超时检测的时间
#设置hystrix超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
#关闭超时时间设置
hystrix.command.default.execution.timeout.enabled=false