【Soul源码阅读】19.插件之 divide

Apache ShenYu源码阅读系列-Divide插件 Apache ShenYu 是一个异步的,高性能的,跨语言的,响应式的 API 网关。 ShenYu 网关使用 divide 插件来处理 http 请求。你可以查看官方文档 Http快速开始 了解如何使用该插件。 本文基于shenyu-2.4.3版本进行源码分析,官网的介绍请参考 Http服务接入 。 1. 服务注册 1.1 声明注册接口 使用注解@ShenyuSpringMvcClient将服务注册到网关。简单demo如下: @RestController @RequestMapping("/o. 阅读详情

目录

1.启动

2.开启 divide 插件

3.添加选择器和规则

4.验证

4.1 负载均衡

4.2 IP 端口探活

5.源码分析


 

官网文档 https://dromara.org/zh/projects/soul/divide-plugin/

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

1.启动

在网关的 pom.xml 文件中添加 starter 依赖,当然,divide 插件是默认支持的。(application-local.yml)

        <!--if you use http proxy start this-->
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-plugin-divide</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!--if you use http proxy end this-->

        <!-- soul httpclient plugin start-->
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-plugin-httpclient</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- soul httpclient plugin end-->

把 soul-admin、soul-bootstrap、soul-examples-http(修改端口号启动2个,方便后面看负载均衡) 启动:

 

2.开启 divide 插件

默认是开启的,我们到页面上可以看到是开启的。

3.添加选择器和规则

在 soul-examples-http 项目中,OrderController、HttpTestController 文件使用了 @SoulSpringMvcClient 注解:

@RestController
@RequestMapping("/order")
@SoulSpringMvcClient(path = "/order")
public class OrderController {
    /**
     * Save order dto.
     *
     * @param orderDTO the order dto
     * @return the order dto
     */
    @PostMapping("/save")
    @SoulSpringMvcClient(path = "/save" , desc = "Save order")
    public OrderDTO save(@RequestBody final OrderDTO orderDTO) {
        orderDTO.setName("hello world save order");
        return orderDTO;
    }

...
}


@RestController
@RequestMapping("/test")
@SoulSpringMvcClient(path = "/test/**")
public class HttpTestController

我们之前(【Soul源码阅读】3.HTTP 用户接入 Soul 流程解析)已经分析过了,使用了 @SoulSpringMvcClient 注解,会自动把选择器 selector 和 选择器规则 rule 数据同步过来,在页面上就可以看到已经同步的数据:

其中,选择器中,可以看到2个节点(8188和8189),并且权重是50:50:

在规则设置页面,负载均衡策略可选 hash、随机或轮询(默认是随机 random):

 

4.验证

4.1 负载均衡

在 postman 中,我们多次调用 GET 请求 localhost:9195/http/order/findById?id=95,可以在 soul-bootstrap 项目的 console 控制台中看到如下日志:

2021-02-04 00:22:01.899  INFO 8552 --- [work-threads-24] o.d.soul.plugin.base.AbstractSoulPlugin  : divide selector success match , selector name :/http
2021-02-04 00:22:01.899  INFO 8552 --- [work-threads-24] o.d.soul.plugin.base.AbstractSoulPlugin  : divide rule success match , rule name :/http/order/findById
2021-02-04 00:22:01.899  INFO 8552 --- [work-threads-24] o.d.s.plugin.httpclient.WebClientPlugin  : The request urlPath is http://10.0.0.2:8189/order/findById?id=95, retryTimes is 0
2021-02-04 00:22:02.466  INFO 8552 --- [work-threads-25] o.d.soul.plugin.base.AbstractSoulPlugin  : divide selector success match , selector name :/http
2021-02-04 00:22:02.467  INFO 8552 --- [work-threads-25] o.d.soul.plugin.base.AbstractSoulPlugin  : divide rule success match , rule name :/http/order/findById
2021-02-04 00:22:02.467  INFO 8552 --- [work-threads-25] o.d.s.plugin.httpclient.WebClientPlugin  : The request urlPath is http://10.0.0.2:8188/order/findById?id=95, retryTimes is 0
2021-02-04 00:22:03.068  INFO 8552 --- [-work-threads-1] o.d.soul.plugin.base.AbstractSoulPlugin  : divide selector success match , selector name :/http
2021-02-04 00:22:03.068  INFO 8552 --- [-work-threads-1] o.d.soul.plugin.base.AbstractSoulPlugin  : divide rule success match , rule name :/http/order/findById
2021-02-04 00:22:03.068  INFO 8552 --- [-work-threads-1] o.d.s.plugin.httpclient.WebClientPlugin  : The request urlPath is http://10.0.0.2:8189/order/findById?id=95, retryTimes is 0
2021-02-04 00:22:03.659  INFO 8552 --- [-work-threads-3] o.d.soul.plugin.base.AbstractSoulPlugin  : divide selector success match , selector name :/http
2021-02-04 00:22:03.660  INFO 8552 --- [-work-threads-3] o.d.soul.plugin.base.AbstractSoulPlugin  : divide rule success match , rule name :/http/order/findById
2021-02-04 00:22:03.660  INFO 8552 --- [-work-threads-3] o.d.s.plugin.httpclient.WebClientPlugin  : The request urlPath is http://10.0.0.2:8188/order/findById?id=95, retryTimes is 0

可以看到调用真实的业务节点在 8188 和 8189 中来回切换,并且比例为 1:1,满足负载均衡为轮询,并且权重比例为 50:50=1:1。

 

4.2 IP 端口探活

我们把 8189 端口号的项目关闭,过会儿会在 soul-admin 项目的 console 控制台打印如下日志:

2021-02-04 00:23:43.667 ERROR 27276 --- [upstream-task-7] o.d.s.a.s.impl.UpstreamCheckService      : check the url=10.0.0.2:8189 is fail 

然后在 soul-admin 的 web 页面也看不到 8189 节点信息了,只剩下 8188 节点了:

 

5.源码分析

关于负载均衡,还有前面的几个插件,后面再研究一下统一写一篇文章分析,这里就先放下,看下 IP 端口探活是怎么实现的。

根据日志找到 UpstreamCheckService,使用 @Component 被 Spring 容器托管,在往下看,看到了一个被 @PostConstruct 注解的方法,由于 @PostConstruct 注解的方法将会在依赖注入完成后被自动调用,所以看下具体逻辑:

// UpstreamCheckService.java
/**
     * Setup selectors of divide plugin.
     */
    @PostConstruct
    public void setup() {
        // 从数据库中获取 divide 插件信息
        PluginDO pluginDO = pluginMapper.selectByName(PluginEnum.DIVIDE.getName());
        if (pluginDO != null) {
            // 根据 divide 插件 ID 获取 selector 列表
            List<SelectorDO> selectorDOList = selectorMapper.findByPluginId(pluginDO.getId());
            for (SelectorDO selectorDO : selectorDOList) {
                // 把 selector 的 handle 字段信息由字符串转成对应的 Java Bean
                // handle 数据:[{"upstreamHost":"localhost","protocol":"http://","upstreamUrl":"10.0.0.2:8188","weight":50,"status":true,"timestamp":0,"warmup":0}]
                List<DivideUpstream> divideUpstreams = GsonUtils.getInstance().fromList(selectorDO.getHandle(), DivideUpstream.class);
                if (CollectionUtils.isNotEmpty(divideUpstreams)) {
                    // 把真实服务器信息缓存在 UPSTREAM_MAP 中
                    // UPSTREAM_MAP 定义:
                    // private static final Map<String, List<DivideUpstream>> UPSTREAM_MAP = Maps.newConcurrentMap();
                    UPSTREAM_MAP.put(selectorDO.getName(), divideUpstreams);
                }
            }
        }
        // check 定义,默认值为 true
        // @Value("${soul.upstream.check:true}")
        // private boolean check;
        if (check) {
            new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), SoulThreadFactory.create("scheduled-upstream-task", false))
                    .scheduleWithFixedDelay(this::scheduled, 10, scheduledTime, TimeUnit.SECONDS);
        }
    }

这段代码有2个逻辑:

1.把 divide 插件对应的 selector 的 handle 字段获取,转换为真实业务节点信息,并缓存在 UPSTREAM_MAP 中。

2.启动一个定时线程池,并按照固定的延迟去执行 scheduled 方法。

固定时间默认为 10s:

    @Value("${soul.upstream.scheduledTime:10}")
    private int scheduledTime;

scheduled 方法:

    private void scheduled() {
        // 如果缓存的真实服务器节点大于0,执行 check 方法
        if (UPSTREAM_MAP.size() > 0) {
            UPSTREAM_MAP.forEach(this::check);
        }
    }

继续往下追:

// UpstreamCheckService.java
    private void check(final String selectorName, final List<DivideUpstream> upstreamList) {
        List<DivideUpstream> successList = Lists.newArrayListWithCapacity(upstreamList.size());
        for (DivideUpstream divideUpstream : upstreamList) {
            // 这里是探活的方法,后面都是针对探活结果的处理
            final boolean pass = UpstreamCheckUtils.checkUrl(divideUpstream.getUpstreamUrl());

...
// UpstreamCheckUtils.java
    /**
     * Check url boolean.
     *
     * @param url the url
     * @return the boolean
     */
    // url : 10.0.0.2:8188
    public static boolean checkUrl(final String url) {
        if (StringUtils.isBlank(url)) {
            return false;
        }
        if (checkIP(url)) {
            String[] hostPort;
            if (url.startsWith(HTTP)) {
                final String[] http = StringUtils.split(url, "\\/\\/");
                hostPort = StringUtils.split(http[1], Constants.COLONS);
            } else {
                // hostPort = ["10.0.0.2", "8188"]
                hostPort = StringUtils.split(url, Constants.COLONS);
            }
            return isHostConnector(hostPort[0], Integer.parseInt(hostPort[1]));
        } else {
            return isHostReachable(url);
        }
    }

    private static boolean isHostConnector(final String host, final int port) {
        try (Socket socket = new Socket()) {
            socket.connect(new InetSocketAddress(host, port));
        } catch (IOException e) {
            return false;
        }
        return true;
    }

使用 socket,看看能否正确连接,如果不报错,证明节点ok;如果报异常,证明节点异常。下图是节点正常的情况:

这里回到 check 方法 :

// UpstreamCheckService.java
    private void check(final String selectorName, final List<DivideUpstream> upstreamList) {
        List<DivideUpstream> successList = Lists.newArrayListWithCapacity(upstreamList.size());
        for (DivideUpstream divideUpstream : upstreamList) {
            // 这里是探活的方法,后面都是针对探活结果的处理
            final boolean pass = UpstreamCheckUtils.checkUrl(divideUpstream.getUpstreamUrl());
            if (pass) {
                // 节点正常进入这里
                if (!divideUpstream.isStatus()) {
                    // 这里使用 status 字段区分是否已经被缓存过。
                    divideUpstream.setTimestamp(System.currentTimeMillis());
                    divideUpstream.setStatus(true);
                    log.info("UpstreamCacheManager check success the url: {}, host: {} ", divideUpstream.getUpstreamUrl(), divideUpstream.getUpstreamHost());
                }
                // 把这个正常的节点放到成功列表里
                successList.add(divideUpstream);
            } else {
                // 如果没连接成功,把 status 字段设置为 false,等后面节点重新可以连接上时能够正常设置时间戳
                divideUpstream.setStatus(false);
                // 打印错误日志,上面我们打印的错误日志就是这一行代码打印的
                log.error("check the url={} is fail ", divideUpstream.getUpstreamUrl());
            }
        }
        // 数量相同,说明没有节点的增加,也没有减少
        if (successList.size() == upstreamList.size()) {
            return;
        }
        if (successList.size() > 0) {
            // 进入到这里,说明节点有增减,并且还至少有一个正常节点
            UPSTREAM_MAP.put(selectorName, successList);
            // 更新 selector 的handle 字段
            updateSelectorHandler(selectorName, successList);
        } else {
            // 进入到这里,说明所有节点都不正常了
            UPSTREAM_MAP.remove(selectorName);
            // 更新 selector 的handle 字段
            updateSelectorHandler(selectorName, null);
        }
    }
    private void updateSelectorHandler(final String selectorName, final List<DivideUpstream> upstreams) {
        SelectorDO selectorDO = selectorMapper.selectByName(selectorName);
        if (Objects.nonNull(selectorDO)) {
            List<ConditionData> conditionDataList = ConditionTransfer.INSTANCE.mapToSelectorDOS(
                    selectorConditionMapper.selectByQuery(new SelectorConditionQuery(selectorDO.getId())));
            PluginDO pluginDO = pluginMapper.selectById(selectorDO.getPluginId());
            String handler = CollectionUtils.isEmpty(upstreams) ? "" : GsonUtils.getInstance().toJson(upstreams);
            selectorDO.setHandle(handler);
            // 把修改后的 handle 字段更新到数据库
            selectorMapper.updateSelective(selectorDO);
            if (Objects.nonNull(pluginDO)) {
                SelectorData selectorData = SelectorDO.transFrom(selectorDO, pluginDO.getName(), conditionDataList);
                selectorData.setHandle(handler);
                // publish change event.
                // 发布事件,把 divide 插件下 selector 数据同步到 soul-bootstrap端
                eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.SELECTOR, DataEventTypeEnum.UPDATE,
                                                                 Collections.singletonList(selectorData)));
            }
        }
    }

ok,到这里就把 divide 插件 IP 端口探活的机制研究明白了。

 

soul源码阅读(九)soul所有插件介绍 soul所有插件列表 context_path插件 divide插件 dubbo插件 springcloud插件 sofa插件 ratelimiter插件 hystrix插件 sentinel插件 resilience4j插件 monitor插件 waf插件 sign插件 rewrite插件 global插件 webclient插件 webclientresponse插件 tars插件 介绍每个插件 context_path插件 什么是context_path,就是用户 阅读详情

相关推荐

soul源码阅读(八)插件流程梳理

目录 背景介绍 网关启动插件的工作流程 客户端请求网关后各插件的处理流程 总结 背景介绍 前面三篇文章 soul源码阅读(五)Spring Cloud应用示例运行 soul源码阅读(六)Spring Cloud应用示例运行续 soul源码阅读(七)Spring Cloud应用示例运行续2 我们通过以下两个问题: 一:{"code":-107,"message":"Can not find selector, please check your configuration!","data

he_cha_bu的博客 1826

soul网关-10-divide插件的upstream探活

之前的笔记里面学习过普通springboot项目接入soul网关的时候,只要有@SoulSpringMvcClient注解的接口,就会被注册到soul-admin的divide插件的selector和rule里面去。soul网关不仅通过divide插件进行请求代理,还可以对业务的机器进行探活。 假如说网关没有探活功能,那么当用户的请求过来之后,会直接转发给相关业务方。这个时候假如业务方的机器因为请求压力太大挂掉了,但是网关还是把大量的请求直接传过来了,业务方的机器还是会因为有大量的请求一直起不来。或者是业务

nemointellego的专栏 316

【Soul源码阅读】3.HTTP 用户接入 Soul 流程解析

昨天只是极简入门,关于网关是怎么感知到我们的应用的,相信小伙伴们一定有疑问,今天先来看下 HTTP 用户如何接入 Soul,以及接入的流程是怎样的。 这是官网对于 HTTP 用户的文档,https://dromara.org/zh-cn/docs/soul/user-http.html。 官网文档明确指出,Soul 网关使用 divide 插件来处理http请求,我们在 soul-admin 页面中看到,第一个就是 divide 插件,而且是默认开启的。 Http请求接入网关,分2种情况,1种是 sp

hellboy0621的博客 1554

【Soul网关探秘】divide插件原理

文章目录一、插件概述二、插件处理流程三、主机探活3.1 探活时机3.2 探活任务3.3 活性检查四、负载均衡五、小结 一、插件概述 插件定位 divide 插件是一个 http 正向代理插件,所有的 http 请求都由该插件进行负载均衡处理(具体的负载均衡策略在规则中指定)。 生效时机 当请求头的 rpcType = http 且插件开启时,它将根据请求参数匹配规则,最终交由下游插件进行响应式代理调用。 二、插件处理流程 1)先回顾下请求处理类插件的通用流程(AbstractSoulPlugin # exe

眼映星辰的博客 798

divide_page分页插件

一款分页插件,简单快捷,传入数据即可输出完整分页内容;同时可自定义数据的显示方式,更改单页数据条数,自定义数据显示字段等功能。

vTaskStartScheduler()详解

是启动 FreeRTOS 实时内核的“扳机”。在调用它之前,你只是创建了一些任务结构,但它们都处于“待命”状态,系统仍然在按传统的裸机前后台方式运行。调用这个函数后,FreeRTOS 内核会接管系统的控制权,开始根据优先级调度你创建的任务,多任务环境才真正开始。关键点:它没有参数。它的所有行为都由中的配置宏控制。它通常不会返回。一旦调用,除非没有任务可以运行(或者你显式地停止了调度器),否则程序流永远不会回到main()函数中调用它的下一行。是一个没有参数但行为由精密控制的函数。

Shylock_Mister的博客 1592

soul网关系列(十四):divide插件源码解读

目录一、divide插件概述二、整体的处理流程三、负载均衡流程四、ip端口探活 一、divide插件概述 divide插件定位是一个http代理插件,当请求头的rpcType为http的时候,并且插件开启的时候,它根据请求参数匹配到规则,然后进行响应式的代理调用。 二、整体的处理流程 public Mono<Void> execute(final ServerWebExchange exchange, final SoulPluginChain chain) { Stri

坚持、死磕、重复 971

V.PhyloMaker实战:从物种列表到维管束植物系统发育树的完整流程

本文详细介绍了使用V.PhyloMaker工具包,从物种列表快速构建维管束植物系统发育树的完整实战流程。内容涵盖R包安装、物种名标准化、核心函数phylo.maker的三种构建方案选择、结果树的可视化与导出,以及与picante包的联动分析,为生态学和生物地理学研究提供了高效解决方案。

weixin_29057237的博客 374

soul源码学习(十一)-divide插件分析

文章目录探活机制分析调用链分析负载均衡算法与springcloud调用对比 探活机制分析 探活即用来和后端代理的相关服务进行心跳检测,以确定其是否能够进行正常服务,由于该部分功能不在整个调用链上,因此首先进行分析 探活服务默认在soul-admin开启,相关类为UpstreamCheckService,在该类被spring自动装配后,会进行启动线程对后端服务进行检查,默认每隔10s检查一次 检查时,如果发现服务不可用时,则会从数据库将该服务剔除,并且发布相关事件,通过数据同步至网关,网关收到后,会同步缓

yilongzhetian的博客 391

Abaqus小白必看:用Micromechanics Plugin轻松搞定RVE周期性边界条件(附避坑指南)

本文为Abaqus初学者提供了使用官方Micromechanics Plugin插件高效实现复合材料代表性体积单元分析的完整指南。文章详细讲解了从插件安装、模型准备、周期性边界条件自动设置到结果验证的全流程,并重点分享了处理复杂模型和避免常见错误的实用技巧,帮助用户大幅提升RVE分析效率与准确性。

weixin_28363123的博客 796

【云原生之Docker实战】使用docker部署Monica个人开源CRM系统

【云原生之Docker实战】使用docker部署Monica个人开源CRM系统

jks212454的博客 2382

【Soul源码阅读系列(二)】Divide插件

今天体验的是Soul中divide插件,它的主要作用是用于http的代理。在文章后面一节简单分析了divide插件的执行原理。 Divide插件使用案例 Soul官方在soul-examples模块提供了测试样例,其中的soul-examples-http模块演示的通http发起请求到soul网关,然后再到真实的服务。模块目录及配置信息如下: ​ soul.http是有关Soul的配置,adminUrl是Soul的后台管理地址,port是业务系统的端口,contextPath是业务系统的请求路径。 在项目

子夜的博客 345

【ComfyUI】多模型 户型图风格渲染效果图

本文介绍了一种基于ComfyUI的室内户型图自动渲染工作流,将平面图转换为风格化效果图。该工作流通过RH_Captioner节点识别空间布局,结合Qwen2.5模型优化文本描述,再使用定制室内设计模型生成渲染图。整个流程包含图像输入、空间识别、文本组织、语言生成、风格转换和渲染输出等9个阶段,各节点协同完成从户型图到效果图的全自动转换。系统融合了语言理解和图像生成技术,可广泛应用于室内设计、装修可视化等领域。

Mr数据杨 3006

Soul网关默认Divide插件的使用

Divide插件的使用 上一篇已经说到,Soul网关代理了我们自定义的一个SpringBoot服务。 这一篇。我们就来尝试下如何实现网关的默认的Divide插件提供的负载均衡功能(好像也只能根据匹配的规则提供负载均衡的功能) 此选择器为我SpringBoot服务启动并连接到soul-admin之后默认生成的,但是由此产生了一个问题,当我的应用下线之后,这个选择器和选择器规则并没有下线?有待后续的研究。 同时观察表单元素。参阅Soul文档,发现有如下选择器规则 类型:custom flow 是自定义流量。

微瞰技术的博客 640

精通 Android NDK/JNI:从入门到精通实战与面试精粹

在Android开发中,

郑伟强dev的专栏 144

[企业AI落地] RAG 知识库系统在多租户环境下的细粒度权限隔离设计

多租户 RAG 系统真正的风险不只是搜不到,而是把不该看到的内容查出来、说出来、写回去。本文结合多客户售后知识助手场景,用元数据结构、向量检索过滤、回答策略和审计回写示例拆解租户、资源、检索、生成、审计五层权限边界。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 219

Soul-源码阅读9-divide插件2

回顾前天写的divide插件文章:Soul-源码阅读5-回顾总结插件相关 那天做了总结并分析了AbstractSoulPlugin方法(主要是选择器和规则的设定)。 今天深入看了divide插件是怎么根据selector和rule进行http请求的代理转发的。 DividePlugin 看之类DividePlugin 的doExecute()方法 根据选择器id获取selector配置的服务地址list, 如果为空会抛出NPE. final List<DivideUpstream&

tbmingzhao的博客 1105

2026年3月GESP真题及题解(C++七级): 选择题和判断题(题解)

2026年3月GESP真题及题解(C++七级): 选择题和判断题(题解)

王老师青少年编程 984

Soul网关源码阅读(四)—— sofa插件详解

Soul网关源码阅读(四)—— sofa插件详解 概述 经过divide插件和dubbo插件篇的讲解,soul网关的核心概念和大体运行机制已经熟悉的差不多了。我们知道了,更换插件对于soul网关来说无非不就是更换soul网关到后端服务的通信协议,剩下的逻辑都是共同的。 因此这篇文章在介绍sofa插件使用方式的同时,我们还会接着上一篇dubbo篇,续集往下深入,梳理一下soul-admin与soul-bootstrap服务进行数据同步的具体细节。 实践操作 启动admin服务。 在bootstrap服

u010084384的专栏 477

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Soul源码阅读系列(三)】插件是如何被加载和执行的?

在上篇文章中,我们通过一个案例演示了http用户如何接入到Soul网关中,本文将探索其中的原理: Soul如何加载插件? 业务接口如何注册到soul admin中? Divide插件的原理是什么? Soul 如何加载插件? 首先,我们来看看Soul是如何加载各个插件的?在上一篇文章中,我们看到了Divide插件的调用过程: SoulWebHandler:它实现了WebHandler,重写了handle()方法,用于处理Soul网关中所有的请求。 DefaultSoulPluginChain:插件链执行

子夜的博客 288

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Soul源码总结-01-14

1月14日作业搭建网关环境感悟及总结 搭建网关环境 首先从fork soul的仓库,并git clone 到本地进行调试 git clone https://github.com/dromara/soul.git 参考Soul极简入门 步骤及在调试过程中遇到的error: mvn clean package install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Drat.skip=true -Dcheckstyle.skip=true 合理

qq_42965594的博客 616

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

说明 本文代码基于soul 2021.2.4 master分支版本。 准备 请先阅读soul官方用户文档 -> HTTP代理, 并事先使用过divide插件,阅读过divide插件源码,源码分析可以参考我之前写过的文章:soul源码分析(1)http插件的使用与soul插件工作流程分析 目标 本文将包括如下内容: divide插件如何实现负载均衡 divide插件如何实现端口探活 divide插件如何实现负载均衡? 看过的divide插件源码的童鞋知道,该插件主要逻辑在DividePlugin中:

evasnowind的专栏 331

【Soul源码阅读】5.GET 请求在 Soul 网关中流转的简单分析

前几天一直在外围转悠,试用了一下默认的 divide 插件,今天来研究下一个请求是如何通过 Soul 网关分发到真实服务节点的。 通过浏览器或 postman 发送一个 GET 请求。 http://localhost:9195/http/order/findById?id=95 selector 和 rule 默认都打开日志了,可以在 SoulBootstrapApplication 的 console 控制台看到如下日志如下: 2021-01-18 18:35:05.357 INFO 20836 -

hellboy0621的博客 388

Soul网关源码阅读15-解析rate_limiter限流插件

rateLimiter 是soul网关的限流插件,是网关对流量管控的核心,今天来尝试使用一下,并结合源码解析原理。 一、环境配置 1、soul-admin 系统管理 > 插件管理 > 打开rate_limiter插件开关 redis选择的是单机部署standalone,填入 redis的,url,password,然后点击确定 我代理的服务是通过http请求,所以还要打开devide插件 2、soul-bootstrap soul-bootstrap/pom.xml 加入ratelim

xiaoxu的博客 894

Soul 网关源码阅读(三)请求处理概览

基于上篇:[Soul 源码阅读(二)代码初步运行]()的配置,这次debug下请求处理的大致路径,验证网关模型的路径

github_35735591的博客 763

Soul网关源码阅读17-解析rewrite插件

rewrite插件可以帮我们重新请求的URL,这样对外可以屏蔽实际的请求地址。我们来解析一下如何使用 一、环境搭建 soul-admin 开启 rewrite 插件:系统管理 --> 插件管理 soul-bootstrap soul-bootstrap/pom.xml 网关中 rewrite 依赖默认是没有的需要手动添加 <dependency> <groupId>org.dromara</groupId> <artifactI

xiaoxu的博客 842
上一篇: 【Soul源码阅读】18.插件之 sentinel
下一篇: 【Soul源码阅读】20.插件灵魂之选择器和规则
hellboy0621
博客等级 码龄9年 61粉丝 147原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值