上一节我们学习了http项目本地启动的整体流程,并跑通http请求网关转发到自己服务,这节我们学习下divide插件
一、插件数据库设计:
首先我们关注下soul的插件数据库的设计,soul的插件是持久化在数据库中的。
- 对应关系:
一个插件对应多个选择器,一个选择器对应多个规则
一个选择器和规则都对应多个匹配条件
每个规则在对应插件下,不同的处理表现为handler字段 - 数据库表UML(早期版本,现在可能有些出入)
二、什么是选择器?什么是规则?
选择器和规则是soul中最核心的东西
- 插件中有许多的选择器,一个选择器有对应多种规则
- 选择器会对流量做第一次的筛选,规则在做最终的筛选
- 选择器和规则要做的就是为了让流量能够在满足特定的条件下,才取执行我们的想要的
选择器:
选择器配置详解:
名称: 选择器的名称
-
类型:
- cutom:自定义流量
- full:全流量流量
选择full后,发现配置中匹配方式和条件都会隐藏掉,不再需要再配置匹配方式和条件了
匹配方式:and 或者or 是指下面多个条件是按照and 还是or的方式来组合
-
条件:
- uri:是指你根据uri的方式来筛选流量,match的方式支持模糊匹配(/**)
- header:是指根据请求头里面的字段来筛选流量。
- query:是指根据uri的查询条件来进行筛选流量。
- ip:是指根据你请求的真实ip,来筛选流量。
- host:是指根据你请求的真实host,来筛选流量。
- post:建议不要使用。
- 条件匹配:
- match:模糊匹配,建议和uri条件搭配,支持 restful风格的匹配。(/test/**)
- =:前后值相等,才能匹配。
- regEx:正则匹配,表示前面一个值去匹配后面的正则表达式。
- like:字符串模糊匹配。
是否开启:打开才会生效
打印日志:打开的时候,当匹配上的时候,会打印匹配日志。
执行顺序:当多个选择器的时候,执行顺序小的优先执行。
选择器建议:可以
uri
条件,match
前缀 (/contextPath),进行第一道流量筛选。
规则:
当流量经过选择器匹配成功之后,会进入规则来进行最终的流量匹配。
规则详解:
名称:规则的名称
匹配方式:and 或者or 是指下面多个条件是按照and 还是or的方式来组合
-
条件:
- uri:是指你根据uri的方式来筛选流量,match的方式支持模糊匹配(/**)
- header:是指根据请求头里面的字段来筛选流量。
- query:是指根据uri的查询条件来进行筛选流量。
- ip:是指根据你请求的真实ip,来筛选流量。
- host:是指根据你请求的真实host,来筛选流量。
- post:建议不要使用。
- 条件匹配:
- match:模糊匹配,建议和uri条件搭配,支持 restful风格的匹配。(/test/**)
- =:前后值相等,才能匹配。
- regEx:正则匹配,表示前面一个值去匹配后面的正则表达式。
- like:字符串模糊匹配。
是否开启:打开才会生效
打印日志:打开的时候,当匹配上的时候,会打印匹配日志。
执行顺序:当多个规则的时候,执行顺序小的优先执行。
规则建议:可以
uri
条件,match
最真实的uri路径
,进行流量的最终筛选 。
条件详解:
- uri 匹配 (推荐)
- uri匹配是根据你请求路径中的uri来进行匹配,在接入网关的时候,前端几乎不用做任何更改。
- 当使用
match
方式匹配时候,同springmvc
模糊匹配原理相同。 - 在选择器中,推荐使用uri中的前缀来进行匹配,而在规则中,则使用具体路径来进行匹配。
- 该匹配方式的时候,在匹配字段名称可以任意填写,匹配字段值需要正确填写。
- header 匹配
- header是根据你的
http
请求头中的字段值来匹配。
- header是根据你的
- query 匹配
- 这个是根据你的uri中的查询参数来进行匹配,比如 /test?a=1&&b=2 ,那么可以选择该匹配方式。
- 上述就可以新增一个条件,选取 query方式 , a = 1 。
- ip匹配
- 这个是根据 http调用方的 ip来进行匹配。
- 尤其是在waf插件里面,如果发现一个ip地址有攻击,可以新增一条匹配条件,填上该ip,拒绝该ip的访问。
- 如果在soul前面使用了nginx代理,为了获取正确的ip,你可能要参考 dev-iphost
- host匹配
- 这个是根据 http调用方的host来进行匹配。
- 尤其是在waf插件里面,如果发现一个host地址有攻击,可以新增一条匹配条件,填上该host,拒绝该host的访问。
- 如果在soul前面使用了nginx代理,为了获取正确的host,你可能要参考 dev-iphost
- post匹配
- 不推荐使用。
二、divide插件
divide插件是网关处理http协议请求的核心处理插件
插件设置,访问http://127.0.0.1:9095/#/system/plugin,保证divide插件是开启状态。(默认开启)
网关如果想支持divide插件,需要在我们的网关项目soul-bootstrap中引入如下依赖:
<!--if you use http proxy start this-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-divide</artifactId>
<version>${last.version}</version>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-httpclient</artifactId>
<version>${last.version}</version>
</dependency>
插件详解:
divide插件是进行http正向代理的插件,所有的http类型的请求,都是由该插件进行负载均衡调用的
想要了解什么是正向代理和反向代理,可以看这篇文章:https://cloud.tencent.com/developer/article/1418457
http配置,是网关匹配到流量以后,真实调用的http配置,可以配置多个,设置负载均衡权重,具体的负载均衡策略,在规则中指定
配置详解:
- 第一个框:hostName,一般填写
localhost
,该字段暂时没使用。 - 第二个框:http协议,一般填写
http://
或者https://
,不填写默认为:http://
- 第三个框:ip与端口,这里填写你真实服务的 ip + 端口。
- 第四个框:负载均衡权重。
ip + port 检测:
在soul-admin 会有一个定时任务来扫描 配置的ip端口,如果发现下线,则会除该 ip + port
可以进行如下配置 :
soul.upstream.check:true 默认为 ture,设置为false,不检测
soul.upstream.scheduledTime:10 定时检测时间间隔,默认10秒