Spring Cloud Netflix Zuul 重试会自动跳过经常超时的服务实例的简单说明和分析
在使用E版本的Spring Cloud Netflix Zuul内置的Ribbon重试功能时,发现Ribbon有一个很精妙的特性:
如果某个服务的某个实例经常需要重试,Ribbon则会在自己维护的一个缓存(serverStatsCache)里将其临时标记为不可用(isCircuitBreakerTripped),后续的所有请求都不会到达该服务实例,直到30(maxCircuitTrippedTimeout的默认值)秒之后,才会放一个请求再次去请求该服务实例。
这其实是Ribbon新增的负载均衡策略之一:AvailabilityFilteringRule(可用性过滤)
—————————————————————————————————————————————————————————————————
———————————————分割线—————以下是一些简单的代码跟踪分析—————观看帮助:截图不是很重要,重要的是文字描述————
—————————————————————————————————————————————————————————————————
当使用Spring Cloud F版本的Gateway的重试功能时,发现并没有该策略,愈发对其感兴趣,想知道如何实现的,索性DEBUG跟着断点走了一百下。。。。在Zuul项目中跟代码分析的思路如下:
0、创建一个spring-cloud-starter-netflix-zuul的项目,和eureka、两个服务,其中一个服务处理时间较长,能触发Ribbon的“熔断”。
1、第一个想到的就是通过日志看一看Ribbon在重试失败的时候做了什么,要看日志当然要打开DEBUG日志级别,在application.yml配置文件中添加如下:
logging:
level:
root: debug
2、清理所有不相干的日志,发现发送HTTP请求的时候走的是RetryTemplate的doExeccute方法,反复debug几遍,发现其中的context在执行到以下代码时忽然有了服务实例信息:

这是一个非常关键的线索,于是重新debug一路跟到给context的serviceInstance赋值的地方

继续跟

上图第56行可以看到赋值,第54行才是选择服务实例,继续



接着:

上图是我改后的源码,做了一些实验,发现当某个服务实例总是触发超时重试后,服务列表经过predicate.getEligibleServers(list,key)方法会把该服务实例给过滤掉。继续跟73行代码
中间略去几张截图,直到跟到

其中的apply方法对服务实例列表中的每个实例进行了过滤,继续跟到其实现

重点来了,用来判断服务实例可不可用的有两个Predicate,其中第二个AvailabilityPredicate就是我们的重点,跟到第二个类的apply方法:

发现总是超时的服务实例,其熔断已经打开,而73行的
stats.getSingleServerStat(input.getServer())
则是整个Ribbon熔断的关键,

通过上图的变量名:serverStatsCache我们就能看明白,这个变量里保存着服务实例的状态,

进一步查看ServerStats中的细节,


是否熔断的判断规则是最后一次触发熔断加上30秒(如下图),和当前时间对比

那么上一次熔断的时间是什么时候设置的呢?

在该方法被调用的时候,至于该方法什么时候被调用的:





上边五张图对其调用时机进行了展示,简单来说就是在发生
java.net.SocketTimeoutException: Read timed out
异常的时候。
到此分析完毕。
分析完后百度上搜一下ServerStats类中的关键字,如
niws.loadbalancer.default.circuitTripMaxTimeoutSeconds
可以看到对Ribbon已经有了很多优秀而系统的源码分析,有时间可以读一下进一步提高。
本文旨在帮助大家分析Ribbon重试和自带熔断机制,并提供一种源码分析的思路,希望对同行有所帮助。
(完毕)
Spring Cloud Netflix Zuul 重试会自动跳过经常超时的服务实例的简单说明和分析的更多相关文章
- SpringCloud学习笔记(20)----Spring Cloud Netflix之服务网关Zuul的各种姿势
1. 禁用过滤器 # zuul.<SimpleClassName>.<filterType>.disable=true # 例如禁用 自定义的过滤器 zuul.MyFilter ...
- Spring Cloud (十三) Zuul:静态路由、静态过滤器与动态路由的实现
前言 本文起笔于2018-06-26周二,接了一个这周要完成的开发任务,需要先等其他人的接口,可能更新的会慢一些,还望大家见谅.这篇博客我们主要讲Spring Cloud Zuul.项目地址:我的gi ...
- spring cloud连载第三篇之Spring Cloud Netflix
1. Service Discovery: Eureka Server(服务发现:eureka服务器) 1.1 依赖 <dependency> <groupId>org.spr ...
- 基于Spring Cloud Netflix的TCC柔性事务和EDA事件驱动示例
Solar Spring Cloud为开发者提供了快速构建分布式系统中的一些常见工具,如分布式配置中心,服务发现与注册中心,智能路由,服务熔断及降级,消息总线,分布式追踪的解决方案等. 本次实战以模拟 ...
- Spring Cloud Netflix多语言/非java语言支持之Spring Cloud Sidecar
Spring Cloud Netflix多语言/非java语言支持之Spring Cloud Sidecar 前言 公司有一个调研要做,调研如何将Python语言提供的服务纳入到Spring Clou ...
- spring cloud 配置zuul实用
在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡 ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十一):服务网关(Zuul)
在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡 ...
- Spring Cloud Netflix项目进入维护模式
任何项目都有其生命周期,Spring Could Netflix也不例外,官宣已进入维护模式,如果在新项目开始考虑技术选型时要考虑到这点风险,并考虑绕道的可能性. 原创: itmuch IT牧场 这 ...
- Spring Cloud Netflix概览和架构设计
Spring Cloud简介 Spring Cloud是基于Spring Boot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策 ...
随机推荐
- 基于C语言的Socket网络编程搭建简易的Web服务器(socket实现的内部原理)
首先编写我们服务器上需要的c文件WebServer.c 涉及到的函数API: int copy(FILE *read_f, FILE * write_f) ----- 文件内容复制的方法 int Do ...
- Java常用API及Math类
一.API的概述 API——Application Programing Interface:应用程序编程接口,是java提供的一些预定义的函数: 目的:基于API实现程序的快速编写,只需了解其作用, ...
- es6的模块化--AMD/CMD/commonJS/ES6
, ); ); }) , )); }); , )); ; export { firstName, lastName, year }; // es6引用 import { firstName, last ...
- Pyinstaller打包selenium去除chromedriver黑框问题解决!!!
Pyinstaller打包selenium去除chromedriver黑框问题解决!!! 问题描述 [1123/101706.932:ERROR:gpu_process_transport_f ...
- Nowcoder contest 392 I 逛公园 (无向图割边模板)
<题目链接> 题目描述: 月月和华华一起去逛公园了.公园很大,为了方便,可以抽象的看成一个N个点M条边的无向连通图(点是景点,边是道路).公园唯一的入口在1号点,月月和华华要从这里出发,并 ...
- ACM-ICPC 2018 南京赛区网络预赛 L 【分层图最短路】
<题目链接> 题目大意: 有N个城市,这些城市之间有M条有向边,每条边有权值,能够选择K条边 边权置为0,求1到N的最短距离. 解题分析: 分层图最短路模板题,将该图看成 K+1 层图,然 ...
- POJ 3159 Candies 【差分约束+Dijkstra】
<题目链接> 题目大意: 给n个人派糖果,给出m组数据,每组数据包含A,B,c 三个数,意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c .最后求n 比 1 ...
- 003.Ansible基础使用
一 Ansible命令用法 Ansible命令行执行方式有:Ad-Hoc.Ansible-playbook两种,Web方式其官方提供付费产品Tower.Ad-Hoc主要用于临时命令的执行,Ansibl ...
- ThreadPoolExecutor 入参 corePoolSize 和 maximumPoolSize 的联系
前言 我们可以通过 java.util.concurrent.ThreadPoolExecutor 来创建一个线程池: new ThreadPoolExecutor(corePoolSize, max ...
- superset链接本地mysql数据库
刚安装好superset的时候大家都知道是用的其自动生成的sqllite数据库,如果我们想让器链接到自己数据库,给大家分享一下我的方法,以mysql为例: 1.安装好数据库mysql: $ sudo ...