网关调度介绍.md
7.01 KB
网关调度机制介绍
概述
AppController.java 是 MicroCommunity 项目的统一网关入口控制器,主要负责接收所有HTTP请求并通过服务编码(service参数)将请求分发到相应的子服务。该控制器采用命令驱动架构设计,支持GET、POST、PUT、DELETE等多种HTTP方法。
核心入口方法
1. servicePost 方法
@RequestMapping(path = "/{service:.+}", method = RequestMethod.POST)
public ResponseEntity<String> servicePost(@PathVariable String service,
@RequestBody String postInfo,
HttpServletRequest request)
2. serviceGet 方法
@RequestMapping(path = "/{service:.+}", method = RequestMethod.GET)
public ResponseEntity<String> serviceGet(@PathVariable String service,
HttpServletRequest request)
请求处理流程
1. 头信息封装
- 调用
getRequestInfo()方法初始化请求头信息 - 从HttpServletRequest中提取用户信息、token等
- 封装标准化的请求头信息到Map中
2. 服务编码解析
service参数作为服务编码放入头信息:headers.put(CommonConstant.HTTP_SERVICE, service)- 请求方法标识:
headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_POST/GET) - 服务编码格式示例:
user.listUser、community.queryCommunities
3. 权限校验
// 通过IPrivilegeSMO进行权限校验
privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + service);
- 校验用户是否有访问该接口的权限
- 基于菜单权限配置进行访问控制
4. 服务调用
// POST请求调用
responseEntity = apiSMOImpl.doApi(postInfo, headers, request);
// GET请求调用
responseEntity = apiSMOImpl.doApi(JSONObject.toJSONString(getParameterStringMap(request)), headers, request);
核心组件说明
1. IApiSMO 接口
public interface IApiSMO {
ResponseEntity<String> doApi(String body, Map<String, String> headers, HttpServletRequest request);
}
作用:服务调用入口,负责校验员工访问权限并转发请求
实现类:ApiSMOImpl
- 校验员工与商户的关系权限
- 重写用户ID和商户ID到请求头
- 调用IApiServiceSMO进行最终服务分发
2. IPrivilegeSMO 接口
public interface IPrivilegeSMO {
void hasPrivilege(RestTemplate restTemplate, IPageData pd, String resource);
}
作用:权限校验,验证用户是否有访问特定资源的权限
实现类:BootPrivilegeSMOImpl
- 继承DefaultAbstractComponentSMO
- 调用父类的hasPrivilege方法进行权限验证
3. IApiServiceSMO 接口
public interface IApiServiceSMO {
ResponseEntity<String> service(String reqJson, Map<String, String> headers);
}
作用:最终的服务分发核心,负责完整的请求处理流程
实现类:ApiServiceSMOImpl
- 解密请求报文(POST/PUT方法)
- 创建数据流对象
- 加载配置信息
- 权限校验
- 调用下游业务系统
服务编码解析机制
服务编码格式
- 标准格式:
资源.操作,如user.listUser - 路径格式:
/{resource}/{action},如/user/listUser
服务映射
通过 CommonConstant.HTTP_SERVICE 常量将服务编码传递到后端:
headers.put(CommonConstant.HTTP_SERVICE, service);
异常处理机制
统一异常捕获
try {
// 业务处理逻辑
} catch (Throwable e) {
logger.error("请求方法失败", e);
responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
异常类型
- DecryptException:解密异常
- BusinessException:业务异常
- NoAuthorityException:权限异常
- InitConfigDataException:配置初始化异常
架构图
客户端请求
↓
AppController (网关入口)
↓
servicePost/serviceGet 方法
↓
权限校验 (IPrivilegeSMO)
↓
服务调用 (IApiSMO → ApiSMOImpl)
↓
服务分发 (IApiServiceSMO → ApiServiceSMOImpl)
↓
数据流处理 (ApiDataFlow)
↓
配置加载 & 权限验证
↓
调用下游微服务 (dealCmd方法)
↓
返回响应结果
调用流程详解
1. 请求接收阶段
- 客户端发送请求到
/app/{service} - AppController根据HTTP方法路由到对应方法
- 封装请求头信息和参数
2. 权限验证阶段
- 通过AOP拦截器获取IPageData对象
- 调用IPrivilegeSMO验证用户权限
- 验证通过后继续处理
3. 服务分发阶段
- ApiSMOImpl进行员工权限校验
- 重写用户和商户信息到请求头
- 调用ApiServiceSMOImpl进行最终分发
4. 业务处理阶段
- ApiServiceSMOImpl创建数据流
- 加载应用路由配置
- 根据服务编码找到对应的AppService
- 通过dealCmd方法调用微服务
5. 响应返回阶段
- 处理微服务返回结果
- 统一封装响应格式
- 记录事务日志和耗时
关键配置说明
1. 请求头常量
public final static String HTTP_SERVICE = "SERVICE"; // 服务编码
public final static String HTTP_METHOD = "METHOD"; // 请求方法
public final static String HTTP_ACTION = "ACTION"; // 操作动作
public final static String HTTP_RESOURCE = "RESOURCE"; // 资源类型
2. 权限相关常量
public final static String CONTEXT_PAGE_DATA = "pd"; // 页面数据上下文
public final static String COOKIE_AUTH_TOKEN = "_java110_token_"; // 认证token
代码示例
典型POST请求处理
// 1. 接收请求
@RequestMapping(path = "/{service:.+}", method = RequestMethod.POST)
public ResponseEntity<String> servicePost(@PathVariable String service,
@RequestBody String postInfo,
HttpServletRequest request) {
// 2. 封装头信息
Map<String, String> headers = new HashMap<>();
this.getRequestInfo(request, headers);
headers.put(CommonConstant.HTTP_SERVICE, service);
headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_POST);
// 3. 权限校验
IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + service);
// 4. 服务调用
ResponseEntity<String> responseEntity = apiSMOImpl.doApi(postInfo, headers, request);
return responseEntity;
}
总结
AppController作为统一网关入口,通过标准化的服务编码机制实现了请求的智能分发。其核心特点包括:
- 统一入口:所有请求通过AppController统一处理
- 权限控制:多层次的权限验证机制
- 服务发现:基于服务编码的动态服务路由
- 异常处理:统一的异常捕获和错误处理
- 日志记录:完整的请求链路追踪和日志记录
这种设计使得系统具有良好的扩展性和维护性,新的服务只需按照规范注册服务编码即可自动接入网关调度体系。