三、soul源码学习-http-divide插件学习

上一节我们学习了http项目本地启动的整体流程,并跑通http请求网关转发到自己服务,这节我们学习下divide插件

一、插件数据库设计:

首先我们关注下soul的插件数据库的设计,soul的插件是持久化在数据库中的。

  1. 对应关系:
    一个插件对应多个选择器,一个选择器对应多个规则
    一个选择器和规则都对应多个匹配条件
    每个规则在对应插件下,不同的处理表现为handler字段
  2. 数据库表UML(早期版本,现在可能有些出入)
image.png

二、什么是选择器?什么是规则?

选择器和规则是soul中最核心的东西

  1. 插件中有许多的选择器,一个选择器有对应多种规则
  2. 选择器会对流量做第一次的筛选,规则在做最终的筛选
  3. 选择器和规则要做的就是为了让流量能够在满足特定的条件下,才取执行我们的想要的

选择器:

image.png

选择器配置详解:

  • 名称: 选择器的名称

  • 类型:

    • cutom:自定义流量
    • full:全流量流量

    选择full后,发现配置中匹配方式和条件都会隐藏掉,不再需要再配置匹配方式和条件了

image.png
image.png
  • 匹配方式:and 或者or 是指下面多个条件是按照and 还是or的方式来组合

  • 条件:

    • uri:是指你根据uri的方式来筛选流量,match的方式支持模糊匹配(/**)
    • header:是指根据请求头里面的字段来筛选流量。
    • query:是指根据uri的查询条件来进行筛选流量。
    • ip:是指根据你请求的真实ip,来筛选流量。
    • host:是指根据你请求的真实host,来筛选流量。
    • post:建议不要使用。
    • 条件匹配:
      • match:模糊匹配,建议和uri条件搭配,支持 restful风格的匹配。(/test/**)
      • =:前后值相等,才能匹配。
      • regEx:正则匹配,表示前面一个值去匹配后面的正则表达式。
      • like:字符串模糊匹配。
  • 是否开启:打开才会生效

  • 打印日志:打开的时候,当匹配上的时候,会打印匹配日志。

  • 执行顺序:当多个选择器的时候,执行顺序小的优先执行。

  • 选择器建议:可以uri 条件, match 前缀 (/contextPath),进行第一道流量筛选。

规则:

image.png

当流量经过选择器匹配成功之后,会进入规则来进行最终的流量匹配。

规则详解:

  • 名称:规则的名称

  • 匹配方式: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 请求头中的字段值来匹配。
  • 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插件是开启状态。(默认开启)

image.png

网关如果想支持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

image.png

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秒
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容