Soul-源码阅读5-回顾总结插件相关

插件相关

divide插件

  • divide插件是网关处理http请求的核心处理插件。

  • divide进行http正向代理,该插件处理所有http类型的请求进行负载均衡的调用。

  • http配置,可以配置多个,设置负载均衡权重,具体的负载均衡策略,在规则中指定。

  • 插件和选择器是1对多关系,选择器和规则是1对多的关系。

AbstractSoulPlugin

测试:http://localhost:9195/http/order/findById?id=222

AbstractSoulPlugin的execute()方法:

public Mono<Void> execute(final ServerWebExchange exchange, final SoulPluginChain chain) {
        String pluginName = named();
        final PluginData pluginData = BaseDataCache.getInstance().obtainPluginData(pluginName);
        // pluginName = divide
        if (pluginData != null && pluginData.getEnabled()) {
            // 查找divide插件的选择器
            final Collection<SelectorData> selectors = BaseDataCache.getInstance().obtainSelectorData(pluginName);
            if (CollectionUtils.isEmpty(selectors)) {
                return handleSelectorIsNull(pluginName, exchange, chain);
            }
            // 匹配一个符合条件的选择器的数据
            final SelectorData selectorData = matchSelector(exchange, selectors);
            if (Objects.isNull(selectorData)) {
                return handleSelectorIsNull(pluginName, exchange, chain);
            }
            // 打印日志开关开启后,打印选择器日志:divide selector success match , selector name :/http
            selectorLog(selectorData, pluginName);
            // 获得选择器的规则数据列表
            final List<RuleData> rules = BaseDataCache.getInstance().obtainRuleData(selectorData.getId());
            if (CollectionUtils.isEmpty(rules)) {
                return handleRuleIsNull(pluginName, exchange, chain);
            }
            RuleData rule;
            // custom flow 是自定义流量。full flow 是全流量。自定义流量就是请求会走你设置的匹配方式(and、or)与条件(uri、query...)。全流量则不走。
            if (selectorData.getType() == SelectorTypeEnum.FULL_FLOW.getCode()) {
                //get last
                rule = rules.get(rules.size() - 1);
            } else {
                // 根据路径(从路径里面解析 匹配方式和条件)获得唯一一个规则
                // MatchStrategyUtils.match(ruleData.getMatchMode(), ruleData.getConditionDataList(), exchange)
                rule = matchRule(exchange, rules);
            }
            if (Objects.isNull(rule)) {
                return handleRuleIsNull(pluginName, exchange, chain);
            }
            // 打印匹配到的规则名称:divide rule success match , rule name :/http/order/findById
            ruleLog(rule, pluginName);
            // 继续执行子类的方法
            return doExecute(exchange, chain, selectorData, rule);
        }
        // 执行插件链上的下个插件
        return chain.execute(exchange);
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结下这个插件:

  • execute()检查插件是否有开启,开启使用该插件,不开启则遍历下一个。
  • 根据请求路径和插件匹配一个符合条件的选择器的数据。
  • 获得选择器的规则数据列表后,根据请求路径和规则匹配一个符合条件的选择器的数据。
  • 最后获得一个唯一规则。
  • 所有"转发类型"的插件都会走execute() 规则匹配方法,获取到自己需要走的最优规则。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值