插件相关
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() 规则匹配方法,获取到自己需要走的最优规则。