当前位置: 首页 > news >正文

分布式熔断降级平台aegis

现状

分布式场景中。若服务不稳定,会导致调用方服务也不可用,从而造成雪崩效应。因此要对在原服务不可用时进行熔断降级处理。

分析

熔断降级可以服务端限流、网关限流、客户端限流。

1. 客户端限流:在调用方法发起请求时检查是否达到阀值。若达到阀值,不发起调用请求

优点:可以在服务消费端直接控制流量出口,减少不必要请求的发起。

缺点:客户端需要感知服务运行指标和容灾规则。每个业务方需要重复开发

2. 服务端限流:服务提供方自定义容灾逻辑,在收到请求后再根据当前状态判断是否走fallback逻辑

优点:容灾规则、阀值完全封装在服务提供者。对调用方无感知。

缺点:若服务提供者都挂了,无法进行容灾。

3. 网关限流:原本直接调用提供者的请求都由网关层代理转发。容灾规则的配置、降级逻辑都封装在网关层。

优点:客户端、服务端都无需感知容灾逻辑。

缺点:多了一次网络请求、rt变大

大部分情况下,我们都是选择服务端限流。但客户端对数据平台的接口是强依赖的。若搜索应用挂了,客户端还是需要看到数据。相比高可用,略微的rt变大是可以接受的,所以启动一个数据容灾网关

技术选型

现在了解到的开源容灾框架有hystrix、sentinel两种。

hystrix:常用于springcloud的一个熔断降级组件。主要功能是不同服务之间的资源隔离、失败降级。底层实现是Rxjava。它提供两种资源隔离的模式:信号量隔离和线程池隔离。一般使用线程池隔离。耗费一定资源,但相比之下支持超时和异步执行。听起来可以覆盖大部分场景,但它不支持更高要求的流控,如qps的控制。所以需要单独采用令牌漏桶来做流量控制。

sentinel:阿里开源的分布式流量控制组件。支持流控、熔断降级、系统保护等。所有的资源都对应一个资源名称以及一个Entry。每一个Entry创建的时候,同时也会创建一系列插件(系统保护插件:SystemSlot、流控插件:FlowSlot、熔断降级插件LDegradeSlot等)。每个插件会监控自己职责范围内的指标。NodeSelectorSlot将各个资源的调用路径以树状存储,用于限流降级。调用者通过创建上下文、请求token来执行方法。若没有抛出BlockException,表示请求成功。它支持并发数/qps的流量控制、也支持熔断降级。

对比:1.hystrix的熔断都围绕线程池展开。更适合做资源隔离,但单个应用有多个服务时线程池开销会造成浪费。hystrix是单个超时立即熔断,控制力度更细。多个微服务的场景可以考虑用这种。2.sentinel是基于并发数,支持的场景也更复杂,开销小,适合在保证服务稳定的情况下提高吞吐量。但它的超时是5次请求的平均响应时间。并不是很严格。但对于大多数场景而言可以接受

接入方式

sentinel支持api和注解两种接入方式。作为容灾网关,之后可以会接很多接口。为了接入简单、对代码无侵入。需要使用注解的方式。但是原生的@SentinelResource有几个问题:

1. 只能指定资源名称、fallback方法。用户还是需要通过api创建容灾规则,

2. 而且fallback方法入参要加上BlockException。这样的接入方式不是很优雅。

3. 流控异常FlowException的方法要另外指定。

于是基于sentinel封装了一层自定义注解@AegisResource

@AegisResource(value = "hello",limitThread = 0,timeOut = 100,failRate = 0.5,timeWindows = 100,fallback = "exceptionHandler")

参数说明:

value:资源名称,默认为方法名

limitThread:最大线程数,默认-1,即不启用

timeOut:接口超时时间,默认-1,即不启用

failRate:失败率,默认-1,即不启用

timeWindows:触发降级但持续时间,默认100

fallback:降级方法,必须指定

接入demo


 /**
     * 保护的方法
     * @return
     */
    @GetMapping("resourcetest")
    @AegisResource(value = "hello",limitThread = 0,timeOut = 100,failRate = 0.5,timeWindows = 100,fallback = "exceptionHandler")
    public String hello() {
        return "ok";
    }

    /**
     * 降级的方法
     * @return
     */
    public String exceptionHandler() {
        // Do some log here.
        return "Oops, error occurred at " ;
    }

新接口只需写好希望执行的方法和降级方法,然后在希望执行的方法上加入@AegisResource(fallBack=“fallback的方法名”)就可以无侵式入地进行容灾。切面定义了默认容灾阀值。也可以在对应属性上设置自定义的阀值。

后期规划

目前容灾网关可以满足目前的需求。目前有开源的控制台,可以查看服务调用大盘,动态调整容灾规则。缺点是目前指标的搜集是http方式。容灾规则、运行指标也没有持久化存储。后期如果需要,可以借助现有的开源控制台进行二次开发。

相关文章:

  • 建议
  • dubbo分布式事务
  • HDOJ(HDU) 2178 猜数字(题意有点难理解、、、)
  • Grafana 6.0正式发布!新增查询工作流,全新独立Gauge面板
  • 腾讯视频嵌入手机端网站demo - 就像微信文章中一样一样的
  • java2019面试题北京
  • ruby安装mysql2,pg模块
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • Linux修改SSH登录端口
  • 你所听到的技术原理、技术本质到底是什么?
  • 团队模式可能演变的一些方向
  • JavaScript 常用的几种跨域方式实现原理
  • NYOJ 简单数据结构
  • js对象的深浅拷贝
  • ★Kali信息收集~4.DNS系列
  • 网络传输文件的问题
  • 【译】理解JavaScript:new 关键字
  • 2019.2.20 c++ 知识梳理
  • Github访问慢解决办法
  • Java Agent 学习笔记
  • node和express搭建代理服务器(源码)
  • overflow: hidden IE7无效
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • React-生命周期杂记
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • windows下如何用phpstorm同步测试服务器
  • 基于web的全景—— Pannellum小试
  • 将 Measurements 和 Units 应用到物理学
  • 悄悄地说一个bug
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 使用Swoole加速Laravel(正式环境中)
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​人工智能书单(数学基础篇)
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # 计算机视觉入门
  • #NOIP 2014# day.2 T2 寻找道路
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1)bark-ml
  • (二)构建dubbo分布式平台-平台功能导图
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net程序帮助文档制作
  • .net实现客户区延伸至至非客户区
  • .net下的富文本编辑器FCKeditor的配置方法
  • .NET项目中存在多个web.config文件时的加载顺序
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [BIZ] - 1.金融交易系统特点
  • [CF494C]Helping People
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [GN] DP学习笔记板子
  • [IE 技巧] 显示/隐藏IE 的菜单/工具栏