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提供的功能一样,可以有效的解决微服务调用产生的“雪崩效应”,为微服务系统提供了稳 ...
随机推荐
- 论文翻译:2021_论文翻译:2018_F-T-LSTM based Complex Network for Joint Acoustic Echo Cancellation and Speech Enhancement
论文地址:https://arxiv.53yu.com/abs/2106.07577 基于 F-T-LSTM 复杂网络的联合声学回声消除和语音增强 摘要 随着对音频通信和在线会议的需求日益增加,在包括 ...
- error C4996: 'std::_Copy_impl'
以下代码段在VS2008编译可以通过,只是会提示不安全: std::vector<unsigned char> fileData ="asdfsfsfsfsdf";// ...
- 编写 Shell 程序,实现自动删除 50 个账号的功能,账号名为stud1 至 stud50 ?
#!/bin/bashfor((i=1;i<51;i++))do userdel -r stud$idone
- synchronized底层实现原理及锁优化
一.概述 1.synchronized作用 原子性:synchronized保证语句块内操作是原子的 可见性:synchronized保证可见性(通过"在执行unlock之前,必须先把此变量 ...
- 请写出你最常见到的5个runtime exception?
对于一个有1-2年左右编程经验的人来说,总会经常遇到一些常见的异常,其中有些就是Runtime Exception.比如: NullPointerException - 当调用一个未初始化的引用变量( ...
- Spring Boot 中的监视器是什么?
Spring boot actuator 是 spring 启动框架中的重要功能之一.Spring boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态.有几个指标必须在生产环境中进行检 ...
- Zookeeper 文件系统 ?
Zookeeper 提供一个多层级的节点命名空间(节点称为 znode).与文件系统不 同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放 数据而目录节点不行. Zookeeper ...
- Java 中的final关键字有哪些用法?
(1)修饰类:表示该类不能被继承:(2)修饰方法:表示方法不能被重写:(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量).
- 在 Spring中如何注入一个java集合?
Spring提供以下几种集合的配置元素: 类型用于注入一列值,允许有相同的值. 类型用于注入一组值,不允许有相同的值. 类型用于注入一组键值对,键和值都可以为任意类型. 类型用于注入一组键值对,键和值 ...
- 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
Lock 是 Java 5 以后引入的新的 API,和关键字 synchronized 相比主要相同点: Lock 能完成 synchronized 所实现的所有功能:主要不同点:Lock 有比 sy ...