刷脸支付 二分类数据集 分布式 程序栈 ipad compilation gtk vue安装教程 admin框架 sketch up教程 微信小游戏开发视频 jquery获取最后一个子元素 两个正态分布相乘 java运行软件 js基本数据类型有哪些 oracle查看所有数据库 python中的for循环 java连接mysql java基本类型 java文件写入 java自学教程 java抽象方法 java读取文件内容 java匿名函数 java的框架 java语言运算符 linux硬盘 反转颜色 凯恩与林奇2下载 上传附件 司司网吧 瑞兹技能 ps制作表格 xflow maven项目打包 游戏linux正则表达式 重复文件查找软件 草图大师版本转换器 kz文件 掘地鼠炖肉
当前位置: 首页 > 学习教程  > 编程语言

Soul的限流断路器的使用和流程

2021/1/28 23:02:52 文章标签:

Soul的限流断路器的使用和流程 由于之前并没有使用过Hystrix,Resilience4j和sentinel中的任何一种,此处仅对三种流控和断路器插件做一个流程分析 Soul中Hystrix的使用和操作流程 关于soul中插件的流程前文已经说过多次了,在此不在赘述。根据规则的具体…

Soul的限流断路器的使用和流程

由于之前并没有使用过Hystrix,Resilience4j和sentinel中的任何一种,此处仅对三种流控和断路器插件做一个流程分析

Soul中Hystrix的使用和操作流程

  • 关于soul中插件的流程前文已经说过多次了,在此不在赘述。
  • 根据规则的具体选择方式。Soul构建了两个不同的操作类HystrixCommandOnThread和HystrixCommand。两个类的不同是HystrixCommandOnThread为拦截的接口建立了自己的线程池,实现了线程池的隔离。而HystrixCommand只是实现了短路器的基本功能。使用了线程池隔离之后。可以针对不同的线程使用不同的线程池配置。既区分了不同的接口和自定义配置解决不同并发程度所造成的压力。也解决了不同接口之间造成影响的问题。这两个类基本就是@HystrixCommand的各大属性的集合,Soul通过界面配置的方式实现了断路器的零侵入性。这样来说,比Hystrix直接嵌入客户端更加方便

file

  • 另外在具体的断路执行run过程中使用了RxReactiveStreams.toObservable的监听来实现具体的异步监听的情况。同时追踪Hystrix源码可以看到Hystrix使用了RxJava
  • Hystrix插件的使用中综合使用了建造者模式,命令模式,观察者模式。以及RxReactiveStreams响应式流式编程。

Soul中Resilience4j的使用和操作流程

  • 在Resilience4JPlugin中的执行方法中可以看到
    protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
        final SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
        assert soulContext != null;
        Resilience4JHandle resilience4JHandle = GsonUtils.getGson().fromJson(rule.getHandle(), Resilience4JHandle.class);
        if (resilience4JHandle.getCircuitEnable() == 1) {
            return combined(exchange, chain, rule);
        }
        return rateLimiter(exchange, chain, rule);
    }

根据CircuitEnable属性的值来决定只是做流控还是同时同时做流控和断流两个方向。但是这个规则的配置是基于数字配置的。是不是可以优化为boolean类型的,这可能是个可以优化的方向 file

  • 最后通过代理工厂Resilience4JRegistryFactory来执行断流和流控的具体控制,相对来说比直接配置和代码来控制简单了很多

Soul中sentinel插件的使用和流程

  • 在SentinelPlugin中并没有看到直接执行sentinel的内容,而是直接重载了PluginDataHandler的重载方法里
  • 在重载方法中 FlowRuleManager.loadRules(flowRules)和DegradeRuleManager.loadRules(degradeRules)将sentinel都加载到了Sentinel中,由sentinel进行控制

三个断路器的控制基本就是这样, 后续对三个断路器有了使用经验再来具体进行对比。

欢迎搜索关注本人的公众号【微瞰技术】,以及总结的分类面试题https://github.com/zhendiao/JavaInterview

file


本文链接: http://www.dtmao.cc/news_show_650141.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?