Soul网关学习(2-1)Http代理之divide插件使用
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 插件最基础的配置,还有其他各种规则配置后面都可以试一试~