API网关管理

[TOC] # 总体介绍 req阶段是生命周期的第1步,可配置的内容较多,将来还会扩充很多插件功能。 ![](https://oss.showapi.com/doc/3105/68/1e4c69c1f3064744800b9d55be4ac851.png) req阶段主要完成以下功能: **1.请求参数定义** **2.黑白名单策略** **3.redis缓存配置** # 1. 请求参数定义 ##1.1 定义访问方式 ![](https://oss.showapi.com/doc/3105/68/e6b24d4e59ef49a0a2ff0e7a4314e03b.png) 在字段不多,且字段字符长度较短的情况下,可以GET和POST一起用,但如果需要传入长字段值(比如文本比对,要传两个长文本),则一定要单选POST方式,因为GET传输时,URL的的长度是有限制的。 ##1.2 定义请求参数 > 如果请在求参数中没有定义某个key,则此key不会被易源转发到服务后端。比如说在请求参数中定义了name,age两个参数,但是客户端提交了name,age,type三个参数,那么type参数不会被转发到后端。 ###1.2.1 参数名称 ![](https://oss.showapi.com/doc/3105/68/a278d2ff9c0e4ee8ab4cb89d6e62e9da.png) 定义客户传输时的字段名称。比如上图中定义了一个my_para字段,在客户端传输时,应该这样: ```html <form> <input type="text" name="my_para"> </form> ``` ###1.2.2 类型 ![](https://oss.showapi.com/doc/3105/68/babc0c6e80284085afd139ad719543ae.png) 目前支持String、Number、List、Object、Boolean、File六种输入类型。 String、Number是最常用的类型。 #### String 类型 这是默认类型。实际上客户提交上来的所有字段原始值都是String值,到了易源后,易源会根据指定的数据类型将这个String做类型转换。 #### Number 类型 易源把传入的字符串转为Number数字类型。比如传递http://xxx.com/?myage=1 ,虽然易源收到的是字符串"1",但在易源内部会把其转换为数字1对待,这样会有很多便利之处,比如数字大小约束、在lua代码中的数字判断等。 #### Object 类型 Object类型表示传入的字段值必须符合json的标准。关于json的定义可以查看此链接 http://www.json.org/ json 就是形如这样的数据: ```json {"name":"张三"} ``` #### List 类型 List类型表示传入的字段值必须符合json array的标准。关于json的定义可以查看此链接 http://www.json.org/ json array就是形如这样的数据: ```json [ {"name":"张三"}, {"age":25}, ] ``` #### Boolea 类型 布尔类型比较好理解,就是传入串必须是true或false 。 #### File 类型 表明此字段是上传文件字段。假如定义了一个image的File字段,则表单提交时是类似这样的: ```html <form action="/upload" method="post" enctype="multipart/form-data">   <input type="file" name="image">   <button type="submit">上传</button> </form> <!--注意里面的 type="file"--> ``` ###1.2.3 【必填】选项 如果此项打上勾,表明此字段必须传值,传空字符串也行,总之必须输入此字段。 ###1.2.4 【默认值】选项 如果此字段为可选&&没有传此字段值时,那么此值为默认值。用伪代码表达就是: ```java def value=params.key if (key为可选&&value==null){ value=默认值 } ``` ###1.2.5 示例值 示例值是在接口显示时,默认填写在表单中的值,如下图: ![](https://oss.showapi.com/doc/3105/68/871743e4f9fb4d09a07eb9eaf0e81eab.png) ###1.2.6 常量值 ![](https://oss.showapi.com/doc/3105/68/14fcc2531fbf47a083edc89681a26f4f.png) ###1.2.7 传入位置 ![](https://oss.showapi.com/doc/3105/68/d73252a12f3349eda919fd54a9e15dcc.png) 可以定义三种传入位置: 1. header 2. url 3. post的body 传入的值可以在下一阶段【req阶段】中进行映射和变换位置。 ###1.2.8 字段高级约束 ![](https://oss.showapi.com/doc/3105/68/cf1ee77155d347f385681513062286e6.png) 高级约束可以为字段实现前置约束,在数据把转发到后端服务前,把不符合规范的请求拦截下来。 点击如下图中的按钮: ![](https://oss.showapi.com/doc/3105/68/b23523ed924a450abace0165b5cf9493.png) #### 字符串约束 ![](https://oss.showapi.com/doc/3105/68/9ef724ad4641419199a937b56045ccff.png) #### 数字约束 ![](https://oss.showapi.com/doc/3105/68/1b5ed96f20ab43a19a6fb6d33f8b54ad.png) #### 枚举约束 ![](https://oss.showapi.com/doc/3105/68/e8dbef3b20b84385a5264e71a33700fd.png) ##1.2.9 删除字段 删除某个字段定义,此操作需谨慎。 # 2. 黑白名单策略 用于控制调用方IP的进入(白名单)或阻挡(黑名单)。 ![](https://oss.showapi.com/doc/3105/68/41980c8808004f6dbef71175ab88826b.png) 如果确认使用,不要忘记【启用】选项。 # 3. redis缓存 假设我们的输入参数是这样的: ![](https://oss.showapi.com/doc/3105/68/d372d3969a7941e5bb45355a7d6ce593.png) 有三个输入参数my_para、age和type,但返回值的时间性并不强,因此后端服务没必要每次都根据三个参数去查一次数据库,那就可以把它们三者做成一个key,把返回值做成value放到缓存中。 我们把key值用mustache语法写为: ```java {{my_para}}_{{age}}_{{type}} ``` 如下图: ![](https://oss.showapi.com/doc/3105/68/acc1cc1277e24d27bbc7cdaed23bfbb3.png) > 缓存中无值时, 请求才会穿透到后面的proxy, balance流程。如果返回值是一个非null的json对象, 则其会被放入Redis缓存, 在这里设置的就是它的超时时间。 在没有配置redis,或是redis没有命中时,请求生命周期是这样的: ![](https://oss.showapi.com/doc/3105/68/db4aeac229ca4a7f9ed7eacc808db3a2.png) 也就是六个阶段都穿透了,但如果redis中有值,则请求会是这样的: ![](https://oss.showapi.com/doc/3105/68/899fb5191eee442bb02b737d53477e9b.png) 请求只经过了req和req_response就结束了,不到后端,因此您的服务器收不到请求,也就大大减经了压力。