说明
本文代码基于soul
2021.2.4 master分支版本。
准备
请先阅读soul
官方用户文档 -> HTTP代理, 并事先使用过divide
插件,阅读过divide
插件源码,源码分析可以参考我之前写过的文章:soul源码分析(1)http插件的使用与soul插件工作流程分析
目标
本文将包括如下内容:
- divide插件如何实现负载均衡
- divide插件如何实现端口探活
divide插件如何实现负载均衡?
看过的divide
插件源码的童鞋知道,该插件主要逻辑在DividePlugin
中:
public class DividePlugin extends AbstractSoulPlugin {
.......
@Override
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;
final DivideRuleHandle ruleHandle = GsonUtils.getInstance().fromJson(rule.getHandle(), DivideRuleHandle.class);
final List<DivideUpstream> upstreamList = UpstreamCacheManager.getInstance().findUpstreamListBySelectorId(selector.getId());
if (CollectionUtils.isEmpty(upstreamList)) {
log.error("divide upstream configuration error: {}", rule.toString());
Object error = SoulResultWrap.error(SoulResultEnum.CANNOT_FIND_URL.getCode(), SoulResultEnum.CANNOT_FIND_URL.getMsg(), null);
return WebFluxResultUtils.result(exchange, error);
}
final String ip = Objects.requireNonNull(exchange.