use of com.szmirren.vxApi.core.entity.VxApis in project VX-API-Gateway by EliMirren.
the class VxApiApplication method addRoute.
/**
* 添加一个路由
*
* @param msg
*/
public void addRoute(Message<JsonObject> msg) {
JsonObject body = msg.body().getJsonObject("api");
VxApisDTO dto = VxApisDTO.fromJson(body);
if (dto != null) {
VxApis api = new VxApis(dto);
// 是否代理启动API到当前应用
boolean otherRouteAdd = msg.body().getBoolean("elseRouteToThis", false);
if (otherRouteAdd) {
// 服务器的类型1=http,2=https,3=webSocket
int type = msg.body().getInteger("serverType", 0);
if (type == 1) {
addHttpRouter(api, res -> {
if (res.succeeded()) {
msg.reply(1);
} else {
msg.fail(500, res.cause().getMessage());
}
});
} else if (type == 2) {
addHttpsRouter(api, res -> {
if (res.succeeded()) {
msg.reply(1);
} else {
msg.fail(500, res.cause().getMessage());
res.cause().printStackTrace();
}
});
} else {
msg.fail(500, "不存在的服务");
}
} else {
// 本应用添加API,既属于自己的网关应用添加API
if (httpRouter != null && httpsRouter != null) {
Future<Boolean> httpFuture = Future.future(http -> addHttpRouter(api, http));
Future<Boolean> httpsFuture = Future.<Boolean>future(https -> addHttpsRouter(api, https));
CompositeFuture.all(httpFuture, httpsFuture).setHandler(res -> {
if (res.succeeded()) {
msg.reply(1);
} else {
msg.fail(500, res.cause().getMessage());
}
});
} else if (httpRouter != null) {
addHttpRouter(api, res -> {
if (res.succeeded()) {
msg.reply(1);
} else {
msg.fail(500, res.cause().getMessage());
}
});
} else if (httpsRouter != null) {
addHttpsRouter(api, res -> {
if (res.succeeded()) {
msg.reply(1);
} else {
msg.fail(500, res.cause().getMessage());
}
});
} else {
msg.fail(404, "找不到的服务器可以加载API");
}
}
} else {
msg.fail(1400, "API参数不能为null,请检查APIDTO需要实例化的JSON编写是否正确");
}
}
use of com.szmirren.vxApi.core.entity.VxApis in project VX-API-Gateway by EliMirren.
the class VxApiApplication method addRouteToRouter.
/**
* 通用给Router添加route
*
* @param api
* 配置信息
* @param router
* 要添加的router
* @param routeMaps
* 要添加的route集合
* @param result
* 结果
*/
public void addRouteToRouter(VxApis api, Router router, Map<String, List<Route>> routeMaps, Handler<AsyncResult<Boolean>> result) {
vertx.executeBlocking(fut -> {
// 存储部署的路由
List<Route> routes = new ArrayList<>();
// 流量限制处理器
if (api.getLimitUnit() != null) {
// 权限认证的route;
Route limitRoute = router.route();
initApiLimit(api, limitRoute);
routes.add(limitRoute);
}
// 入口参数检查
if (api.getEnterParam() != null) {
// 权限认证的route;
Route checkRoute = router.route();
initParamCheck(api, checkRoute);
routes.add(checkRoute);
}
// 认证处理器
if (api.getAuthOptions() != null) {
// 权限认证的route;
Route authRoute = router.route();
try {
initAuthHandler(api, authRoute);
routes.add(authRoute);
} catch (Exception e) {
authRoute.remove();
// 清空已经成功的路由
routes.forEach(r -> r.remove());
LOG.error("添加权限认证-->失败:" + e);
fut.fail(e);
return;
}
}
// 前置处理器
if (api.getBeforeHandlerOptions() != null) {
// 前置处理器的route;
Route beforeRoute = router.route();
try {
initBeforeHandler(api, beforeRoute);
routes.add(beforeRoute);
} catch (Exception e) {
LOG.error("添加前置处理器-->失败:" + e);
beforeRoute.remove();
// 清空已经成功的路由
routes.forEach(r -> r.remove());
fut.fail(e);
return;
}
}
// 检查是否有后置处理器,有next给后置处理器,如果没有则response
boolean isAfterHandler = api.getAfterHandlerOptions() != null;
// 添加与后台交互的中心处理器
Route serverRoute = router.route();
try {
initServerHandler(isAfterHandler, api, serverRoute);
routes.add(serverRoute);
} catch (Exception e) {
LOG.error("添加服务处理器-->失败:" + e);
serverRoute.remove();
// 清空已经成功的路由
routes.forEach(r -> r.remove());
fut.fail(e);
return;
}
// 后置处理器
if (isAfterHandler) {
// 前置处理器的route;
Route afterRoute = router.route();
try {
initAfterHandler(api, afterRoute);
routes.add(afterRoute);
} catch (Exception e) {
LOG.error("添加后置处理器-->失败:" + e);
afterRoute.remove();
// 清空已经成功的路由
routes.forEach(r -> r.remove());
fut.fail(e);
return;
}
}
// 添加异常处理器
Route exRoute = router.route();
initExceptionHanlder(api, exRoute);
routes.add(exRoute);
routeMaps.put(api.getApiName(), routes);
fut.complete();
if (LOG.isDebugEnabled()) {
LOG.debug(appName + ": 服务器创建API成功");
}
}, result);
}
Aggregations