soul源码分析(4)divide插件如何实现负载均衡与探活

本文详细分析了Soul divide插件的负载均衡和端口探活实现。通过SPI机制,divide插件实现了随机、轮询和一致性哈希三种负载均衡算法。在端口探活方面,它启动定时调度线程池,定期检查服务列表的可用性,确保列表中的服务地址有效。此外,文章还对比了Java SPI和Dubbo SPI的区别。
摘要由CSDN通过智能技术生成

说明

本文代码基于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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值