从ISTIO熔断说起-轻舟网关熔断
最近大家经常被熔断洗脑,股市的动荡,让熔断再次出现在大家眼前。微服务中的熔断即服务提供方在一定时间内,因为访问压力太大或依赖异常等原因,而出现异常返回或慢响应,熔断即停止该服务的访问,防止发生雪崩效应。轻舟网关基于Envoy实现,在社区熔断思路上进行扩展。本文从Istio中熔断说起,拨云见日,漫谈轻舟网关熔断。
从熔断说起
最近大家经常被熔断洗脑,股市的动荡,有幸两周内见证了美股的四次熔断。那究竟什么是熔断呢,在股票界熔断实际上就是自动停盘,股市在跌到一定的程度后,暂停股票交易。对比股市,微服务中的熔断即服务提供方在一定时间内,因为访问压力太大或依赖异常等原因,而出现异常返回或响应变慢等。熔断即停止对该服务的调用,防止发生“雪崩效应”。从服务网关的角度看,熔断即是在网关侧阻止对服务提供方(upstream)的调用。本文从服务网关的角度窥探ISTIO中如何进行熔断,保护后端业务。

Istio熔断
Istio提供了丰富的熔断手段,通过异常点检测以及连接池配置起到保护后端的效果。异常点检测动态确定上游集群中的健康状态,如果出现连续访问异常,则将异常后端从负载均衡实例中驱逐,在一段时间内不向其中打流量。过一段时间,加入到负载均衡集群中,继续提供服务,若还是不正常,加大隔离时间。ISTIO提供了主动和被动健康检查,异常检测可以认为是被动的的健康检查,数据面Envoy提供了主动健康检查,在上游集群上配置健康检查接口,主动和被动一起使用,作为一个整体的健康检查方案,保障上游集群高可用。
异常点检测在控制面配置在DestionRule CRD中,对应到数据面Envoy中体现在Cluster上的配置。主要的配置项包括:
1、consecuitiveErrors:连续错误次数。对于HTTP服务,502、503、504会被认为异常,TPC服务,连接超时即异常
2、intervals:驱逐的时间间隔,默认是10秒
3、baseEjectionTime:最小驱逐时间。驱逐时间会随着错误次数增加而增加。即错误次数*最小驱逐时间
4、maxEjectionPercent:负载均衡池中可以被驱逐的实例的最大比例。以免某个接口瞬时不可用,导致太多实例被驱逐,进而导致服务整体全部不可用。
同时Istio还提供了连接池配置,通过针对四层TCP以及七层HTTP连接的配置,进行客户端访问的限流。具体的配置主要包括:TCP连接池配置以及HTTP连接池配置。配置项主要包括:

HTTP连接池配置和TCP连接设置配合使用。对应到数据面Envoy上根据业务属性进行划分,一部分划分为cluster.circuit_breakers,另一部分属于cluster的配置。
|
Istio配置 |
Envoy配置 |
含义 |
备注 |
|---|---|---|---|
| maxConnection | cluster.circuit_breakers.max_connections | Envoy为上游集群建立的最大连接数 | |
| http1MaxPendingRequests | cluster.circuit_breakers.max_pending_requests | 最大等待HTTP请求数,默认1024 |
如果超过,cluster的upstream_rq_pending_overflow计数器增加 |
| http2MaxRequests | cluster.circuit_breaker.maxRequests | HTTP2最大连接数 | 仅适用HTTP2, HTTP1由maxConnection控制。如果超出,cluster的upstream_rq_pending_overflow计数器增加,可以由stat查看 |
| maxRetries | cluster.circuit_breaker.max_retries | 最大重试次数 | 在指定时间内,集群所有主机能够执行的最大重试次水。如果超出,cluster的upstream_rq_retry_overflow计数器增加 |
| connectionTimeOut | cluster.connection_timeout_ms | cluster.connection_timeout_ms | |
| maxRequestsPerConnection | cluster.max_request_per_connection | 每个连接最大请求数 |
Istio熔断与Hystrix熔断
Hystrix是微服务领域成熟的熔断框架,是Netflix开源的熔断框架。不过从18年底已经不在积极维护了。Hystrix对请求进行封装,相关的逻辑在独立的线程中运行,通过线程池达到资源隔离的效果。Hystrix提供了熔断能力,具备自动检测与恢复,断路开关在Open,Half-Open以及Closed状态间进行自动切换;同时提供了FallBack方法,便于用户在后端服务熔断情况下进行降级。

任何架构都有不同的使用场景,正如没有完美的架构只有合适的架构一样。灵活的配置以及可扩展性使得Hystrix融合在SpringCloud体系下,为SpringCloud微服务框架提供熔断功能。但是与之带来的是在使用Hystrix过程中,必须引入Hystrix依赖包。可以把Hystrix认为是一个白盒,开发人员可以针对业务进行相关的定制,包括降级方法的编写等。虽然,可以通过SDK模式从代码上解耦业务和相关熔断治理,但是业务和SDK还是需要一起编译。同时,Hystrix仅适用于java语言。
而Istio的熔断对业务完全是透明的,无需对业务有任何依赖;在sidecar模式下,做到和业务集群无缝连接。不过Istio的熔断更多是基于集群进行配置,熔断力度相较于某些业务场景还有一定的薄弱。
熔断示例
轻舟网关提供了丰富的熔断配置页面,通过轻舟网关的控制台,可以配置连接池配置。具体配置如下:TCP最大连接数配置为1,HTTP最大pending请求数配置为1。
通过控制台的配置,可以将具体的配置转换成Istio中VirtualService的trafficPolicy的配置。具体如下

串行请求5次服务接口,查看数据面envoy stat的状态,可以看到5次请求均返回200。

并发5次请求服务接口,客户端收到三个503,2个200状态返回,查看数据面envoy stat可以看到对应的2xx为2次,5xx为三次。5xx产生的原因为upstream_rq_pending_overflow。即因为max_pending数配置为1 ,请求被熔断。

轻舟网关熔断
轻舟网关基于Istio的熔断实现了服务级别的熔断限流。提供了服务维度的主动健康检查、被动健康检查以及连接池配置。同时,轻舟网关在服务的基础上,扩展了路由级别的熔断,结合hystrix的思路,使用滑动窗口来统计错误率和RT。实现了熔断插件,作用于路由和virtualhost级别。具体的流程如下:
轻舟网关同时提供了丰富的限流策略起到对后端业务的保护,基于rate-limit-server实现。提供基于百分比请求的流控,基于条件的频控,包括Header等维度的限流,具体的配置页面如下:这是一个最简单的配置,配置为请求Header中带有IP:127.0.0.1的请求,每分钟请求100次,超过100次触发限流,返回429。
轻舟网关目前提供了丰富的网关10几种插件,扩展envoy原生路由功能。包括缓存,cors,jsonp,限流,动态降级,静态降级,熔断,鉴权等插件。有兴趣的同学可以了解下轻舟网关。
从ISTIO熔断说起-轻舟网关熔断的更多相关文章
- spring cloud Hystix熔断机制--基本熔断配置和Fegin client熔断配置
所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的提供方出现了问题之后整个的程序将出现错误的信息显示 ...
- Istio实践(4)- 故障注入、熔断及ServiceEntry
前言:接上一篇istio多服务应用部署及调用,本文介绍通过流量管理(故障注入.请求超时等)以及ServiceEntry外部服务部署应用 1.设置服务延迟 修改springbootapp-vs-v1.y ...
- 利用Spring Cloud实现微服务- 熔断机制
1. 熔断机制介绍 在介绍熔断机制之前,我们需要了解微服务的雪崩效应.在微服务架构中,微服务是完成一个单一的业务功能,这样做的好处是可以做到解耦,每个微服务可以独立演进.但是,一个应用可能会有多个微服 ...
- spring cloud 2.x版本 Gateway熔断、限流教程
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...
- Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)
目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashboar ...
- 重新整理 .net core 实践篇————熔断与限流[三十五]
前言 简单整理一下熔断与限流,跟上一节息息相关. 正文 polly 的策略类型分为两类: 被动策略(异常处理.结果处理) 主动策略(超时处理.断路器.舱壁隔离.缓存) 熔断和限流通过下面主动策略来实现 ...
- Hystrix 熔断机制原理
相关配置 circuitBreaker.enabled 是否开启熔断 circuitBreaker.requestVolumeThreshold 熔断最低触发请求数阈值 circuitBreaker. ...
- 玩转Spring Cloud之熔断降级(Hystrix)与监控
本文内容导航目录: 前言:解释熔断降级一.搭建服务消费者项目,并集成 Hystrix环境 1.1.在POM XML中添加Hystrix依赖(spring-cloud-starter-netflix-h ...
- 【五】服务熔断、降级 —— Hystrix(豪猪)
分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖,每个依赖关系将在某些时候将不可避免地失败. 服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务 B和微服务 ...
随机推荐
- 人心和隐私怎么防?“防出轨”APP让道德滑落
王尔德曾说过,"一个人应该永远保持一点神秘感".让·保·里克特也表示,:"一个人泄露了秘密,哪怕一丝一毫,就再也得不到安宁了".可见,对于自然人来说,保有自 ...
- Flutter调研(1)-Flutter基础知识
工作需要,因客户端有部分页面要使用flutter编写,需要QA了解一下flutter相关知识,因此,做了flutter调研,包含安装,基础知识与demo编写,第二部分是安装与环境配置. —— Flut ...
- localstorage二次封装-模块模式
var db = function () { // 本地存储前缀,减少命名冲突 var prefix = 'ydb'; return { setPrefix: function (_prefix) { ...
- JZOJ 3526. 【NOIP2013模拟11.7A组】不等式(solve)
3526. [NOIP2013模拟11.7A组]不等式(solve) (File IO): input:solve.in output:solve.out Time Limits: 1000 ms M ...
- echarts实现饼图及横向柱状图的绘制
项目中需要绘制饼图,因此简单学习了下echarts的基本使用.head中引入js文件: <script src="/static/frame/echarts/echarts.min.j ...
- 【学习笔记】Golang学习方向整理
前言 作为一个Java开发,给大家说Golang方向,好吓人...溜了溜了... 哦对了,如有不对的地方,还请指出.感谢! 某面试平台golang技能要求简要摘录 掌握 GO 语言,熟悉常用 pack ...
- SpringBoot图文教程15—项目异常怎么办?「跳转404错误页面」「全局异常捕获」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...
- 添加bash命令
cd ~/.bash vim mya 键入 #!/bin/bash hostname -i :x 保存退出 source ~/.bash_profile 生效
- MATLAB神经网络(2)之R练习
1. AMORE 1.1 newff newff(n.neurons, learning.rate.global, momentum.global, error.criterium, Stao, hi ...
- 序列化器:ModelSerializer
ModelSerializer 类提供了一个快捷方式,可让你基于 Models 自动创建一个 Serializer 类,其中的字段与模型类字段对应. ModelSerializer 类与常规 Seri ...