微服务治理实践:如何对单点异常进行自动摘除

微服务架构下,稳定性和高可用性一个永恒的话题,在实际的治理过程中,我们有可能会遇到以下场景:

  • 某个应用灰度发布,先上了几台机器,由于代码逻辑写的有问题,造成线程池满,出现运行异常。
  • 服务端集群中,某几台机器由于磁盘满,或者是宿主机资源争抢导致 load 过高,客户端出现调用超时。
  • 服务端集群中,某几台机器由于线程池满,造成 Full Garbage Collection。

在以上 3 种场景中,由于客户端并不法感知已经出现问题的那些服务端,依然会发送请求到这些机器上,造成业务调用报错,上游的机子将会被下游的某台机子的短暂故障拖垮,造成应用雪崩的风险。

面对这种场景,如果仅仅为此而进行服务降级,对应用的伤害未免过大,但如果我们可以检测出服务集群中某些故障机子,并对其进行短暂隔离,即可有效保障服务的高可用与系统的稳定性,同时给运维人员提供了宝贵的缓冲时间,用于问题定位,排除故障。

本文将作为《微服务治理实践》系列篇的第一篇,为大家介绍如何实现离群实例摘除。该系列文章是基于阿里云商业化产品 EDAS 的微服务实践,如果您团队具备较强的微服务治理能力,那么希望我们在微服务治理方面的实践和背后的思考,可以为您提供一些参考。

企业级分布式服务 EDAS 重磅升级,12月17日下午15:00--17:00中间件小师妹在直播间等你,携开发工程师十眠为您详细介绍 EDAS 离群实例摘除等微服务治理能力。还有礼品送不停,直播间地址点击“传送门”。

Microservice Outlier Ejection (微服务离群实例摘除)

  • 什么是离群实例摘除

当单点发生夯机异常时,consumer 能主动判断,并将对应的 provider 实例短时间剔除,不再请求,在一定时间间隔后再继续访问。同时,具有全局异常判断能力,当 provider 异常实例的数量过多时,并且超过一定的控制比例,说明此时 provide 整体服务质量低下,该机制仅保持摘除一定的比例。

  • 离群实例摘除的功能

从服务层容错能力上,对业务稳定性进行增强,有效解决单点故障的问题。

  • 与熔断的区别

熔断是指当服务的输入负载激增时, 避免服务被迅速压垮导致雪崩效应,而对负载进行断路的一种方式 。 熔断一般由熔断请求判断算法,熔断恢复机制,熔断报警等模块组成。隔离是指,为了避免在依赖的服务故障时候造成的故障扩散,而采取的将系统进行单元化设计的一种架构方法。

若仅仅由于服务端集群中单点异常问题,就采用熔断降级方案,将会对应用的伤害过大,离群实例摘除可以有效地解决单点异常问题从而保证服务质量。若 provider 整体服务质量低下时,离群摘除效果不再明显,此时可以采用熔断降级功能。

  • 离群实例摘除支持的版本

只要您的应用版本在列表中,您无需改动一行代码就可以使用到离群实例摘除功能。

 目前支持版本开发中版本(即将支持)
Dubbo2.5.0~2.7.3< 2.5.0 dubbox 版本
Spring CloudD、E、F、G、HC

目前已经覆盖了市面上大部分微服务场景,后续我们将会持续支持开源最新的 Dubbo/Spring Cloud 版本。

我们提供了 Dubbo 和 Spring Cloud 两种场景的离群摘除功能,本文将先介绍一下 Dubbo Microservice Outlier Ejection 的实践与效果。

下面将通过在 EDAS 上通过演示 Dubbo 离群摘除功能及效果。

企业级分布式应用服务EDAS(Enterprise Distributed Application Service)是一个应用托管和微服务管理的 PaaS 平台,提供应用开发、部署、监控、运维等全栈式解决方案,同时支持 Dubbo、Spring Cloud 等微服务运行环境。

https://www.aliyun.com/product/edas

准备

接下来以微服务Demo为例子示范离群摘除功能,读者可以从github中下载验证

https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/src

微服务Demo是一个简单的电商项目,下图为项目结构,cartservice 为 Dubbo 框架的购物车服务 provider,productservice 为Spring Cloud提供的商品详情服务 provider,frontend 为web controller即前端展示页面,可以理解为consumer。

我们将以cartservice服务即Dubbo服务端为例子,展示离群实例摘除功能。

EDAS 上部署微服务 Demo

首先 cd cartservice切换到 cartservice 目录下,再通过 mvn clean install 打包,通过 cd cartservice-provider/target 切换到target目录下,我们可以看到新生成的 cartservice-provider-1.0.0-SNAPSHOT.jar 包,然后在 EDAS上 创建一个 cartservice 应用。

点击下一步后,上传刚才打包的jar包,即 cartservice-provider/target/ cartservice-provider-1.0.0-SNAPSHOT.jar 然后下一步,记住登陆密码,直到创建应用成功。

然后启动应用,到目前为止,我们启动了一个 cartservice-provider。点击按此实例规格扩容,该服务我们部署在两个实例上。

我们在这个 provider 的 com.alibabacloud.hipstershop.provider.CartServiceImpl 类中可以看到,这个 provider 是提供了viewCart 和 addItemToCart 的两个关于购物车的服务,我们在 viewCart 中加入一些模拟运行时异常的逻辑。

    @Value("${exception.ip}")private String exceptionIp;@Overridepublic List<CartItem> viewCart(String userID) {if (exceptionIp != null && exceptionIp.equals(getLocalIp())) {throw new RuntimeException("运行时异常");}return cartStore.getOrDefault(userID, Collections.emptyList());}

其中 exceptionIp 为 ACM 配置中心的exception.ip的配置项,若该项配置为本机ip时,该服务throw RuntimeException,用于模拟业务异常的场景。

  • 为什么将 cartservice 扩容到两个实例,想必大家也猜到了,运行时通过配置ACM配置中心指定其中一个实例的IP,模拟出一个实例异常的场景。

接下来,我们需要部署 frontend / productservice 两个服务,方式一样,分别上传 frontend/target/frontend-1.0.0-SNAPSHOT.jar 和 productservice/productservice-provider/target/productservice-provider-1.0.0-SNAPSHOT.jar

从下图可以看到,我们的微服务Demo在EDAS部署上去了。

模拟业务异常

进入到 frontend 应用中,我们看到其实例的公网 ip 为 47.99.150.33。

进入浏览器访问 http://47.99.150.33:8080/

点击View Cart 访问至 http://47.99.150.33:8080/cart


可以看到,此时服务都是正常的。

我们去 ACM 配置中心 配置 exception.ip 为 172.16.205.180(即cartservice的其中某个实例的IP)。

然后继续访问 http://47.99.150.33:8080/cart ,发现 50 % 的概率错误页面

此时,我们写一个脚本,定时大量访问 http://47.99.150.33:8080/cart 模拟请求。

while :
doresult=`curl $1 -s`if [[ "$result" == *"500"* ]]; thenecho `date +%F-%T` $resultelseecho `date +%F-%T` "success"fisleep 0.1
done

然后 sh curlservice.sh http://47.99.150.33:8080/cart

我们看到不断重复的每秒钟 10 次的 50% 的调用成功率。

其实也可以理解到,下游的服务质量随着上游的某台机子的异常而急剧下降,甚至可能导致下游服务被上游某些机子的(系统、业务)异常给拖垮。

开启离群摘除策略

下面我将演示离群摘除的策略的开启及其效果的展示。

创建

我们进入到 EDAS 左侧列表的 [微服务管理] 下的 [离群实例摘除] 界面中,并选择创建离群实例摘除策略。

然后按照提示一步步创建离群摘除的策略。

基本信息

如上图可以选择命名空间、填写策略名称、选择该策略支持的框架类型(Dubbo/Spring Cloud)。

选择生效应用

按照目前的调用方式,我们只需要配置 frontend 应用,保护下游应用 consumer。

配置策略

这些参数都提供了默认值,需要根据自己应用的具体情况调整最合适的值,由于需要保护的 RuntimeException 属于业务异常于是选上 网络异常+业务异常。(需要注意的是即使摘除实例比例上限配得特别低,向下取整数小于1,当集群中实例数目大于1,且某一实例异常,我们也会摘除一实例)。

创建完成

可以看到策略的信息,创建完成。

策略

看到了我们创建的离群摘除策略,且是针对Dubbo框架,并且针对的是 网络异常+业务异常 的异常类型。

验证离群摘除效果

这时,我们看到,再感知到异常后,离群摘除功能生效,请求调用一阵子后,均返回正确结果。

不断刷新浏览器访问 http://47.99.150.33:8080/cart 也均正常

客户端感知到某台服务端机子异常后,主动摘除。仅仅调用业务正常的 Provider 实例,同时我们也可以通 ARMS(EDAS监控系统) 监控看到服务质量的上升,以及流量从异常 Provider 中摘除。

Dubbo框架可以从 /home/admin/.opt/ArmsAgent/logs 目录下的日志中,搜索日志中的 “OutlierRouter” 关键字可以看到一系列离群实例摘除的事件日志。

修改/关闭离群摘除策略

对于EDAS的应用我们支持通过控制台动态修改和删除离群摘除策略。

  • 对应策略规则的修改

点击 修改生效应用 或者 编辑策略。

然后增加删除应用或者调整参数,确定后均立即生效

  • 删除对应策略

控制台的操作,对应用中的配置都是实时生效的,若删除策略后,默认关闭相关策略。

若我们打开ARMS监控观察具体的调用情况。

ARMS监控

若我们开启监控,将会直观看到流量与请求错误等信息。

开启离群摘除前

如下图方式开启,然后跳转至ARMS(EDAS监控系统)应用监控页面,我们需要把三个应用都开启高级监控。

我们可以从下图即ARMS(EDAS监控系统)应用监控页面直观地看到结果。

从以下拓扑图中我们看到,流量不断地访问到cartservice服务上。

开启离群摘除后

离群摘除效果通过简单的例子就看到了,当然可以通过 ARMS (EDAS监控系统)的监控可以明显观察到服务质量的提升。

可以看到,在开启了离群摘除的那个点只后,错误率从50%明显下降。

其中两个小的起伏毛刺是因为,离群摘除一段时间后会重新尝试访问被摘除的 endPoint ,若依旧错误率高于阈值,继续隔离,且间隔时间更长。

离群实例摘除具体控制逻辑

前面我们看到了,离群实力摘除对应用稳定性提高带来的帮助,下面我们将具体分析离群实例摘除的控制逻辑,有助于您更好地理解其各种参数的意义,以及可以根据自己的应用情况,通过调整参数,配置出最合适自己的离群摘除策略。

对于 Dubbo/SpringCloud 框架:

  • 默认QPS下限为1

只有当前某实例的调用QPS大于1才会开始离群实例摘除保护。

  • 默认错误率下限 50%

只有当前某实例的调用错误率高于 50% ,则系统会认为该服务端集群的当前某实例处于异常状态。

  • 默认摘除实例比例上限 20%

若当前服务集群中,有大于20%的实例节点处于异常状态,则系统只会摘除异常状态的实例数占集群总数的50%。

  • 异常类型

若异常类型为 网络异常 ,则系统仅仅把网络异常的错误算进错误率统计中,忽略掉业务异常;反之,若选择了 网络异常 + 业务异常 则系统会将所有异常当成错误算进错误率统计中。

  • 关于恢复检测单位时间(默认30000ms即30s)与未恢复累计次数上限(默认40)的解释

其中第一次摘除时长为 0.5 分钟,时间到了之后 consumer 会继续访问该 provider ,若该 provider 服务质量依旧低下,则会继续摘除,摘除时长随着连续被摘除次数的增加线性递增每次增加 0.5 分钟,每次最多摘除 20 分钟。当然,若继续调用之后,服务质量恢复了,则会当成健康服务,下一次又出现异常导致服务质量低下问题时,会重新隔离 0.5 分钟,并继续上述规则。

  • 兜底

但是当客户端调用的服务仅有1个实例提供服务提供则不会隔离这个实例。

若当前客户端调用的服务实例大于1个,且当前离群摘除隔离比例计算出的实例数小于1,若服务端集群出现单点故障,则会摘除1个实例。

上面所有的实例可以理解为endpoint(ip+port为纬度)

  • 通用最佳实践

可以配置相对的错误率阈值(50%)与过低的摘除实例比例上限(10%),全链路开启。

离群实例摘除技术细节

无侵入技术

无侵入方案即通过agent技术来实现,一句话来说就是通过字节码增强技术,运行时插入我们的代码,改变应用的原有逻辑,可以理解为运行时AOP,通过在Dubbo的链路中插入Filter/Router,在Spring Cloud中增强LoadBalance逻辑,来实现我们期望的路由控制逻辑。同时因为是agent增强的,再加上 Dubbo 各个版本的链路整体基本没大的变化,Spring Cloud 模型的统一性,因此我们可以花少的代价将能力基本覆盖到所有版本。

Dubbo Agent 方案技术架构

对于用户来说,无需改动一行代码,一行配置,即可享受到稳定性增强的能力。

离群实例摘除技术

Outlier Detection 离群检测

均是基于时间窗口的数据统计。

两种实现
1、Dubbo 2.7 版本通过向链路中嵌入一个MetricsFilter,对于链路的每个request/response做打点处理,统计rt、调用成功与否、异常类型,并且已endpoint(ip+port)为key存储

2、在 Agent 底座中统计经过的http请求,通过url、rt、状态码、异常类型等数据结果,统计最近时间窗口的数据(目前写死 10 秒,暂时不透出)

实时统计前N秒的调用信息,作为离群实例摘除动作的依据。

Outlier Ejection 离群摘除

Dubbo 基于 Dubbo Router 实现,对于调用的上游服务对应的所有 invokers 中,拉黑掉“不健康”的节点,同时记录拉黑的信息。

Dubbo-Router控制逻辑
每次请求过来仅仅check一下并标记状态,后台有专门两个线程将标记的流量进行判断是否进入隔离列表或从中剔除,修改拉黑信息等耗时操作,最大程度上保证请求的实时性。

Spring Cloud 基于 扩展 LoadBalace 实现,原理相似。


原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字时代企业信息安全如何保障? VMware原生安全前来“保驾护航”

2020年春天&#xff0c;以5G、人工智能、云计算为代表的“新基建”蔚然成风&#xff0c;着眼国家数字经济体系建设&#xff0c;打造数字经济体系底座的“新基建”&#xff0c;无疑成为中国经济整体应对未来发展的核心方案。可以说&#xff0c;没有任何一个时期比现在更能够彰显…

Elasticsearch7.15.2 安装、部署(linux环境)

文章目录一、软件下载配置1. 下载2. 解压3. 录结构理解二、采用自带的jdk2.1. 启动脚本2.2. 添加jdk判断三、配置与启动3.1. 核心配置简述3.2. 核心配置3.3. 创建数据存储目录3.4. 创建es用户3.5. 修改目录权限3.6. JVM配置3.7. 增加资源分配3.8. 内核参数3.9. 刷新 配置3.10. …

仅1年GitHub Star数翻倍,Flink 做了什么?

阿里妹导读&#xff1a;Apache Flink 是公认的新一代开源大数据计算引擎&#xff0c;其流水线运行系统既可以执行批处理程序也可以执行流处理程序。目前&#xff0c;Flink 已成为 Apache 基金会和 GitHub 社区最为活跃的项目之一。在 Flink Forward Asia 2019 上&#xff0c;阿…

小程序开发(3)-之wx.request封装

#主要的封装是wxRequest、wxRequestGet、wxRequestPost、wxRequestPromise、headers这几个函数&#xff0c;由于太过赘余不进行截图展示&#xff0c;可以看utils.js #wxRequest方法 wxRequest其实跟原始的wx.request没有太大的不同&#xff0c;相当于一个中间键&#xff0c;可…

elasticsearch-head 谷歌插件以及安装和使用说明

文章目录一、谷歌插件方式1. 下载2. 扩展程序3. 打开开发者模式4. 拖动插件5. 添加扩展程序6. 点击es插件7. 连接8.效果对比二、源码运行方式(推荐使用)2.1. 克隆源码2.2. 配置2.3. 下载依赖2.4. 启动2.5. 验证一、谷歌插件方式 1. 下载 https://github.com/mobz/elasticsear…

闲鱼如何高效承接并处理用户纠纷

背景 闲鱼是一个基于C2C场景的闲置交易平台&#xff0c;每个用户既是买家也是卖家&#xff0c;在自由享受交易乐趣的同时也容易带来一些问题&#xff0c;如发一些侵权违规商品而不自知&#xff0c;发一些带情绪化言语对他人照成了伤害等,因此这也带来了一个核心问题&#xff1…

国内厂商 Onyx 违反 GPL 协议,中国开源何去何从?

作者 | 马超责编 | 王晓曼封图 | CSDN 付费下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;近日&#xff0c;中国电子书厂商Oynx拒绝开源其基于Linux 内核修改的设备源码&#xff0c;这一做法违反了Linux的GPL协议&#xff0c;在Reddit社区引发了开源…

系统重构的道与术

最近参与了很多重构项目&#xff0c;有以提高服务器资源利用率为目标的Gateway网关、AMAPS等服务的重构&#xff0c;也有以提升架构合理性和研发效率为目标的共享业务服务化拆分&#xff0c;借此机会把相关内容梳理一下&#xff0c;是分享更是自我总结和学习。准备以重构工作中…

小程序开发(4)-之登录

#为了获取token&#xff0c;所以需要搞个模拟登陆&#xff0c;用一个特定的账号&#xff0c;对密码进行md5加密&#xff0c;也只是在app.js那里进行一次调用&#xff0c;这里主要是说一下globalData.checkLogin、checkLoginReadyCallback&#xff0c;这时this指向的是全局的app…

SpringBoot2 整合 AXIS2 服务端和客户端

文章目录一、AXIS2服务端1. 版本选型2.导入依赖3. services.xml4.Axis2配置类5.服务接口6.服务接口实现类7. FileCopyUtils工具类8. 测试验证二、AXIS2服务端2.1. 客户端类2.2. 服务调用测试开源源码.一、AXIS2服务端 1. 版本选型 阿健/框架版本spring-boot2.5.5axis21.7.9 2…

阿里风控大脑关于大数据应用的探索与实践

以下内容根据演讲视频以及PPT整理而成。本次分享主要围绕以下三个方面&#xff1a; 一、阿里风控大脑整体介绍二、近线引擎三、离线引擎一、阿里风控大脑整体介绍1. 阿里风控大脑是什么? 阿里的风控主要分为两大块。一块是金融领域&#xff0c;主要业务是支付宝&#xff0c;另…

我和美国 AI 博士聊了聊:2020 年,这件事比存钱更重要!

今年还有什么比股市更赚钱的技能&#xff1f;那就是正处于 IT 风口的人工智能所需的 Python 。我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Pyth…

idea创建springmvc项目

文章目录1. 创建项目2.配置3. 加载tomcat4. 完成5. 启动项目6. 效果图7. 修改访问路径1. 创建项目 2.配置 3. 加载tomcat 4. 完成 5. 启动项目 6. 效果图 7. 修改访问路径

Java工程师该如何编写高效代码?

阿里妹导读&#xff1a;世界上只有两种物质&#xff1a;高效率和低效率&#xff1b;世界上只有两种人&#xff1a;高效率的人和低效率的人。——萧伯纳 同理&#xff0c;世界上只有两种代码&#xff1a;高效代码和低效代码&#xff1b;世界上只有两种人&#xff1a;编写高效代码…

Terraform Module 可视化正式发布

可视化操作界面 12月12日&#xff0c;阿里云开放平台正式对外推出 Terraform Module 的可视化操作界面&#xff1a;https://api.aliyun.com/#/cli?toolTerraform&#xff0c;集合所有在 Terraform Registry 上注册过的 Module&#xff0c;对外提供在线运行 Terraform Module …

“编程能力差的程序员,90%输在这事上!”谷歌AI专家:都是瞎努力!

Google 人工智能开发者专家彭靖田老师说——超90%的程序员在初学Python 人工智能时&#xff0c;都会遇到下面3个问题&#xff1a;1.想学人工智能&#xff0c;但不知从何学起&#xff0c;也不知道该选择什么方向...2.Python语法、机器学习/深度学习框架、算法都能看懂&#xff0…

小程序开发(6)-之自定义导航栏

#如图一所示&#xff0c;我们在导航栏中加了个文案和搜索框第一步我们需要在app.json->window设置&#xff0c;还可配置更多的选项 &#xff1a; {"navigationStyle": "custom","backgroundTextStyle": "light","navigationB…

ClickHouse深度揭秘

引言 ClickHouse是近年来备受关注的开源列式数据库&#xff0c;主要用于数据分析&#xff08;OLAP&#xff09;领域。目前国内社区火热&#xff0c;各个大厂纷纷跟进大规模使用&#xff1a; 今日头条 内部用ClickHouse来做用户行为分析&#xff0c;内部一共几千个ClickHouse节…

国货在崛起,八成都做对了这件事

来了&#xff01;阿里巴巴年度最大的商业大会&#xff0c;第二届ONE商业大会。 此次ONE大会上&#xff0c;国货品牌的崛起成为所有人瞩目的焦点&#xff1a;8成知名服饰企业已同阿里云手拉手&#xff0c;收入平均增速24%&#xff01; 阿里云智能总裁张建锋&#xff08;中&…

nacos 集成 zipkin sleuth实现链路追踪(入门篇)

声明&#xff1a;链路追踪属于微服务的一部分&#xff0c;微服务系列博文陆续会出&#xff0c;可以帮助小伙伴们学习微服务一站式从入门到精通。 文章目录一、zipkin 服务端1. 下载2. 前台运行3. 服务端访问二、网关服务2.1. 父项目依赖2.2. gateway依赖2.3. gateway配置三、订…