# 响应返回阶段说明

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

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

## 处理流程

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

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

### 3. 事务日志记录
- 记录完整的请求链路信息
- 保存请求和响应数据
- 记录处理耗时和性能指标

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

## 代码示例

### 统一响应结果封装类
```java
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);
    }
}
```

### 在网关中的完整响应处理
```java
@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;
}
```

### 事务日志记录方法
```java
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);
}
```

## 关键配置

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

### 响应头配置
```java
// 跨域响应头配置
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. 事务审计
- 完整的请求响应日志
- 操作记录和审计追踪
- 故障排查和问题定位

## 异常处理

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

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

## 技术要点

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

## 性能优化
- 响应数据压缩
- 日志异步写入
- 连接及时释放
- 缓存合理使用

## 安全特性
- 敏感信息过滤
- 响应数据加密
- 防重放攻击
- 请求频率限制