Soul网关(二)---- divide 插件代理 HTTP 请求

soul-examples-http

运行examples下面的 http服务
启动 soul-examples-http,默认端口 8188,可以看到启动时的日志:
Soul网关(二)---- divide 插件代理 HTTP 请求_第1张图片

divide 插件

divide插件是网关处理 HTTP 请求的核心处理插件。

divide插件是进行http正向代理的插件,所有http类型的请求,都是由该插件进行负载均衡的调用。

选择器和 规则

选择器和规则是soul网关中最灵魂的东西。掌握好它,你可以对任何流量进行管理。

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

使用 divide 插件进行 HTTP 请求代理

需要启动 soul-bootstrap、soul-admin、soul-examples-http

启动 soul-bootstrap 后可以看到会有输出日志:

websocket reconnection is error.....

这时候我们再把 soul-admin 也启动,日志输出:

websocket reconnect is successful.....

这说明 soul-bootstrap 通过 websocket 与 soul-admin进行连接。

1 在 soul-admin 将 divide 打开

首先在 soul-admin 启动 divide 插件,启动后可以看到这里也是 open 状态

Soul网关(二)---- divide 插件代理 HTTP 请求_第2张图片

点击 Editor 可以看到,有个按钮可以 开启/关闭 插件,这里需要确保 divide 是打开状态

Soul网关(二)---- divide 插件代理 HTTP 请求_第3张图片

2 在 soul-admin 配置一个选择器

请求URL 如果模糊匹配到了 /dividePluginTest ,流量就会匹配上刚创建的这个选择器。(match : 模糊匹配,建议和uri条件搭配,支持 restful风格的匹配。(/dividePluginTest/**))

Soul网关(二)---- divide 插件代理 HTTP 请求_第4张图片

那么这个选择器就进行了第一道流量的筛选,/dividePluginTest/** 这种请求才会被过滤出来。接下来配置一个或多个规则,当流量经过选择器匹配成功之后,会进入规则来进行最终的流量匹配。

3 在 soul-admin 给选择器配置一个或多个规则

这条规则会匹配上请求URL 为 /dividePluginTest/test 的流量。

Soul网关(二)---- divide 插件代理 HTTP 请求_第5张图片

4 测试 HTTP 请求代理

选择器和规则都设置好了,接下来对 HTTP 请求进行简单的测试,看看配置的选择器和规则是否生效。按照预期,请求 URL为 /dividePluginTest/test 的流量会匹配上,然后被转发到 127.0.0.1:8080。

1)请求 http://localhost:9195/AAAAAA/aaaaa 会返回 ‘找不到相应的选择器’
Soul网关(二)---- divide 插件代理 HTTP 请求_第6张图片

2)请求 http://localhost:9195/http/BBB 会返回‘没有对应的规则’。因为我们默认是有个模糊匹配 /http 的选择器的,但是没有匹配 /BBB 的规则。

Soul网关(二)---- divide 插件代理 HTTP 请求_第7张图片

3)请求 http://localhost:9195/http/order/findById?id=111 ,匹配上了,
Soul网关(二)---- divide 插件代理 HTTP 请求_第8张图片

请求被转发到 http://192.168.3.2:8188/order/findById

Soul网关(二)---- divide 插件代理 HTTP 请求_第9张图片

接下来测试我们自己配置的选择器( 模糊匹配/dividePluginTest/**) 和 规则 (精确匹配 /dividePluginTest/test)

4)请求 http://localhost:9195/dividePluginTest/hahahahah ,返回找不到规则,但是选择器匹配上了,结果符合预期。
Soul网关(二)---- divide 插件代理 HTTP 请求_第10张图片

5)请求 http://localhost:9195/dividePluginTest/test ,请求被选择器和规则匹配上,并转发到了 127.0.0.1:8080 ,结果符合预期。

Soul网关(二)---- divide 插件代理 HTTP 请求_第11张图片

看 soul-bootstrap 的日志,也可以看到请求 URL 被成功匹配

Soul网关(二)---- divide 插件代理 HTTP 请求_第12张图片

divide 插件源码结构

├── DividePlugin.java(请求的转发)
├── balance(HTTP 请求的负载均衡算法的实现)
│   ├── LoadBalance.java
│   ├── spi
│   │   ├── AbstractLoadBalance.java
│   │   ├── HashLoadBalance.java
│   │   ├── RandomLoadBalance.java
│   │   └── RoundRobinLoadBalance.java
│   └── utils
│       └── LoadBalanceUtils.java
├── cache(本地缓存管理)
│   └── UpstreamCacheManager.java
├── handler(把选择器跟请求过滤规则同步到本地缓存)
│   └── DividePluginDataHandler.java
└── websocket
    └── WebSocketPlugin.java

总结

Soul网关通过 divide 插件来处理 HTTP 请求,所以 Soul 网关 soul-bootstrap 的 pom 文件中需要添加以下两个 starter 的依赖:


   
       org.dromara
       soul-spring-boot-starter-plugin-divide
       2.2.0
   

   
       org.dromara
       soul-spring-boot-starter-plugin-httpclient
       2.2.0
   

另外,插件通过 soul-admin 进行管理, 所以还需要启动 soul-admin 并确保 divide 插件为开启状态。

HTTP请求先走 divide 插件,如果请求最终被选择器和规则匹配上了,就会转发到选择器中配置的对应的 ip:port

思考

  1. Soul 网关对 HTTP 请求的限流规则的配置非常灵活与简便。在 soul-admin 配置好选择器和规则,就可以对 HTTP 请求进行过滤和限制,相比 Spring Cloud Gataway来说,这一点要方便不少,Soul 有点 Spring Cloud Gataway + 配置中心 的感觉

你可能感兴趣的:(Soul,网关源码,网关)