运行examples下面的 http服务
启动 soul-examples-http,默认端口 8188,可以看到启动时的日志:
divide插件是进行http正向代理的插件,所有http类型的请求,都是由该插件进行负载均衡的调用。
选择器和规则是soul网关中最灵魂的东西。掌握好它,你可以对任何流量进行管理。
通俗易通的解释:一个插件有多个选择器,一个选择器对应多种规则。选择器相当于是对流量的第一次筛选,规则就是最终的筛选。
需要启动 soul-bootstrap、soul-admin、soul-examples-http
启动 soul-bootstrap 后可以看到会有输出日志:
websocket reconnection is error.....
这时候我们再把 soul-admin 也启动,日志输出:
websocket reconnect is successful.....
这说明 soul-bootstrap 通过 websocket 与 soul-admin进行连接。
首先在 soul-admin 启动 divide 插件,启动后可以看到这里也是 open 状态
点击 Editor 可以看到,有个按钮可以 开启/关闭 插件,这里需要确保 divide 是打开状态
请求URL 如果模糊匹配到了 /dividePluginTest ,流量就会匹配上刚创建的这个选择器。(match : 模糊匹配,建议和uri条件搭配,支持 restful风格的匹配。(/dividePluginTest/**))
那么这个选择器就进行了第一道流量的筛选,/dividePluginTest/** 这种请求才会被过滤出来。接下来配置一个或多个规则,当流量经过选择器匹配成功之后,会进入规则来进行最终的流量匹配。
这条规则会匹配上请求URL 为 /dividePluginTest/test 的流量。
选择器和规则都设置好了,接下来对 HTTP 请求进行简单的测试,看看配置的选择器和规则是否生效。按照预期,请求 URL为 /dividePluginTest/test 的流量会匹配上,然后被转发到 127.0.0.1:8080。
1)请求 http://localhost:9195/AAAAAA/aaaaa 会返回 ‘找不到相应的选择器’
2)请求 http://localhost:9195/http/BBB 会返回‘没有对应的规则’。因为我们默认是有个模糊匹配 /http 的选择器的,但是没有匹配 /BBB 的规则。
3)请求 http://localhost:9195/http/order/findById?id=111 ,匹配上了,
请求被转发到 http://192.168.3.2:8188/order/findById
接下来测试我们自己配置的选择器( 模糊匹配/dividePluginTest/**) 和 规则 (精确匹配 /dividePluginTest/test)
4)请求 http://localhost:9195/dividePluginTest/hahahahah ,返回找不到规则,但是选择器匹配上了,结果符合预期。
5)请求 http://localhost:9195/dividePluginTest/test ,请求被选择器和规则匹配上,并转发到了 127.0.0.1:8080 ,结果符合预期。
看 soul-bootstrap 的日志,也可以看到请求 URL 被成功匹配
├── 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