概述

VX-API-Gateway(以下称为VX-API)是基于Vert.x 3.5.1(java)开发的API网关,是一个分布式、全异步、高性能、可扩展、轻量级的API网关 下载压缩包之后,将其解压缩到任意目录即可看到以下(压缩版的)目录结构:

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 缓存/临时文件

进入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,相当于设置了一个运行环境

cd D:/java/jreXXX/bin
%JAVACMD% %JAVA_OPTS% -Dfile.encoding=UTF-8 ...
                 
启动完毕后控制台会提示启动是否成功,也可以通过浏览器输入http://localhost:5256/进行查看,客户端的默认连接端口为5256,可以在conf/conf.json配置文件中指定客户端运行的端口;
可以在配置文件中指定以单节点启动还是以集群的方式启动详情查看 配置文件说明

应用可以理解为分组,是VX-AP中的一个运行单元,一个应用相当于一个服务器(Server)不同的是他的端口号允许被重复使用,也就是说在VX-API中一个端口号可以给任意应用绑定(前提是这个端口号没有被别的程序绑定),应用用于管理API
访问http://localhost:端口号(默认5256)/static/Application.html或者通过http://localhost:端口号(默认5256)进入后便可以查看与管理应用

API是VX-API的服务核心,创建应用后便可以在应用的API管理中创建API;
当前版本中API支持三种服务类型,
  1. HTTP/HTTPS服务(既VX-API需要去请到后台服务器的类型):参数检查与透传,支持带权重的负载均衡访问策略,轮询与IP哈希化,自动断路与重试不可用的后台服务地址
  2. 页面跳转服务:当用户访问时redirect到指定页面
  3. 自定义服务:可以自定义任意服务,当前版本中实现了,基于session-token的认证授权,获取服务器时间戳,与获取常量
同时API支持全局黑名单,流量限制,权限认证,自定义前置/后置处理器等
执行流程图
绿线代表一定会执行,黑线代表当存在时执行,当用户请求的时候,完整的流程按组件顺序由1开始执行到7,如果不满足任意一个组件时请求结束并响应(fail-end-response),当任意组件出现异常时统一进入异常组件(Exception Handler)请求结束并响应错误信息
更多API的执行流程介绍参考下方API组件介绍
  1. 黑名单检查

    该组件永远会被执行! 用户请求时第一步先经过黑名单检查,VX-API会读取请求中的remote Address并获取用户的host(也就是获取用户的IP地址),如果用户的IP地址在全局黑名单中,结束请求并响应状态码:404,状态信息:you can't access this service;反则继续执行处理...

  2. 访问限制

    当创建API时开启了访问限制,该组件会被执行! 访问限制单位分别为:天/小时/分;可以设置API与IP限制,IP的限制不能大于API的限制;
    假设开启API限制:1分钟可以访问1000次;如果1分钟内访问次数大于1000将结束请求并响应请求(响应内容为:创建API中定义API返回结果:访问限制返回);反则继续执行处理...

  3. 参数检查

    当创建API时如果在定义API请求中添加了入参定义,该组件会被执行! 组件会根据入参定义规定的格式检查请求中的参数;
    如果参数不符合入参定义结束请求并响应请求(响应内容为:创建API中定义API返回结果:网关入口参数检查失败返回);反则继续执行处理...

  4. 权限认证

    当创建API时开启了安全认证,该组件会被执行! 组件会将流程交给权限认证插件,权限认证插件负责做相关处理后决定将流程交给下一个组件处理或结束请求

  5. 前置处理器

    当创建API时开启了前置处理器,该组件会被执行! 组件会将流程交给前置处理器插件,前置处理器插件负责做相关处理后决定将流程交给下一个组件处理或结束请求

  6. 中心处理器(主处理器)

    当前面的组件都执行通过时,该组件永远会被执行! 组件会根据服务类型做相应的处理,处理完毕后组件会判断是否开启了后置处理器,如果开启了后置处理器,组件会将流程交给后置处理器,并传递一个标识告诉后置处理器当前组件处理的结果;反则结束请求并返回服务结果;

  7. 后置处理器

    当创建API时开启了后置处理器,该组件会被执行! 该组件是正常流程的最后一个组件,组件会收到主处理器的执行结果,组件做完相应操作后必须做对请求的响应用户的请求;

  8. 异常处理器

    当以上任意组件在执行的过程中出现了异常,该组件会被执行! 组件会结束请求并响应请求(响应内容为:创建API中定义API返回结果:发生异常/失败返回);

黑名单对象是用户IP地址,当用户请求VX-API时第一步先经过黑名单检查,VX-API会读取请求中的remote Address并获取用户的host(也就是获取用户的IP地址),如果用户的IP地址在全局黑名单中,结束请求并响应状态码:404,状态信息:you can't access this service;

VX-API客户端

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

{
    "VXAdmin": {
        "pwd": "hivx",
        "roles": ["write","read"]
        },
    "VXOps": {
        "pwd": "hivx",
        "roles": ["read"]
        }
}
当进入应用客户端时,VX-API会向浏览器发送一个401的并告诉浏览器WWW-Authenticate,浏览器会出现一个输入账户与密码的页面,用户输入正确的账号密码后便可以进入客户端;

点击右上角的退出便可以退出客户端

管理应用与API

一个应用相当于一个分组,与服务一样一个应用就是服务项目,以便于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 当系统使用集群运行时,客户端会广播告诉集群环境中所有程序暂停应用
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文档用)
1.进入首页,在将要启动/暂停API的应用上选择API管理 2.进入API管理,选择要启动/暂停的API进入查看详情,点击右上角启动/暂停,页可以在启动应用的时候同时启动该应用的所有API
暂停API时,如果该API有正在进行中的任务,API会停止接收新任务,等到正在进行的任务执行完毕后才完全暂停 当系统使用集群运行时,客户端会广播告诉集群环境中所有程序执行相同操作
与启动API类似
1.进入首页,在将要修改API的应用上选择API管理
2.进入API管理,选择要修改的API进入查看详情,点击右上角修改按钮进行修改
修改API不会影响当前正在运行的应用,如果要修改后的API生效,需要重启API(暂停后重新启动)
与启动API类似
1.进入首页,在将要删除API的应用上选择API管理
2.进入API管理,选择要删除的API进入查看详情,点击右上角删除按钮进行删除
删除API时,如果该API有正在进行中的任务,API会停止接收新任务,等到正在进行的任务执行完毕后才完全删除 当系统使用集群运行时,客户端会广播告诉集群环境中所有程序执行暂停API
1.进入首页,在将要查看API的应用上选择API管理
2.进入API管理,选择要查看的API进入查看详情,拖动到底部,API请求信息追踪中点击获取数据 VX-API只记录最近100次请求的信息,大小的计算以请求body的大小计算
1.进入客户端选择左上角运行状态

2.默认就可以查看现有的黑名单,也可以点击编辑就可以实现添加或者修改等,双击取消可以取消操作,双击IP对象可以删除黑名单,确定完成修改

配置文件说明


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     一些说明
            
一些证书相关的东西可以放在该文件夹,比如开启HTTPS应用所需要的证书就可以放在该文件夹,放在该文件中,创建应用时可以置顶由cert/开始

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    修改应用的模板
            
VX-API采用Log4j作为系统的日志处理文件 默认的级别显示级别为INFO可以在日志文件中修改显示的级别与显示方式
修改显示级别可以在log4j.properties文件中找到log4j.logger.com.szmirren.vxApi将INFO修改为自己想要显示级别
log4j.logger.com.szmirren.vxApi=INFO

{
    "VXAdmin": {     用户名
        "pwd": "hivx",   用户密码
        "roles": ["write","read"]  用户的权限:写与读
        },
    "VXOps": {
        "pwd": "hivx",
        "roles": ["read"]
        }
}
user.json是客户端的用户以及客户端用户的权限,VX-API默认提供了两个用户,也可以自己添加用户
用户系统的格式为一个json里面包含key(用户名)和值(json格式),值有两个属性:用户的密码(pwd)字符串类型,和用户的权限(roles)JsonArray类型
configDB.db是一个sqlite3的数据库,该数据库是VX-API默认用来存储应用与API的,该数据库可以移动到别的地方使用(比如在另外一个地方启动或者更新版本时该数据库可以copy去新的应用使用)
用户可以不使用该数据库作为数据的存储,可以使用自己的数据库作为数据的存储,VX-API默认添加了MySQL,Oracle,SqlServer,PostgreSQL四个jar包,用户可以在conf.json中指定自己要存储的数据库类型与配置
自定义数据存储方式请参考 数据存储的方式 注意事项:VX-API并没有实现创建表所以需要自己先创建好表

conf.json是VX-API的主要配置文件,conf.json中一个有5个属性,属性的值都为json格式

conf.json的基本格式:

{
    "cliConfig": {},
    "vertx": {},
    "cluster": {},
    "verticleConfig" :{},
    "dataConfig": {},
    "clientConfig": {}
}
  1. cliConfig:配置一些客户端操作VX-API的行动,比如启动VX-API时是否启动所有网关应用与API
  2. vertx:是vert.x的配置信息,既运行VX-API的环境配置
  3. cluster:是集群vert.x的配置信息
  4. verticleConfig:是VX-API的应用的环境配置
  5. dataConfig:是数据存储的配置信息
  6. clientConfig:是客户端的配置信息
  1. cliConfig的配置属性如下:
    
    start配置的优先顺序startEverything > startAllAPP > startAPPEverything > startAPP,既满足其中一个后面的都不会再执行
    startEverything : 是否启动所有网关应用跟网关应用的所有API 默认false
    startAllAPP : 是否启动所有网关应用(不启动API) true|false  默认false
    startAPPEverything : 启动指定的网关应用并启动其所有的API  JsonArray["应用网关的名字",...]
    startAPP : 启动指定的网关应用(不启动API)  JsonArray["应用网关的名字",...]
                                
  2. vertx的配置属性如下:
    
    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
    
    更多vert.x属性请参考 3.5.1版VertxOptions 该属性不填写时VX-API默认开启了Linux环境下的epoll优化,既:preferNativeTransport=true,其他全为默认配置
  3. cluster的配置默认关闭集群,VX-API默认采用了zookeeper的集群,如果需要修改方式可以参考 修改集群的方式
    集群配置属性如下
    
    {
    "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   最大重试次数
                }
        }
    }
    
  4. VX-API的应用的环境就是vert.x中Verticle的DeploymentOptions配置
    配置如下:
    
    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格式
                            
    应用的环境配置,更多配置请参考 3.5.1版DeploymentOptions
  5. 数据存储的配置就是数据连接池的参数设置,VX-API默认使用的Druid连接池参数
    配置如下:
    
    url : 数据库 JDBC 连接地址
    driver_clas : JDBC 驱动
    user : 数据库用户名
    password : 数据库密码
    initial_pool_size : 连接池初始连接数, 默认1
    max_pool_size : 连接池最大连接数, 默认15
    min_pool_size : 连接池最小连接数, 默认1
    max_idle_time : 空闲连接保留时间, 默认60000
                            
    自定义数据存储方式请参考 数据存储的方式和查看自己数据连接池实现的参数
  6. 客户端的配置是指管理与查看VX-API的客户端相关属性的配置
    配置如下:
    clientPort : VX-API客户端服务端口,默认5256

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
  • 描述 : 描述该属性是什么东西
  • 操作 : 可以将该条定义移除

扩展/二次开发

                        
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
                        
                    
数据的存储方式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标签,并在里面添加一个标签
<option value="实现类在工厂中的名字">想要显示的名字</option>
如果需要当选择该实现类时配置一些默认值可以在资源目录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标签,并在里面添加一个标签
<option value="实现类在工厂中的名字">想要显示的名字</option>
如果需要当选择该实现类时配置一些默认值可以在资源目录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标签,并在里面添加一个标签
<option value="实现类在工厂中的名字">想要显示的名字</option>
如果需要当选择该实现类时配置一些默认值可以在资源目录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标签,并在里面添加一个标签
<option value="实现类在工厂中的名字">想要显示的名字</option>
如果需要当选择该实现类时配置一些默认值可以在资源目录static/js中找到APISelectChange.js找到注释为//后置处理器改变事件 的改变事件中添加一个判断便可
vert.x集群方式可以参考 Vert.x Clustering
第一步:在配置文件conf.json的cluster:{clusterType}中指定集群的名字
第二步:在com.szmirren.vxApi.cluster.VxApiClusterManagerFactory.java的getClusterManager方法中找到判断配置的名字并获取实例

其他

源码托管地址: github gitee 码云
开源协议: MIT 详细介绍 MIT 协议

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.
                
Mirren是作者的英文名虽然作者因为很烂不过这是作者的名字,现居深圳,所以github上用的是shenzhenMirren
EliMirren(MirrenTools)是作者自己的一个小工具集,用于发布作者开发的工具,EliMirren(以利米伦)意思为上帝祝福你!
后台服务输出hello
Nginx Stable1.12.0 配置


阿里云 centos 7 1G内存1核1兆带宽环境 ab -n 1000 -c 1000 执行结果
Nginx:ab结果

VX-API: JVM -Xms512m -Xmx512m 其他默认 ab结果


Windows 10 8核8G内存 环境 ab -n 100000 -c 2000 执行结果
Nginx:ab结果

VX-API: JVM -Xms2G -Xmx2G 其他默认 ab结果