从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和微服务 ...
随机推荐
- 纯css3配合vue实现微信语音播放效果
前言 每次写点东西都扯两句-0-,这几天一半精力放在移动端,一半维护之前的项目.书也少看了,不过还好依旧保持一颗学习的心.对于css3我是之前有专门整理过的,因此对于原理之前也算了解.今天是项目中遇到 ...
- Linux sed命令实例解析
最近看project的makefile,又见到了sed的强大编辑能力,在makefile工作之前,通常都是执行脚本或者make menuconfig来配置好各种全局变量.sed活动阶段通常在bash ...
- Wordpress 外网访问时不显示图片解决办法
我的云服务器是 :windows2012R 打开命令行: 进入到mysql中 show databases; //查看你Wordpress使用的数据库是否存在 use blog; //例如你使用的数据 ...
- 用mpvue写个玩意儿玩玩
下周公司要搞黑客马拉松了,组里可能会做个小程序.然后看到了mpvue感觉还不错,于是就打算试试水.用vue写小程序听上去美滋滋.那么先开始吧! 全局安装 vue-cli $ npm install - ...
- Codeforces Round #620 (Div. 2)
Codeforces Round #620 (Div. 2) A. Two Rabbits 题意 两只兔子相向而跳,一只一次跳距离a,另一只一次跳距离b,每次同时跳,问是否可能到同一位置 题解 每次跳 ...
- Markdown使用说明
# Markdown 使用说明 Markdown 是一种**轻量级标记语言** 使用规则: 1. 标题 2. 列表 3. 引用 4. 图片与链接 5. 粗体与斜体 6.表格 7. 代码框 8. 分 ...
- AX中Json转化成表记录
static void JsonToTable(str _json,Common _Common){ sysdictTable dictTable; TableId ...
- 项目测试中发现产品bug怎么办
我所在的产品线,并非公司最大最强的产品 甚至为了推广我们这个产品,一般会拿给客户先免费试用 而在试用之前,是要经过一番通测的,测得很急,测得很快 所以产品bug非常多 那么在测试项目的时候,自然会发现 ...
- C语言程序设计(五) 选择控制结构
第五章 选择控制结构 分治策略:任务分解细化 程序设计语言:为了让计算机执行由高级语言编写的程序指令,必须把这些指令从高级语言形式转换成计算机能理解的机器语言形式,这种转换是由编译器来完成的 算法:为 ...
- Java反射之数组的反射应用
上一篇我们说了Java反射之成员方法的反射 这一篇我们说一说数组的反射应用,数组的有长度等属性,所以也会有相应的方法获得这些属性,这里我们不一一列举哪些方法.我们来了解反射包中的一个类----Arra ...