Soul网关-day17

Soul网关-hystrix插件(三)

​ 今天正式开始读hystrix的源码,昨天大概复现了熔断,同时发现在Soul-admin控制台处设置的一个参数:ErrorThresholdPercentage和hystrix熔断复现有很大关系,这个数设置的越小,就越容易熔断。

​ 言归正传,昨天分析控制台日志的时候,就大概可以看到我们解析Hystrix插件的抓手:

2021-02-04 22:25:26.420  INFO 13528 --- [work-threads-10] o.d.soul.plugin.base.AbstractSoulPlugin  : hystrix selector success match , selector name :hystrix_test
2021-02-04 22:25:26.420  INFO 13528 --- [work-threads-10] o.d.soul.plugin.base.AbstractSoulPlugin  : hystrix rule success match , rule name :hystrix_test

可以看到AbstractSoulPlugin,这个印象中之前也有读到过它的源码。应该是Soul插件体系的核心所在,下面来看看AbstractSoulPlugin里面究竟有些什么东西:

public abstract class AbstractSoulPlugin implements SoulPlugin

可以看到AbstractSoulPlugin继承了SoulPlugin,SoulPlugin中只有四个比较抽象的方法,分别是

Mono execute(ServerWebExchange exchange, SoulPluginChain chain);
int getOrder();
default String named() { return “”; }
default Boolean skip(ServerWebExchange exchange) { return false; }

而AbstractSoulPlugin仅仅实现了execute()方法;

​ 应该是execute()方法比较通用,所以把execute的实现提升到了abstract层,这样就不用在每个子类中再去实现execute()方法。

​ 同时AbstractSoulPlugin还对SoulPlugin进行了扩充,主要有对于空Selector或者空Rule的处理,以及过滤Selector以及Rule的方法,最后就是打印日志的方法。

今天先解读下最基础的execute方法:

首先看猫大人对于这个execute的注释:

     * Process the Web request and (optionally) delegate to the next* {@code SoulPlugin} through the given {@link SoulPluginChain}.

处理web请求,并 选择性 的根据配置好的PluginChain进行链式代理(一个Plugin将处理好的请求传递给另一个Plugin)。
我就直接在源码上做简单的注解了。

    @Overridepublic Mono<Void> execute(final ServerWebExchange exchange, final SoulPluginChain chain) {//获取当前插件的名称String pluginName = named();//这里有一个PLUGIN_MAP的数据结构,应该是存我们激活的插件的信息的final PluginData pluginData = BaseDataCache.getInstance().obtainPluginData(pluginName);//判断插件是否被激活if (pluginData != null && pluginData.getEnabled()) {//在有插件的基础上查找插件对应注册了的Selectorfinal Collection<SelectorData> selectors = BaseDataCache.getInstance().obtainSelectorData(pluginName);if (CollectionUtils.isEmpty(selectors)) {//对空Selector的处理,并直接返回return handleSelectorIsNull(pluginName, exchange, chain);}//通过exchange从Selector集合中选择匹配的Selectorfinal SelectorData selectorData = matchSelector(exchange, selectors);if (Objects.isNull(selectorData)) {//对空的Selector进行处理return handleSelectorIsNull(pluginName, exchange, chain);}//日志selectorLog(selectorData, pluginName);//获取selector对应的rulefinal List<RuleData> rules = BaseDataCache.getInstance().obtainRuleData(selectorData.getId());if (CollectionUtils.isEmpty(rules)) {return handleRuleIsNull(pluginName, exchange, chain);}RuleData rule;//这根据配置选择rule,并对空rule进行提前的处理,并返回。if (selectorData.getType() == SelectorTypeEnum.FULL_FLOW.getCode()) {//get lastrule = rules.get(rules.size() - 1);} else {rule = matchRule(exchange, rules);}if (Objects.isNull(rule)) {return handleRuleIsNull(pluginName, exchange, chain);}ruleLog(rule, pluginName);//这里用了doExecute,一般用这个名字的都是真正干事的。//这个方法由子类自行实现return doExecute(exchange, chain, selectorData, rule);}//调用和插件链的下一个插件return chain.execute(exchange);}

顺带一提,这个execute方法在Soul中有几个相同的命名,这个execute方法实在SoulPluginChain的子类中被调用的【Soul默认的子类是DefaultSoulPluginChain】,这里应该也是一个Soul有关的拓展点。

Soul网关-day17相关推荐

  1. Soul网关发布里程碑的2.3.0版本,新增支持GRPC,Tars,Sofa协议

    距离上一次发布长达半年之久,在这半年的时间里,我与我的社区小伙伴们,做了太多太多的事情.完成了将近200 多次PR,发表了将近300 篇文章的源码解析,新增贡献者 120 多位,晋升了 7位commi ...

  2. Soul网关发布2.2.0:让高性能网关变得如此简单!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者:猫大人 来源:转载自公众号「Dromara分布式事 ...

  3. Soul网关发布2.2.0 | 让高性能网关变得如此简单!

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群",加入新技术 本文来自:猫大人的Dromara分布式事务 Soul发布全新的架构 ...

  4. Soul网关发布2.1.X之后,它到底有多方便?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 Soul 网关自从去年10月我开源以来,经历了一年的事情, ...

  5. Soul网关源码解析目录

    Soul网关源码解析目录 Soul网关源码解析文章列表     对用Java写的高性能网关:Soul,进行一波学习和研究,下面是相关的文章记录 掘金 了解与初步运行 Soul网关源码解析(一) 概览 ...

  6. Soul网关源码阅读(十)自定义简单插件编写

    Soul网关源码阅读(十)自定义简单插件编写 简介     综合前面所分析的插件处理流程相关知识,此次我们来编写自定义的插件:统计请求在插件链中的经历时长 编写准备     首先我们先探究一下,一个P ...

  7. Soul网关源码阅读(九)插件配置加载初探

    Soul网关源码阅读(九)插件配置加载初探 简介     今日来探索一下插件的初始化,及相关的配置的加载 源码Debug 插件初始化     首先来到我们非常熟悉的插件链调用的类: SoulWebHa ...

  8. Soul网关源码阅读(八)路由匹配初探

    Soul网关源码阅读(八)路由匹配初探 简介      今日看看路由的匹配相关代码,查看HTTP的DividePlugin匹配 示例运行      使用HTTP的示例,运行Soul-Admin,Sou ...

  9. Soul网关源码阅读(七)限流插件初探

    Soul网关源码阅读(七)限流插件初探 简介     前面的文章中对处理流程探索的差不多了,今天来探索下限流插件:resilience4j 示例运行 环境配置     启动下MySQL和redis d ...

最新文章

  1. mysql 5.7.17 rpm安装_MySQL5.7.17 RPM方式安装
  2. python调用动态链接库传送protobuf数据。
  3. powerdesigner12.5入门教程
  4. 诺基亚自带36个铃声_vivo手机的6个隐藏功能,快开启,帮你玩转vivo
  5. 字符编码(1)——Unicode,utf-8
  6. win10 cannot open clipboard 解决办法
  7. 微信公众号模板消息设置
  8. 找了这么多毕业设计题目,反而不知道选什么了
  9. 记使用腾讯TIM开发聊天通讯遇到的问题及解决方案
  10. 网络安全——攻防对抗
  11. python安装成功截图_上传Anaconda 3 安装好后在电脑开始里面的截图。
  12. 使用Vscode调试vue代码
  13. AD9851调试过程----相位设置、频率计算、控制字设置
  14. CSS中background-attachment的介绍和用法
  15. ffmpeg命令:rtp音频推流拉流
  16. BUAA-OO 第三单元总结
  17. mac 安装 protoc
  18. python基金筛选_Python基金量化优选组合方法
  19. 如何对接淘宝开放平台API接口(超详细)
  20. centos 8 进入紧急救援模式

热门文章

  1. 九成宫醴泉铭-欧阳询(慢更)
  2. 王选院士谈院士增选:院士未必总是学术权威
  3. Unity3D摄像机跟随人物移动脚本
  4. 【数据分析与挖掘实战】B站影视区数据分析
  5. 编程练习题 没答案版
  6. Python 高级编程和异步IO并发编程 --13_4 call_soon,call_at,call_soon_threadsafe
  7. C语言概述:什么是C语言?
  8. 顶会竞赛落下帷幕,数研院赞助的AI奥林匹克赛果公布
  9. linux-sys.c
  10. 学习HM微博项目第2天