跳至主要內容
Soul网关学习(2-1)Http代理之divide插件使用

Soul网关学习(2-1)Http代理之divide插件使用

袁杰大约 5 分钟Soul

Divide 插件使用

一、启动项目

先启动 soul-bootstrap(9195)、soul-admin(9095)两个模块,我们通过 bootstrap 配置文件可以看到,两者是通过 WebSocket 协议进行数据同步:

图片
图片

通过 bootstrap 日志也可以看到:

图片
图片

所谓的数据同步是指将 soul-admin 中配置的数据,同步到 soul 集群中的 JVM 内存里面,是网关高性能的关键。

我们启动两个项目之后就可以通过后台管理系统测试 divide 插件了。

二、divide 插件介绍

divide 插件是网关处理 http 协议请求的核心处理插件,也是 soul 唯一默认开启的插件:

图片
图片

我们可以想象一下网关到底是做什么的,去猜测一下处理 http 请求的 divide 插件可能具备哪些功能呢?

首先,作为微服务网关,它的背后一定存在多条业务线的分布式微服务集群,而网关作为所有服务的统一入口,必须具备的能力就是流量分发/路由/负载均衡等,而 divide 这个单词顾名思义就是分配、分发的意思,所以我们可以猜测 divide 插件就是对 http 请求进行各种规则的路由转发,这也是网关最基础的能力。

我们打开管理界面上的插件列表,可以看到所有插件都是由两部分组成:选择器(selector)和选择器规则

插件化设计思想是 soul 网关最核心的设计思想,而选择器和规则这两个概念也是 soul 网关的灵魂所在,理论上来说,我们掌握好它,就能对任何接入网关的流量进行管理。

一个插件有多个选择器,一个选择器对应多种规则。选择器相当于是对流量的第一次筛选,规则就是最终的筛选。

选择器

图片
图片
* **名称**:为你的选择器起一个容易分辨的名字
* **类型**:custom flow 是自定义流量。full flow 是全流量。自定义流量就是请求会走你下面的匹配方式与条件。全流量则不走。
* **匹配方式**:and 或者or 是指下面多个条件是按照and 还是or的方式来组合。
* **条件**:
    * uri:是指你根据uri的方式来筛选流量,match的方式支持模糊匹配(/**)
    * header:是指根据请求头里面的字段来筛选流量。
    * query:是指根据uri的查询条件来进行筛选流量。
    * ip:是指根据你请求的真实ip,来筛选流量。
    * host:是指根据你请求的真实host,来筛选流量。
    * post:建议不要使用。
    * 条件匹配:
        * match : 模糊匹配,建议和uri条件搭配,支持 restful风格的匹配。(/test/**)
        * = : 前后值相等,才能匹配。
        * regEx : 正则匹配,表示前面一个值去匹配后面的正则表达式。
        * like :字符串模糊匹配。
* **是否开启**:打开才会生效
* **打印日志**:打开的时候,当匹配上的时候,会打印匹配日志。
* **执行顺序**:当多个选择器的时候,执行顺序小的优先执行。

选择器规则

图片
图片
图片
图片

可以看到,规则的配置和选择器类似,可以理解为更细粒度的自定义配置。

三、divide 插件使用

废话少说,我们直接运行 soul 提供的 examples 模块来演示 divide 插件。

图片
图片

注意,我们最终运行的是 soul-examples-http 模块。配置文件可以使用默认的,也可以自定义 contextPath 和 appName,如上图。

我们需要注意,contextPath 这个属性非常重要,相当于是我们所有 http 请求的 namespace,和选择器一一对齐。一般来说,我们可以配置一个业务对应一个 contextPath,一个业务下面配置相同 contextPath 的多个服务实例会自动映射到同一个选择器进行负载均衡。

我们启动端口为 8188 的这个进程后,可以发现管理控制台 divide 插件列表中自动配置了这个实例对应的选择器、规则:

图片
图片

可以看到我启动的这个 8188 项目地址自动注册上去了:

图片
图片

测试网关路由

通过 postman 先测试不经过网关转发:

http://localhost:8188/order/findById?id=1
图片
图片

然后再测试通过网关转发到这个接口:

http://localhost:9195/my-http/order/findById?id=1
图片
图片

看日志发现确实经过了网关转发到了 8188 接口地址:

图片
图片

测试负载均衡

我们修改端口为 8189,启动第二个进程。

图片
图片

注意 IDEA 需要取消 Single instance only 的限制:

图片
图片

我们再进入管理控制台,发现 my-http 选择器下出现两个配置地址:

图片
图片

此时我们继续测试,发现负载均衡策略确实生效了:

图片
图片

今天只是演示了 divide 插件最基础的配置,还有其他各种规则配置后面都可以试一试~

上次编辑于:
贡献者: Cicici-Shi