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提供的功能一样,可以有效的解决微服务调用产生的“雪崩效应”,为微服务系统提供了稳 ...
随机推荐
- Oracle 数据库应用开发 30 忌
原创 LaoYuanPython CSDN 今天 作者 | LaoYuanPython 责编 | 欧阳姝黎出品 | CSDN原力计划 引言 笔者及所在团队从 2000 年开始的 CRM 等 ...
- 一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?
可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致.
- IDEA 创建javaWeb以及Servlet
1.新建项目 2.Web工程设置:点击项目名称,按F4 (1)配置sources:在WEB-INF下新建两个文件夹classes和lib (2)配置path:刚刚创建的classes文件夹路径 (3) ...
- jQuery--筛选【过滤函数】
之前选择器可以完成的功能,筛选也提供了相同的函数 筛选函数介绍 eq(index|-index) 类似:eq()index:正数,从头开始获得指定所有的元素,从0算起,0表示第一个-index:负数, ...
- Java中带参数的方法和JavaScript中带参数的函数有什么不同?
javascript是动态语言,是弱类型语言,其参数的使用很灵活:java则是强类型语言,参数的类型必须明确的
- Java中如何声明方法?JavaScript中如何声明函数?
public void method(){ } //实例方法 Function Declaration 可以定义命名的函数变量,而无需给变量赋值.Function Declaration 是一种独立的 ...
- 关于XML文件
关于xml文件没有提示(eclipse) 点我
- python 基础数据类型汇总
数据类型小结(各数据类型常用操作) 一.数字/整型int int()强行转化数字 二.bool类型False&True bool()强行转化布尔类型. 0,None,及各个空的字符类型为Fal ...
- WEB架构深度优化之PHP
一.PHP引擎缓存加速优化(4种) 1.eAccelerator 2.XCache 3.APC 4.Zend 二.使用tmpfs作为缓存加速缓存的目录(可用rc.local或fstab来自动挂载) m ...
- python学习笔记(七)——内置函数
builtins.py模块,是python的内建模块,在运行时会自动导入该模块.在该模块中定义了很多我们常用的内置函数,比如print,input 等. 在 builtins.py 模块中给出如下注释 ...