VX-API-Gateway/
├── bin/
│ ├── start.bat
│ └── start.sh
├── conf/
│ ├── cert/
│ ├── static/
│ │ ├── css/
│ │ ├── js/
│ │ ├── *.html
│ │ └── logo.png
│ ├── templates/
│ │ └── *.ftl
│ ├── conf.json
│ ├── configDB.db
│ ├── log4j.properties
│ ├── log4j2-test.xml
│ ├── log4j2.xml
│ ├── user.json
│ └── *.txt
├── lib/
│ └── *.jar
├── logs/
│ ├── error/
│ ├── warn/
│ └── info/
└── temp/
├── file-cache
└── file-uploads
bin 执行脚本
conf 配置文件与客户端静态文件
lib 项目依赖的架包
logs 日志文件
temp 缓存/临时文件
cd D:/java/jreXXX/bin
%JAVACMD% %JAVA_OPTS% -Dfile.encoding=UTF-8 ...
应用可以理解为分组,是VX-AP中的一个运行单元,一个应用相当于一个服务器(Server)不同的是他的端口号允许被重复使用,也就是说在VX-API中一个端口号可以给任意应用绑定(前提是这个端口号没有被别的程序绑定),应用用于管理API
访问http://localhost:端口号(默认5256)/static/Application.html或者通过http://localhost:端口号(默认5256)进入后便可以查看与管理应用
该组件永远会被执行! 用户请求时第一步先经过黑名单检查,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修改为你要的端口号便可
{
"VXAdmin": {
"pwd": "hivx",
"roles": ["write","read"]
},
"VXOps": {
"pwd": "hivx",
"roles": ["read"]
}
}
点击右上角的退出便可以退出客户端
一个应用相当于一个分组,与服务一样一个应用就是服务项目,以便于API的管理;VX-API中先有应用后有API,所以需要先创建应用再创建API
VX-API-Gateway/
├── conf/ 配置文件目录
│ ├── cert/ 存放SSL相关证书
│ ├── static/ 存放静态文件
│ │ ├── css/ 存放css文件
│ │ ├── js/ 存放js文件
│ │ ├── *.html 存放html文件
│ │ └── logo.png VX-API的logo
│ ├── templates/ 存放模板文件
│ │ └── *.ftl freemaker的html的模板
│ ├── conf.json VX-API配置文件
│ ├── configDB.db sqlite3数据库,存放VX-API应用 API 黑名单列表
│ ├── log4j.properties 一些框架依赖的日志日志文件
│ ├── log4j2-test.xml VX-API使用的日志文件测试模式
│ ├── log4j2.xml VX-API使用的日志文件正式模式
│ ├── user.json VX-API客户端用户
│ └── *.txt 一些说明
VX-API-Gateway/
├── conf/ 配置文件目录
├── static/ 存放静态文件
static/
css/ 存放css文件
├─ main.css 客户端所有页面的css样式
├─ page.css 客户端所有分页组件的css样式
js/ 存放js文件
├─ APISelectChange.js 该js为创建/修改API时select控件的改变事件
├─ createAPP.js 该js为创建与修改应用所需要的js文件
├─ main.js 该js为创建与修改API所需要的js文件
├─ page.js 该js为客户端所有分页组件
API.html 该页面为API管理页面
Application.html 该页面为应用管理页面,也是首页
CreateAPI.html 该页面为创建API页面
CreateAPP.html 该页面为创建应用页面
SysInfos.html 该页面为系统运行信息页面与黑名单管理页面
logo.png VX-API的logo
VX-API-Gateway/
├── conf/ 配置文件目录
├── templates/ 存放freemaker模板文件的目录
templates/
getAPI.ftl 查看API的模板
getAPP.ftl 查看应用的模板
updateAPI.ftl 修改API的模板
updateAPP.ftl 修改应用的模板
log4j.logger.com.szmirren.vxApi=INFO
{
"VXAdmin": { 用户名
"pwd": "hivx", 用户密码
"roles": ["write","read"] 用户的权限:写与读
},
"VXOps": {
"pwd": "hivx",
"roles": ["read"]
}
}
conf.json是VX-API的主要配置文件,conf.json中一个有5个属性,属性的值都为json格式
{
"cliConfig": {},
"vertx": {},
"cluster": {},
"verticleConfig" :{},
"dataConfig": {},
"clientConfig": {}
}
start配置的优先顺序startEverything > startAllAPP > startAPPEverything > startAPP,既满足其中一个后面的都不会再执行
startEverything : 是否启动所有网关应用跟网关应用的所有API 默认false
startAllAPP : 是否启动所有网关应用(不启动API) true|false 默认false
startAPPEverything : 启动指定的网关应用并启动其所有的API JsonArray["应用网关的名字",...]
startAPP : 启动指定的网关应用(不启动API) JsonArray["应用网关的名字",...]
eventLoopPoolSize : Vert.x实例中使用的Event Loop线程的数量,默认值为:2 * Runtime.getRuntime().availableProcessors()可用的处理器个数;
workerPoolSize : Vert.x实例中支持的Worker线程的最大数量,默认值为20;
internalBlockingPoolSize : 内部阻塞线程池最大线程数,这个参数主要被Vert.x的一些内部操作使用,默认值为20;
blockedThreadCheckInterval : 阻塞线程检查的时间间隔,默认1000,单位ms,即1秒;
maxEventLoopExecuteTime : Event Loop的最大执行时间,默认2 * 1000 * 1000000,单位ns,即2秒;
maxWorkerExecuteTime : Worker线程的最大执行时间,默认60 * 1000 * 1000000,单位ns,即60秒;
haEnabled : 是否支持HA架构,默认值false;
quorumSize : 【HA模式有效】支持了HA模式过后,此方法设置冲裁节点的数量,默认值1;
haGroup : 【HA模式有效】支持了HA模式过后,可根据不同的组名将Vert.x进行逻辑分组,此方法设置当前Vert.x的逻辑组名,默认DEFAULT;
warningExceptionTime : 如果线程阻塞时间超过了这个阀值,那么就会打印警告的堆栈信息,默认为5 * 1000 * 1000000,单位ns,即5秒;
preferNativeTransport : 在unix环境下是否使用epoll优化,默认值false
{
"clusterType" : 使用集群的模式,默认NONE(不使用集群)/zookeeper
"getVxApiConfFromCluster" : 是否从集群环境获取VX-API的配置信息,默认false
"clusterConf" : 集群的配置文件JSON格式:
{
"zookeeperHosts": "127.0.0.1", 连接端口
"sessionTimeout": 20000, 会话超时时间
"connectTimeout": 3000, 连接超时时间
"rootPath": "io.vertx", 集群环境vert.x的数据存储节点
"vxApiConfPath":"/io.vertx/vx.api.gateway/conf", //集群时存储conf.json的节点
"retry": { 重试策略
"initialSleepTime": 100, 基本重试时间差
"intervalTimes": 10000, 最大重试时间
"maxTimes": 5 最大重试次数
}
}
}
worker : 是否设置为worker verticle, 默认false
multiThreaded : 是否设置为多线程worker verticle, 默认false
isolationGroup : 设置隔离组,被VX-API设置为应用的名字
workerPoolName : 设置worker线程池的名字
workerPoolSize : 设置worker线程池的大小, 默认20
ha : 设置是否启用高可用, 默认false
instances : 设置应用的实例数量, 默认1
maxWorkerExecuteTime : 设置worker的最大执行时间, 以ns为单位,默认60000000000
extraClasspath : 额外的classPath, JsonArray格式
isolatedClasses : 设置隔离组, JsonArray格式
url : 数据库 JDBC 连接地址
driver_clas : JDBC 驱动
user : 数据库用户名
password : 数据库密码
initial_pool_size : 连接池初始连接数, 默认1
max_pool_size : 连接池最大连接数, 默认15
min_pool_size : 连接池最小连接数, 默认1
max_idle_time : 空闲连接保留时间, 默认60000
clientPort : VX-API客户端服务端口,默认5256
在VX-API中所有参数都必须指定才会提交到服务器,(透传Body时会透传Content-Type),既如果你需要用到Header的XXX参数你必须在VX-API指定或者透传,反则XXX不会到达后端服务器
src/
├── mian/java/
│ └── com.szmirren.vxApi/
│ ├── core/ 核心代码包
│ │ ├── auth/ 客户端权限认证
│ │ ├── common/ 一些通用的工具与常量
│ │ ├── entity/ 存放实体类
│ │ ├── enums/ 存放枚举类
│ │ ├── handler/ verticle包中verticle所需要的一些实现
│ │ │ ├── freemarker/ 重写了FreeMarker模板的实现
│ │ │ └── route/ API所需的处理器接口与实现
│ │ ├── options/ 实体类的配置文件与传输转换
│ │ ├── verticle/ VX-API的核心类既运行单位,包含了客户端与数据获取系统信息与应用和API的管理
│ │ ├── VxApiLauncher.java VX-API的启动器
│ │ └── VxApiMain.java/ VX-API的入口
│ ├── cluster/ 定义了集群的接口与集群的实现与获取
│ │ ├── impl/ 实现类包
│ │ │ └── VxApiClusterConfigZookeeperImpl.java 默认的zookeeper实现
│ │ ├── VxApiClusterConfig.java 集群获取配置文件的接口
│ │ └── VxApiClusterConfigFactory.java 获取集群配置的工厂类
│ └── spi/ 给用户扩展的包
│ ├── auth/ 权限认证处理器
│ │ ├──impl/ 认证处理器的接口的实现包
│ │ │ └──VxApiAuthSessionTokenImpl.java 默认的session-token实现
│ │ ├── VxApiAuth.java 认证处理器的接口
│ │ ├── VxApiAuthFactory.java 认证处理器工厂类
│ │ └── VxApiAuthOptions.java 认证处理器配置文件
│ ├── common/ spi中一些可以通用的东西
│ │ └── HttpHeaderConstant.java 常量类
│ ├── customHandler/ 自定义服务处理器
│ │ ├──impl/ 自定义服务处理器的默认实现
│ │ │ ├──GetConstantValueHandler.java 获得自定义常量值返回
│ │ │ ├──GetServerUnixTimestampHandler.java 获得服务器unix时间戳返回
│ │ │ └──SessionTokenGrantAuthHandler.java session-token认证授权
│ │ ├── VxApiCustomHandler.java 自定义服务处理器的接口
│ │ ├── VxApiCustomHandlerFactory.java 自定义服务处理器工厂类
│ │ └── VxApiCustomHandlerOptions.java 自定义服务处理器配置文件
│ └── handler/ 前置与后置处理器
│ ├──impl/ 认证处理器的接口的实现包
│ │ ├──TestAfterHandlerSimple.java 后置处理器的示例
│ │ └──TestBeforeHandlerSimple.java 前置处理器的示例
│ ├── VxApiAfterHandler.java 后置处理器的接口
│ ├── VxApiAfterHandlerFactory.java 后置处理器的工厂类
│ ├── VxApiAfterHandlerOptions.java 后置处理器的配置文件
│ ├── VxApiBeforeHandler.java 前置处理器的接口
│ ├── VxApiBeforeHandlerFactory.java 前置处理器工厂类
│ └── VxApiBeforeHandlerOptions.java 前置处理器配置文件
└── mian/resources/ 资源文件
├── cert/ 存放证书相关的文件夹
├── static/ 存放客户端静态文件夹
│ ├── css/ css文件夹
│ ├── js/ js文件夹
│ ├── *.html html文件
│ └── logo.png logo
├── templates/ 模板文件夹
│ └── *.ftl Freemarker模板
├── conf.json 主配置文件
├── configDB.db 数据文件存储
├── log4j.properties 日志配置文件
├── user.json 一些说明文件
└── *.txt
<option value="实现类在工厂中的名字">想要显示的名字</option>
<option value="实现类在工厂中的名字">想要显示的名字</option>
<option value="实现类在工厂中的名字">想要显示的名字</option>
<option value="实现类在工厂中的名字">想要显示的名字</option>
MIT License
Copyright (c) 2017 MirrenTools
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.