VX-API-Gateway(以下称为VX-API)是基于Vert.x 3.5.1(java)开发的API网关,是一个分布式、全异步、高性能、可扩展、轻量级的API网关
VX-API 目录结构
下载压缩包之后,将其解压缩到任意目录即可看到以下(压缩版的)目录结构:
bin 执行脚本
conf 配置文件与客户端静态文件
lib 项目依赖的架包
logs 日志文件
temp 缓存/临时文件
启动VX-API-Gateway
进入bin目录执行系统相应的脚本文件启动VX-API
运行环境要求:因为是使用java(java 8 )开发的,所以你的运行系统中需要有java运行环境,
如果你的系统中没有存在java运行环境或者运行环境小于java8,可以下载一个java8的运行环境
oracle下载java运行环境
并修改启动脚本文件中的将启动环境指向指定的java运行环境
修改示例(Windows环境):
假设jre在D盘/java目录下,可以在start.bat找到
%JAVACMD% %JAVA_OPTS% -Dfile....
在以上语句前cd到jre的所在bin目录,也就是在执行java之前切换到D:/java/jreXXX/bin目录在执行java,相当于设置了一个运行环境
启动完毕后控制台会提示启动是否成功,也可以通过浏览器输入http://localhost:5256/进行查看,客户端的默认连接端口为5256,可以在conf/conf.json配置文件中指定客户端运行的端口;
可以在配置文件中指定以单节点启动还是以集群的方式启动详情查看
配置文件说明
在IDE中启动VX-API-Gateway
项目在IDE(Eclipse或IDEA等)启动可以自己写一个类,并在main方法中调用VxApiLauncher.start()方法便可;
应用Application
应用可以理解为分组,是VX-AP中的一个运行单元,一个应用相当于一个服务器(Server)不同的是他的端口号允许被重复使用,也就是说在VX-API中一个端口号可以给任意应用绑定(前提是这个端口号没有被别的程序绑定),应用用于管理API
访问http://localhost:端口号(默认5256)/static/Application.html或者通过http://localhost:端口号(默认5256)进入后便可以查看与管理应用
API
API是VX-API的服务核心,创建应用后便可以在应用的API管理中创建API;
当前版本中API支持三种服务类型,
- HTTP/HTTPS服务(既VX-API需要去请到后台服务器的类型):参数检查与透传,支持带权重的负载均衡访问策略,轮询与IP哈希化,自动断路与重试不可用的后台服务地址
- 页面跳转服务:当用户访问时redirect到指定页面
- 自定义服务:可以自定义任意服务,当前版本中实现了,基于session-token的认证授权,获取服务器时间戳,与获取常量
同时API支持全局黑名单,流量限制,权限认证,自定义前置/后置处理器等
API的执行流程
绿线代表一定会执行,黑线代表当存在时执行,当用户请求的时候,完整的流程按组件顺序由1开始执行到7,如果不满足任意一个组件时请求结束并响应(fail-end-response),当任意组件出现异常时统一进入异常组件(Exception
Handler)请求结束并响应错误信息
更多API的执行流程介绍参考下方API组件介绍
API组件介绍
-
黑名单检查
该组件永远会被执行! 用户请求时第一步先经过黑名单检查,VX-API会读取请求中的remote
Address并获取用户的host(也就是获取用户的IP地址),如果用户的IP地址在全局黑名单中,结束请求并响应状态码:404,状态信息:you can't access this
service;反则继续执行处理...
-
访问限制
当创建API时开启了访问限制,该组件会被执行! 访问限制单位分别为:天/小时/分;可以设置API与IP限制,IP的限制不能大于API的限制;
假设开启API限制:1分钟可以访问1000次;如果1分钟内访问次数大于1000将结束请求并响应请求(响应内容为:创建API中定义API返回结果:访问限制返回);反则继续执行处理...
-
参数检查
当创建API时如果在定义API请求中添加了入参定义,该组件会被执行! 组件会根据入参定义规定的格式检查请求中的参数;
如果参数不符合入参定义结束请求并响应请求(响应内容为:创建API中定义API返回结果:网关入口参数检查失败返回);反则继续执行处理...
-
权限认证
当创建API时开启了安全认证,该组件会被执行! 组件会将流程交给权限认证插件,权限认证插件负责做相关处理后决定将流程交给下一个组件处理或结束请求
-
前置处理器
当创建API时开启了前置处理器,该组件会被执行! 组件会将流程交给前置处理器插件,前置处理器插件负责做相关处理后决定将流程交给下一个组件处理或结束请求
-
中心处理器(主处理器)
当前面的组件都执行通过时,该组件永远会被执行!
组件会根据服务类型做相应的处理,处理完毕后组件会判断是否开启了后置处理器,如果开启了后置处理器,组件会将流程交给后置处理器,并传递一个标识告诉后置处理器当前组件处理的结果;反则结束请求并返回服务结果;
-
后置处理器
当创建API时开启了后置处理器,该组件会被执行! 该组件是正常流程的最后一个组件,组件会收到主处理器的执行结果,组件做完相应操作后必须做对请求的响应用户的请求;
-
异常处理器
当以上任意组件在执行的过程中出现了异常,该组件会被执行! 组件会结束请求并响应请求(响应内容为:创建API中定义API返回结果:发生异常/失败返回);
全局黑名单
黑名单对象是用户IP地址,当用户请求VX-API时第一步先经过黑名单检查,VX-API会读取请求中的remote
Address并获取用户的host(也就是获取用户的IP地址),如果用户的IP地址在全局黑名单中,结束请求并响应状态码:404,状态信息:you can't access this service;
VX-API客户端用于查看VX-API运行的基本信息,管理应用与API及黑名单,打开客户端的方式,在浏览器中请求http://地址:端口号(默认5256)进入客户端首页
修改客户端端口号
修改客户端端口号可以在conf文件夹中修改配置文件conf.json,在conf.json中找到"clientConfig": {"clientPort":
5256},clientPort为客户端端口号,将5256修改为你要的端口号便可
用户与权限认证
VX-API客户端权限分为两种1.write,2.read;
write拥有所有权限既可以创建修改删除查看等,read只能查看,两者独立;
用户存放在conf文件夹的的user.json中;key代表用户名,值代表用户的密码与权限,系统提供两个默认的用户,
用户1 VXAdmin密码为: hivx 权限为: write与read
用户2 VXOps密码为: hivx 权限为: read
当进入应用客户端时,VX-API会向浏览器发送一个401的并告诉浏览器WWW-Authenticate,浏览器会出现一个输入账户与密码的页面,用户输入正确的账号密码后便可以进入客户端;
退出客户端
点击右上角的退出便可以退出客户端
一个应用相当于一个分组,与服务一样一个应用就是服务项目,以便于API的管理;VX-API中先有应用后有API,所以需要先创建应用再创建API
创建应用
1.进入首页后点击创建应用或者访问 http://localhost:端口号(默认5256)/static/CreateAPP.html
2.输入应用的名称与应用的描述,设置一个作用域标识(只是方便查看是哪个环境下的功能都一致)后进入下一步
3.选择服务类型,HTTP或HTTPS或两者都开启,当HTTPS的时候需要设置证书的路径与证书key的路径或者密码,如果证书存放在conf/cert中,路径可以从cert/开始,示例:cert/XXX.XXX;设置是否开启跨域访问后进入下一步
4.设置错误返回信息
5.设置相关配置(可以不填使用默认或者参考
Application配置)后完成应用的创建
启动/暂停应用
1.进入首页在将要启动/暂停的应用点击查看详情
2.在查看详情中点击右上角启动/暂停,启动后同时可以选择是否启动该应用的所有API
3.当应用启动完毕后应用的状态启动会变成暂停,首页也会变为运行中
当系统使用集群运行时,客户端会广播告诉集群环境中所有程序执行相同操作
修改应用
与启动应用相似
1.进入首页在将要修改的应用点击查看详情
2.在查看详情中点击右上角修改
修改应用不会影响当前正在运行的应用,如果要修改后的应用生效,需要重启应用(暂停后重新启动)
删除应用
与启动应用相似
1.进入首页在将要删除的应用点击查看详情
2.在查看详情中点击右上角删除,删除应用之前需要先暂停应用程序
3.删除完毕后同时删除该应用的所有API
当系统使用集群运行时,客户端会广播告诉集群环境中所有程序暂停应用
创建API
1.进入首页,在将要创建API的应用上选择API管理
2.进入API管理,选择右上角创建API
3.输入API的名字,API的描述,选择是否启用安全认证(权限认证),选择是否开启访问限制,选择是否启用前置/后置处理器然后下一步
4.输入请求Path(既用户请改该API的路径),设置API指处理某种类型的请求,选择支持用户使用什么方式请求,默认全部,添加请求参数(如果有参数VX-API会在用户请求是对参数进行检查),然后下一步
5.选择一种后端服务类型,比如选择HTTP/HTTPS,
5.1选择HTTP Method(指VX-API与后台服务交互时使用的请求方式),
5.2设置后端超时(指如果多少毫秒后,后台服务器还没响应结束),
5.3设置请求服务失败重试时间(指当存在无法连接的后台服务地址时重试该地址是否可用的时间),
5.4设置后端服务URL的URL,当有多个URL时可以负载均衡策略就会显示,显示后可以设置负载均衡的类型,以及权重,
5.5后台服务参数指第4步定义的请求参数,这些参数将会被添加到与后台交互的请求中,透传参数和常量以及系统参数都类似,都将会在与后台交互时将参数添加到请求中;然后下一步
6.选择的返回ContentType类型或者自定义输入返回ContentType类型,如果有想透传的参数可以可以添加要透传的名字
6.1设置访问限制返回值与状态码(指当开启访问限制时,如果超过限制量时返回什么状态码与内容)
6.2设置发生异常/失败返回值与状态码(指处理过程中发生了错误时返回什么状态码与内容)
6.3设置网关入口参数检查失败返回值与状态码(指处用户请求时带的参数不符合定义的参数时返回什么状态码与内容)
6.4设置无法连接上后台服务器返回值与状态码(指处当请求后台超时或者无法连接上后台服务器时返回什么状态码与内容)
6.5设置返回成功返回示例(该配置暂时没有实际作用,预留于以后生成API文档用)
6.6设置可能会发生的错误码提示定义(该配置暂时没有实际作用,预留于以后生成API文档用)
启动/暂停API
1.进入首页,在将要启动/暂停API的应用上选择API管理
2.进入API管理,选择要启动/暂停的API进入查看详情,点击右上角启动/暂停,页可以在启动应用的时候同时启动该应用的所有API
暂停API时,如果该API有正在进行中的任务,API会停止接收新任务,等到正在进行的任务执行完毕后才完全暂停
当系统使用集群运行时,客户端会广播告诉集群环境中所有程序执行相同操作
修改API
与启动API类似
1.进入首页,在将要修改API的应用上选择API管理
2.进入API管理,选择要修改的API进入查看详情,点击右上角修改按钮进行修改
修改API不会影响当前正在运行的应用,如果要修改后的API生效,需要重启API(暂停后重新启动)
删除API
与启动API类似
1.进入首页,在将要删除API的应用上选择API管理
2.进入API管理,选择要删除的API进入查看详情,点击右上角删除按钮进行删除
删除API时,如果该API有正在进行中的任务,API会停止接收新任务,等到正在进行的任务执行完毕后才完全删除
当系统使用集群运行时,客户端会广播告诉集群环境中所有程序执行暂停API
查看API请求监控信息
1.进入首页,在将要查看API的应用上选择API管理
2.进入API管理,选择要查看的API进入查看详情,拖动到底部,API请求信息追踪中点击获取数据
VX-API只记录最近100次请求的信息,大小的计算以请求body的大小计算
黑名单管理
1.进入客户端选择左上角运行状态
2.默认就可以查看现有的黑名单,也可以点击编辑就可以实现添加或者修改等,双击取消可以取消操作,双击IP对象可以删除黑名单,确定完成修改
目录说明
cert文件夹说明
一些证书相关的东西可以放在该文件夹,比如开启HTTPS应用所需要的证书就可以放在该文件夹,放在该文件中,创建应用时可以置顶由cert/开始
static文件夹说明
templates文件夹说明
日志说明
VX-API采用Log4j作为系统的日志处理文件
默认的级别显示级别为INFO可以在日志文件中修改显示的级别与显示方式
修改显示级别可以在log4j.properties文件中找到log4j.logger.com.szmirren.vxApi将INFO修改为自己想要显示级别
log4j.logger.com.szmirren.vxApi=INFO
user.json说明
user.json是客户端的用户以及客户端用户的权限,VX-API默认提供了两个用户,也可以自己添加用户
用户系统的格式为一个json里面包含key(用户名)和值(json格式),值有两个属性:用户的密码(pwd)字符串类型,和用户的权限(roles)JsonArray类型
configDB.db说明
configDB.db是一个sqlite3的数据库,该数据库是VX-API默认用来存储应用与API的,该数据库可以移动到别的地方使用(比如在另外一个地方启动或者更新版本时该数据库可以copy去新的应用使用)
用户可以不使用该数据库作为数据的存储,可以使用自己的数据库作为数据的存储,VX-API默认添加了MySQL,Oracle,SqlServer,PostgreSQL四个jar包,用户可以在conf.json中指定自己要存储的数据库类型与配置
自定义数据存储方式请参考
数据存储的方式
注意事项:VX-API并没有实现创建表所以需要自己先创建好表
conf.json说明
conf.json是VX-API的主要配置文件,conf.json中一个有5个属性,属性的值都为json格式
conf.json的基本格式:
- cliConfig:配置一些客户端操作VX-API的行动,比如启动VX-API时是否启动所有网关应用与API
- vertx:是vert.x的配置信息,既运行VX-API的环境配置
- cluster:是集群vert.x的配置信息
- verticleConfig:是VX-API的应用的环境配置
- dataConfig:是数据存储的配置信息
- clientConfig:是客户端的配置信息
-
cliConfig的配置属性如下:
- vertx的配置属性如下:
更多vert.x属性请参考 3.5.1版VertxOptions
该属性不填写时VX-API默认开启了Linux环境下的epoll优化,既:preferNativeTransport=true,其他全为默认配置
-
cluster的配置默认关闭集群,VX-API默认采用了zookeeper的集群,如果需要修改方式可以参考 修改集群的方式
集群配置属性如下
- VX-API的应用的环境就是vert.x中Verticle的DeploymentOptions配置
配置如下:
应用的环境配置,更多配置请参考 3.5.1版DeploymentOptions
-
数据存储的配置就是数据连接池的参数设置,VX-API默认使用的Druid连接池参数
配置如下:
自定义数据存储方式请参考 数据存储的方式和查看自己数据连接池实现的参数
-
客户端的配置是指管理与查看VX-API的客户端相关属性的配置
配置如下:
在VX-API中所有参数都必须指定才会提交到服务器,(透传Body时会透传Content-Type),既如果你需要用到Header的XXX参数你必须在VX-API指定或者透传,反则XXX不会到达后端服务器
入参定义
入参定义为用户请求VX-API时需要带什么参数,这些参数可以作为参数检查; (用户与VX-API的交互)
- 参数名 : 用户请求参数的名字
- 参数位置 : PATH代表参数在请求URL的Path中,HEADER代表参数在请求的header中,QUERY代表在URL的参数中
- 类型 : 代表参数的数据类型(由字符串装换为指定类型)
- 必填 : 代表用户是否必须携带这个参数,打钩为必须携带
- 默认值 : 代表如果这个参数用户没有携带,则将该参数的值设置为默认值
- 描述 : 用于描述该参数的作用(相当于注释也为后面生成API接口文档做准备)
- 编辑更多 : 用于添加更多参数的规定
- 移除 : 移除该条提示
- 透传Body : 将用户请求的Body原封不动的透传到后端服务(可以用于传json或者文件上传相关等)
- Body参数可以被Query获取 : 当Content-Type=application/x-www-form-urlencoded时,如果打钩该选项就可以将body的参数解析并添加到QUERY中,既参数位置QUERY可以获取URL中的参数也可以获取Body里面的参数
后端服务参数配置
后端服务参数配置是将入参定义参数映射为请求后端服务需要携带的参数; (VX-API与后端服务的交互)
- 后端参数名称 : 代表请求后端服务时参数的名字
- 后端参数位置 : 代表请求后端服务是参数放在什么位置,分别对应Path,header,query,body
- 对应入参名称 : 映射了入参定义的名字
- 对应入参位置 : 映射了入参定义的位置
- 对应入参类型 : 映射了入参定义的数据类型
- 操作 : 可以将该条定义移除
透传用户请求参数
VX-API的设计理念是参数不定义就不携带,使用过程中肯定有需要将用户请求的参数传到后端服务的,所有这个时候就可以使用透传用户请求参数, (VX-API与后端服务的交互)
- 请求参数名称 : 代表用户请求中参数的名字
- 请求参数位置 : 代表用户请求中参数所在位置,分别对应Path,header,query
- 后端参数名称 : 代表请求后端服务时参数的名字
- 后端参数位置 : 代表请求后端服务是参数放在什么位置,分别对应Path,header,query,body
- 操作 : 可以将该条定义移除
自定义常量参数
自定义常量参数可以定义VX-API每次请求后端服务是携带什么参数 (VX-API与后端服务的交互)
- 后端参数名称 : 代表请求后端服务时参数的名字
- 参数值 : 代表请求后端服务时参数的值
- 参数位置 : 代表请求后端服务是参数放在什么位置,分别对应Path,header,query,body
- 描述 : 用于描述该参数的作用(相当于注释也为后面生成API接口文档做准备)
- 操作 : 可以将该条定义移除
系统参数
系统参数为获取VX-API一些属性比如session id等等 (VX-API与后端服务的交互)
- 系统参数名 : VX-API属性的名字
- 后端参数名称 : 代表请求后端服务时参数的名字
- 参数位置 : 代表请求后端服务是参数放在什么位置,分别对应Path,header,query,body
- 描述 : 描述该属性是什么东西
- 操作 : 可以将该条定义移除
扩展/二次开发
项目目录结构
数据存储的方式
数据的存储方式VX-API默认使用的sqlite3数据库作为存储数据,用户可以根据common包中的VxApiDATAStoreConstant.java定义表名与列名,verticle包中的DATAVerticle.java会从该类取到要操作的表名与列名
定义如下:
应用网关存储的表结构:
- 表名 = APPLICATION_TABLE_NAME 存放网关应用的表名
- 主键列 = APPLICATION_ID_COLUMN 字符串用于存放应用网关的名字
- 内容列 = APPLICATION_ID_COLUMN json字符串用于存放应用网关的名字
应用网关属性在传输中的名字:
- 主键 = APPLICATION_ID_NAME 主键在json中的名字
- 内容 = APPLICATION_CONTENT_COLUMN 内容在json中的名字
API存储的表结构:
- 表名 = API_TABLE_NAME 存放API的表名
- 主键列 = API_ID_COLUMN 字符串用于存放API的名字
- 应用网关主键列 = API_APP_ID_COLUMN 字符串用于存放API的名字
- 内容列 = API_CONTENT_COLUMN json字符串用于存放API的名字
API属性在传输中的名字:
- 主键 = API_ID_NAME 主键在json中的名字
- 主键 = API_APP_ID_NAME 应用网关主键在json中的名字
- 内容 = API_CONTENT_NAME 内容在json中的名字
黑名单列表的表结构:
- 表名 = BLACKLIST_TABLE_NAME 存放网关应用的黑名单的表名
- 主键列 = BLACKLIST_ID_COLUMN 字符串用于存放应用网关黑名单主键的名字
- 内容列 = BLACKLIST_ID_COLUMN json数组字符串用于存放应用网关黑名单内容的名字
黑名单列表在传输中的名字:
- 主键 = BLACKLIST_ID_NAME 黑名单主键在json中的名字
- 内容 = BLACKLIST_CONTENT_COLUMN 黑名单内容在json中的名字
假设现在我要将数据存储在MySQL中,我可以定义一个应用表,表名叫my_application,主键列名叫id,内容列名叫content;
这个时候你就可以将APPLICATION_TABLE_NAME赋值为my_application , APPLICATION_ID_COLUMN赋值为id ,
APPLICATION_ID_COLUMN赋值为content ,
或者直接创建的时候就才用APPLICATION_TABLE_NAME等的默认值,最后在conf.json中配置数据库的连接地址用户密码等, 可以参考
数据存储配置
就可以完成数据存储的修改;
自定义服务处理器(中心处理器)
自定义处理器可以在com.szmirren.vxApi.spi.customHandler.impl包中创建一个类并实现com.szmirren.vxApi.spi.customHandler包中VxApiCustomHandler.java接口
当这个类实现后可以在com.szmirren.vxApi.spi.customHandler包的VxApiCustomHandlerFactory.java工厂类的getImplNames方法中添加一个名字,用于获取列表(这并不是必须的,只是标准规范),
并在getCustomHandler方法中添加一个判断与返回该类,getCustomHandler一共有4个参数,分别为:
- name 处理器在工厂中的名字
- options 处理器的配置文件
- api API相关配置文件
- httpClient http的客户端
可以根据参考包里的默认实现定制自己的服务类型
完成以上实现后可以添加客户端的选择,在资源目录static中找到CreateAPI.html在里面搜索id为custom_server_type的select标签,并在里面添加一个标签
如果需要当选择该实现类时配置一些默认值可以在资源目录static/js中找到APISelectChange.js找到注释为//后端服务类型改变事件 的改变事件中添加一个判断便可
权限认证处理器
权限认证处理器可以在com.szmirren.vxApi.spi.auth.impl包中创建一个类并实现com.szmirren.vxApi.spi.auth包中VxApiAuth.java接口
当这个类实现后可以在com.szmirren.vxApi.spi.auth包的VxApiAuthFactory.java工厂类的getImplNames方法中添加一个名字,用于获取列表(这并不是必须的,只是标准规范),
并在getVxApiAuth方法中添加一个判断与返回该类,getVxApiAuth一共有4个参数,分别为:
- name 处理器在工厂中的名字
- options 处理器的配置文件
- api API相关配置文件
- httpClient http的客户端
可以根据参考包里的默认实现定制自己的权限认证
完成以上实现后可以添加客户端的选择,在资源目录static中找到CreateAPI.html在里面搜索id为auth-options-name的select标签,并在里面添加一个标签
如果需要当选择该实现类时配置一些默认值可以在资源目录static/js中找到APISelectChange.js找到注释为//权限认证改变事件 的改变事件中添加一个判断便可
前置处理器
权限认证处理器可以在com.szmirren.vxApi.spi.handler.impl包中创建一个类并实现com.szmirren.vxApi.spi.handler包中VxApiBeforeHandler.java接口
当这个类实现后可以在com.szmirren.vxApi.spi.handler包的VxApiBeforeHandlerFactory.java工厂类的getImplNames方法中添加一个名字,用于获取列表(这并不是必须的,只是标准规范),
并在getBeforeHandler方法中添加一个判断与返回该类,getBeforeHandler一共有4个参数,分别为:
- name 处理器在工厂中的名字
- options 处理器的配置文件
- api API相关配置文件
- httpClient http的客户端
可以根据参考包里的默认实现定制自己的权限认证
完成以上实现后可以添加客户端的选择,在资源目录static中找到CreateAPI.html在里面搜索id为beforeHandler的select标签,并在里面添加一个标签
如果需要当选择该实现类时配置一些默认值可以在资源目录static/js中找到APISelectChange.js找到注释为//前置处理器改变事件 的改变事件中添加一个判断便可
后置处理器
权限认证处理器可以在com.szmirren.vxApi.spi.handler.impl包中创建一个类并实现com.szmirren.vxApi.spi.handler包中VxApiAfterHandler.java接口
当这个类实现后可以在com.szmirren.vxApi.spi.handler包的VxApiAfterHandlerFactory.java工厂类的getImplNames方法中添加一个名字,用于获取列表(这并不是必须的,只是标准规范),
并在getAfterHandler方法中添加一个判断与返回该类,getAfterHandler一共有4个参数,分别为:
- name 处理器在工厂中的名字
- options 处理器的配置文件
- api API相关配置文件
- httpClient http的客户端
可以根据参考包里的默认实现定制自己的权限认证
完成以上实现后可以添加客户端的选择,在资源目录static中找到CreateAPI.html在里面搜索id为afterHandler的select标签,并在里面添加一个标签
如果需要当选择该实现类时配置一些默认值可以在资源目录static/js中找到APISelectChange.js找到注释为//后置处理器改变事件 的改变事件中添加一个判断便可
修改集群的方式
vert.x集群方式可以参考
Vert.x Clustering
第一步:在配置文件conf.json的cluster:{clusterType}中指定集群的名字
第二步:在com.szmirren.vxApi.cluster.VxApiClusterManagerFactory.java的getClusterManager方法中找到判断配置的名字并获取实例