响应返回阶段说明.md 6.29 KB

响应返回阶段说明

阶段概述

响应返回阶段是网关调度的最后一个环节,负责处理微服务返回结果、统一封装响应格式、记录事务日志和性能监控。确保客户端收到标准化、格式统一的响应数据。

核心组件

  • ResponseEntity: Spring响应实体
  • ResultVo: 统一响应结果封装类
  • 事务日志组件: 记录请求链路信息
  • 性能监控组件: 记录请求耗时和性能指标

处理流程

1. 响应结果处理

  • 接收下游微服务返回的业务结果
  • 处理业务异常和系统异常
  • 统一封装响应格式

2. 响应格式封装

// 统一响应格式封装
ResponseEntity<String> responseEntity = ResultVo.createResponseEntity(resultData, HttpStatus.OK);

3. 事务日志记录

  • 记录完整的请求链路信息
  • 保存请求和响应数据
  • 记录处理耗时和性能指标

4. 响应头设置

  • 设置Content-Type等响应头信息
  • 处理跨域相关头信息
  • 设置缓存控制头

代码示例

统一响应结果封装类

public class ResultVo {

    public static ResponseEntity<String> createResponseEntity(Object data, HttpStatus status) {
        Map<String, Object> result = new HashMap<>();
        result.put("code", status.value());
        result.put("message", "success");
        result.put("data", data);
        result.put("timestamp", System.currentTimeMillis());

        return new ResponseEntity<>(JSONObject.toJSONString(result), status);
    }

    public static ResponseEntity<String> error(String message, HttpStatus status) {
        Map<String, Object> result = new HashMap<>();
        result.put("code", status.value());
        result.put("message", message);
        result.put("data", null);
        result.put("timestamp", System.currentTimeMillis());

        return new ResponseEntity<>(JSONObject.toJSONString(result), status);
    }
}

在网关中的完整响应处理

@RequestMapping(path = "/{service:.+}", method = RequestMethod.POST)
public ResponseEntity<String> servicePost(@PathVariable String service,
                                         @RequestBody String postInfo,
                                         HttpServletRequest request) {

    long startTime = System.currentTimeMillis();
    ResponseEntity<String> responseEntity = null;

    try {
        // 1. 请求接收阶段
        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);

        // 2. 权限验证阶段
        IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
        privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + service);

        // 3. 服务分发阶段
        responseEntity = apiSMOImpl.doApi(postInfo, headers, request);

        // 4. 响应返回阶段 - 记录成功日志
        long endTime = System.currentTimeMillis();
        logTransaction(request, service, postInfo, responseEntity, endTime - startTime, true);

    } catch (Throwable e) {
        logger.error("请求方法失败", e);

        // 4. 响应返回阶段 - 记录异常日志
        long endTime = System.currentTimeMillis();
        responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        logTransaction(request, service, postInfo, responseEntity, endTime - startTime, false);
    }

    return responseEntity;
}

事务日志记录方法

private void logTransaction(HttpServletRequest request, String service, 
                           String requestData, ResponseEntity<String> response, 
                           long costTime, boolean success) {

    TransactionLog log = new TransactionLog();
    log.setServiceCode(service);
    log.setRequestUrl(request.getRequestURI());
    log.setRequestMethod(request.getMethod());
    log.setRequestData(requestData);
    log.setResponseData(response.getBody());
    log.setStatusCode(response.getStatusCodeValue());
    log.setCostTime(costTime);
    log.setSuccess(success);
    log.setCreateTime(new Date());

    // 异步保存事务日志
    transactionLogService.asyncSave(log);
}

关键配置

响应格式配置

// 统一响应格式
{
    "code": 200,
    "message": "success", 
    "data": {...},
    "timestamp": 1638254632000
}

响应头配置

// 跨域响应头配置
responseEntity.getHeaders().set("Access-Control-Allow-Origin", "*");
responseEntity.getHeaders().set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
responseEntity.getHeaders().set("Access-Control-Allow-Headers", "Content-Type, Authorization");

响应处理机制

1. 统一格式封装

  • 标准化响应数据结构
  • 统一的错误码和消息格式
  • 时间戳和请求追踪信息

2. 异常处理策略

  • 业务异常:返回具体错误信息
  • 系统异常:返回通用错误信息
  • 权限异常:返回权限不足信息

3. 性能监控

  • 记录请求处理总耗时
  • 监控各阶段处理时间
  • 性能指标统计和分析

4. 事务审计

  • 完整的请求响应日志
  • 操作记录和审计追踪
  • 故障排查和问题定位

异常处理

响应封装异常

try {
    return ResultVo.createResponseEntity(resultData, HttpStatus.OK);
} catch (JsonProcessingException e) {
    logger.error("响应数据序列化失败", e);
    return ResultVo.error("响应数据格式异常", HttpStatus.INTERNAL_SERVER_ERROR);
}

日志记录异常

try {
    logTransaction(request, service, postInfo, responseEntity, costTime, true);
} catch (Exception e) {
    // 日志记录异常不应影响主流程
    logger.error("事务日志记录失败", e);
}

技术要点

  1. 统一响应格式: 标准化的API响应规范
  2. 异步日志记录: 不影响主流程的日志记录机制
  3. 性能监控: 完整的请求链路性能追踪
  4. 错误处理: 分层次的异常处理策略

性能优化

  • 响应数据压缩
  • 日志异步写入
  • 连接及时释放
  • 缓存合理使用

安全特性

  • 敏感信息过滤
  • 响应数据加密
  • 防重放攻击
  • 请求频率限制