com.netflix.zuul.exception.ZuulException: Forwarding error

一、前言

随着技术的更新,springCloud几乎遍布了市场,在舆论圈里几乎每天听到的就是cloud。它有着很费方便很简洁的组件,
有着具有强大功能的组件,但是人无完人,物无完物。它也有着大大小小的疑难杂症,
今天咱们就谈一谈client与注册中心心跳丢失导致zuul网关连接超时

二、问题

这是在网关日志中发现的错误异常信息

2020-11-05 08:26:01.732  WARN 11 --- [o-22301-exec-17] o.s.c.n.z.filters.post.SendErrorFilter   : Error during filtering

com.netflix.zuul.exception.ZuulException: Forwarding error
	at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:189) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar!/:2.0.0.RELEASE]
	at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:164) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar!/:2.0.0.RELEASE]
。。。。。
Caused by: com.netflix.client.ClientException: null
	at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:118) ~[ribbon-loadbalancer-2.2.5.jar!/:2.2.5]
	at org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.run(AbstractRibbonCommand.java:186) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar!/:2.0.0.RELEASE]
	at org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.run(AbstractRibbonCommand.java:51) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar!/:2.0.0.RELEASE]
。。。。。
Caused by: java.lang.RuntimeException: org.apache.http.conn.HttpHostConnectException: Connect to 1103s.cn:11786 [1103s.cn/90.10.1.252] failed: Connection refused (Connection refused)
	at rx.exceptions.Exceptions.propagate(Exceptions.java:57) ~[rxjava-1.3.8.jar!/:1.3.8]
	at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:463) ~[rxjava-1.3.8.jar!/:1.3.8]
	at rx.observables.BlockingObservable.single(BlockingObservable.java:340) ~[rxjava-1.3.8.jar!/:1.3.8]
	at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:112) ~[ribbon-loadbalancer-2.2.5.jar!/:2.2.5]
	... 135 common frames omitted
Caused by: org.apache.http.conn.HttpHostConnectException: Connect to 1103s.cn:11786 [1103s.cn/90.10.1.252] failed: Connection refused (Connection refused)
	at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:159) ~[httpclient-4.5.5.jar!/:4.5.5]
	at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:373) ~[httpclient-4.5.5.jar!/:4.5.5]
	at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381) ~[httpclient-4.5.5.jar!/:4.5.5]
	at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237) ~[httpclient-4.5.5.jar!/:4.5.5]
	at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185) ~[httpclient-4.5.5.jar!/:4.5.5]
  • 很多时候就这样,简简单单几个字母所组成的 bug 让你困惑半天
  • 然后今天咱们主要讨论的是 “Connect to 1103s.cn:11786” 这个服务客户端,为什么会丢失,导致zuul转发时候在注册中心找到一个null实例,从而报错超时等。。问题

三、排查服务

刚开始很蒙蔽,看网上说是改超时时间,也去改了,后来想想,
如果服务器存在问题情况,不管修改超时时间为再大 好像也是没有什么用处的呀。顿时感觉陷入了万丈深渊,赶紧进行Ctrl+Z操作。
打开我们的服务的日志发现,eureka注册中心与提供方服务之间的心跳失败

  • 举个例子 (网约车)

这就好比是网约车出现以前,人们出门叫车只能叫出租车。一些私家车想做出租却没有资格,被称为黑车。而很多人想要约车,但是无奈出租车太少,不方便。私家车很多却不敢拦,而且满大街的车,谁知道哪个才是愿意载人的。一个想要,一个愿意给。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201105113308157.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyODE4NDk2,size_16,color_FFFFFF,t_70#pic_center

摘抄 @https://blog.csdn.net/BruceLiu_code/article/details/89765695
1.2.1 EurekaServer
EurekaServer作为一个独立的部署单元,以RESTAPI的形式为服务实例提供了注册、管理和查询等操作。同时,EurekaServer也为我们提供了可视化的监控页面,可以直观地看到各个EurekaServer当前的运行状态和所有已注册服务的情况。

EurekaServer节点启动后,会首先尝试从邻近节点获取所有实例注册表信息,完成初始化。EurekaServer通过getEurekaServiceUrls()方法获取所有的节点,并且会通过心跳续约的方式定期更新。默认配置下,如果EurekaServer在一定时间内没有接收到某个服务实例的心跳,EurekaServer将会注销该实例(默认为90秒,通过eureka.instance.lease-expiration-duration-in-seconds配置)。当EurekaServer节点在短时间内丢失过多的心跳时(比如发生了网络分区故障),那么这个节点就会进入自我保护模式。

自我保护模式:
默认配置下,如果EurekaServer每分钟收到心跳续约的数量低于一个阈值(instance的数量(60/每个instance的心跳间隔秒数)自我保护系数),并且持续15分钟,就会触发自我保护。在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该EurekaServer节点就会自动退出自我保护模式。它的设计理念就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。该模式可以通过eureka.server.enable-self-preservation=false来禁用,同时eureka.instance.lease-renewal-interval-in-seconds可以用来更改心跳间隔,eureka.server.renewal-percent-threshold可以用来修改自我保护系数(默认0.85)。

1.2.2 EurekaClient
●服务注册:
启动时,会调用服务注册方法,向EurekaServer注册自己的信息。EurekaServer会维护一个已注册服务的列表。当实例状态发生变化时(如自身检测认为Down的时候),也会向EurekaServer更新自己的服务状态,同时用replicateToPeers()向其它EurekaServer节点做状态同步。

●续约与剔除:
服务实例启动后,会周期性地向EurekaServer发送心跳以续约自己的信息,避免自己的注册信息被剔除。续约的方式与服务注册基本一致,首先更新自身状态,再同步到其它Peer。如果EurekaServer在一段时间内没有接收到某个微服务节点的心跳,EurekaServer将会注销该微服务节点(自我保护模式除外)。

●服务消费:ServiceConsumer本质上也是一个EurekaClient。它启动后,会从EurekaServer上获取所有实例的注册信息,包括IP地址、端口等,并缓存到本地。这些信息默认每30秒更新一次。前文提到过,如果与EurekaServer通信中断,ServiceConsumer仍然可以通过本地缓存与ServiceProvider通信。

●三处缓存
EurekaServer对注册列表进行缓存,默认时间为30s。
EurekaClient对获取到的注册信息进行缓存,默认时间为30s。
Ribbon会从上面提到的EurekaClient获取服务列表,将负载均衡后的结果缓存30s。

😁 作者:Teddy (公众号:鸡仓故事汇)
ok!到这里就大功告成,小编(Teddy)在这里先感谢大家的到来。
虽然不是太详细,小编已经很努力,给小编来个一键三连(点赞,关注,收藏),小编会越来越努力。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值