Envoy熔断限流实践(一)基于Rainbond插件实现熔断
Envoy 可以作为 Sevice Mesh 微服务框架中的代理实现方案,Rainbond 内置的微服务框架同样基于 Envoy 实现。本文所描述的熔断实践基于 Rainbond 特有的插件机制实现。
Envoy 熔断机制介绍
熔断是分布式系统的重要组成部分。快速失败并尽快给下游施加压力,可以防止整个微服务系统进入糟糕的级联雪崩状态。这是Envoy 网格的主要优点之一,Envoy 在网络级别实现强制断路限制,而不必独立配置和编写每个应用程序。Envoy 支持各种类型的完全分布(不协调)的熔断:
集群最大连接数(MaxConnections):Envoy将为上游群集中的所有主机建立的最大连接数。实际上,这仅适用于HTTP/1.1群集,因为HTTP/2使用到每个主机的单个连接。
集群最大挂起请求数(MaxPendingRequests):在等待就绪连接池连接时将排队的最大请求数。实际上,这仅适用于HTTP/1.1群集,因为HTTP/2连接池不会排队请求。HTTP/2请求立即复用。如果这个断路器溢出,集群的
upstream_rq_pending_overflow计数器将增加。集群最大请求数(MaxRequests):在任何给定时间,群集中所有主机可以处理的最大请求数。实际上,这适用于HTTP/2群集,因为HTTP/1.1群集由最大连接断路器控制。如果这个断路器溢出,集群的
upstream_rq_pending_overflow计数器将增加。集群最大活动重试次数(MaxRetries):在任何给定时间,集群中所有主机可以执行的最大重试次数。一般来说,我们建议积极进行断路重试,以便允许零星故障重试,但整体重试量不能爆炸并导致大规模级联故障。如果这个断路器溢出,集群的
upstream_rq_retry_overflow计数器将递增。
每个熔断阈值可以按照每个上游集群和每个优先级进行配置和跟踪。这允许分布式系统的不同组件被独立地调整并且具有不同的熔断配置。

基于插件机制实现的熔断
Rainbond 云原生应用管理平台通过自有的插件机制实现指定的微服务面向下游组件的熔断。
默认安装的 Rainbond 中已经集成了 出口网络治理插件 以及 综合网络治理插件  ,二者都基于 Envoy 实现,可以对安装了插件的微服务的网络出口方向进行较为全面的网络治理。其中就包括对熔断机制的实现。
为了更好的描述这个过程,特意准备了一个示例。
基于 Locust 实现的压力生成器作为客户端,安装 综合网络治理插件,Java-maven 组件作为服务端。压力生成器可以根据图形化界面设置并发用户数量,对 Java-maven 的服务地址进行压力测试,在此期间,我们可以收集到触发熔断机制时的各种现象。

综合网络治理插件 的安装很简单,在请求发起的客户端(示例中的压力生成器)服务组件的插件页面中点击安装指定的插件即可。
设定熔断阈值
Java-maven 组件基于 Http/1.1 版本协议实现,根据首节对 Envoy 熔断机制的解释,我们可以通过限制 集群最大连接数(MaxConnections) 和 集群最大挂起请求数(MaxPendingRequests) 来设定熔断条件。
点击压力生成器组件的插件,查看 出口网络治理插件 配置,就可以进入其配置页面。
综合网络治理插件 分为入站网络治理配置和出站网络治理配置两个配置区域,熔断阈值的设定位于出站网络治理配置区域。
为了突出实验的效果,我将 MaxConnections 和 MaxPendingRequests 两项均设定为较小的值。

图中的配置,意味着集群最大连接数为 6 ,最大等待的请求数为 1 (这二者的默认值均为 1024)。这一配置,相当于为 Envoy 生成了以下配置:
"circuit_breakers": {
  "default": {
    "max_connections": 6,
    "max_pending_requests": 1
  }
}
为下游应用 Java-maven 的 5000 端口设定的 Domains 也很重要,压力生成器可以通过访问 java-maven 这一域名,将压力施加于 Java-maven 的 5000 端口。
触发熔断
基于 Locust 的 Web 页面可以设定并发条件,在这个实验中,我为域名 http://java-maven 设定了 97 个用户的并发请求。 Locust 的页面中会体现出发起请求的总数,以及处于失败状态的请求数。

所有的错误请求,都获得了由熔断机制返回的 503 状态码。

为了确认压力生成器与 Java-maven 组件间的 Tcp 连接数量的确得到了限制,可以进入 Java
-maven 的 Web终端用命令查看。

命令中的 172.20.1.74 是压力生成器组件的 Pod IP 地址。
这里需要注意,不要去压力生成器中查询 Tcp 连接的生成数量,这个数量会多于 6 个,实际上应该是 97,因为发起请求的 Locust 进程会根据并发用户数量来生成 Tcp 连接,这个过程不受熔断机制限制,然而请求经过 Envoy 时,向 Java-maven 这一服务端,最终只会成功建立并保持 6 个连接。
提升熔断阈值
接下来,通过调整 综合网络治理插件 的配置,调整熔断的阈值,将 MaxConnections 提升至 66。

点击更新配置后,改动将会直接生效,而不需要重启组件。
在压力生成器中适当提升并发用户数到 250,重新开始发起压力测试,可以发现,不再生成错误请求。

重新在 Java-maven 的环境中查询建立的 tcp 连接数量,发现已经不再是 6 ,而是有所上升,但并未到达阈值66。

持续提升并发用户数量,则可以再次触发熔断。
总结
熔断是微服务网络治理体系中非常重要的一环。Rainbond 结合 Envoy 实现的 ServiceMesh 微服务框架中,通过插件实现的熔断机制易于上手,且支持动态生效,对操作人员非常友好。
下一篇,我们将介绍全局限流的实现,敬请期待。
Envoy熔断限流实践(一)基于Rainbond插件实现熔断的更多相关文章
- Envoy熔断限流实践(二)Rainbond基于RLS服务全局限流
		
Envoy 可以作为 Sevice Mesh 微服务框架中的代理实现方案,Rainbond 内置的微服务框架同样基于 Envoy 实现.本文所描述的全局限速实践也是基于 Envoy 已有的方案所实现. ...
 - 阿里熔断限流Sentinel研究
		
1. 阿里熔断限流Sentinel研究 1.1. 功能特点 丰富的应用场景:例如秒杀(即突发流量控制在系统容量可以承受的范围).消息削峰填谷.集群流量控制.实时熔断下游不可用应用等 完备的实时监控:S ...
 - 微服务熔断限流Hystrix之流聚合
		
简介 上一篇介绍了 Hystrix Dashboard 监控单体应用的例子,在生产环境中,监控的应用往往是一个集群,我们需要将每个实例的监控信息聚合起来分析,这就用到了 Turbine 工具.Turb ...
 - Springboot分布式限流实践
		
高并发访问时,缓存.限流.降级往往是系统的利剑,在互联网蓬勃发展的时期,经常会面临因用户暴涨导致的请求不可用的情况,甚至引发连锁反映导致整个系统崩溃.这个时候常见的解决方案之一就是限流了,当请求达到一 ...
 - 服务限流 -- 自定义注解基于RateLimiter实现接口限流
		
1. 令牌桶限流算法 令牌桶会以一个恒定的速率向固定容量大小桶中放入令牌,当有浏览来时取走一个或者多个令牌,当发生高并发情况下拿到令牌的执行业务逻辑,没有获取到令牌的就会丢弃获取服务降级处理,提示一个 ...
 - 微服务熔断限流Hystrix之Dashboard
		
简介 Hystrix Dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard可以直观地看到各Hystrix Command的请求响应时间,请求成功率等数据 ...
 - Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结
		
在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...
 - Spring Cloud alibaba网关 sentinel zuul 四 限流熔断
		
spring cloud alibaba 集成了 他内部开源的 Sentinel 熔断限流框架 Sentinel 介绍 官方网址 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentine ...
 - Spring Cloud Alibaba:Sentinel实现熔断与限流
		
一.什么是Sentinel Sentinel,中文翻译为哨兵,是为微服务提供流量控制.熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩效应”,为微服务系统提供了稳 ...
 
随机推荐
- 记-beego项目调用Jenkins API获取job信息
			
type JenkinsController struct { beego.Controller } type Job struct { Name string `json:"name&qu ...
 - ArrayList如何实现插入的数据按自定义的方式有序存放?
			
编程思路是:实现一个类对ArrayList进行包装,当程序试图向ArrayList中放入数据时,程序将先检查该元素与ArrayList集合中其他元素的大小,然后将该元素插入到指定位置. class M ...
 - Spring容器 从XML 文件中读取bean的定义,并实例化bean?
			
解释Spring框架中bean的生命周期. Spring根据bean的定义填充所有的属性. 如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanN ...
 - Java 中 sleep 方法和 wait 方法的区别?
			
虽然两者都是用来暂停当前运行的线程,但是 sleep() 实际上只是短暂停顿,因为它不会释放锁,而 wait() 意味着条件等待,这就是为什么该方法要释放锁,因为只有这样,其他等待的线程才能在满足条件 ...
 - CI_CD 简单了解
 - 说几个 zookeeper 常用的命令?
			
常用命令:ls get set create delete 等.
 - Python学习--21天Python基础学习之旅(Day03、Day04)
			
关于缩进问题,缩进几个空格都不影响程序解释(不会报错什么的),但一般缩进四个空格是为了可读性和规范. Day03: Chapter 5 1.if语句 1.1条件测试:值为True或False的表达式成 ...
 - buuctf 荷兰带宽数据泄露
			
荷兰带宽数据泄露 下载附件得一个conf.bin文件,这个文件是路由信息文件,题目并没有任何提示,我们先来测试一下最简单的,找username或password然后当作flag交上去,我们使用Rout ...
 - python学习笔记(六)——异常处理
			
异常处理 在 Python 中,通过两个重要的功能来处理程序在运行中出现的异常和错误.其一是本文提到的异常处理,其二是断言(Assertions). python中,所有的异常均派生自 BaseExc ...
 - AD学习总结
			
一.常用快捷键总结 快捷键tab:显示放置的线.元器件.管脚等详细信息(可以修改) 快捷键p:打开放置内容:在元器件原理图中放置能容主要是线等(组合键p+w 启动 "线" 操作 ...