Blame view

service-api/服务分发阶段说明.md 4.53 KB
88e030b7   王彪总   init project
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
  # 服务分发阶段说明
  
  ## 阶段概述
  服务分发阶段是网关调度的核心环节,负责将已验证权限的请求分发到相应的业务服务。通过IApiSMO和IApiServiceSMO接口实现多层次的请求转发和员工权限校验。
  
  ## 核心组件
  - **IApiSMO**: 服务调用入口接口
  - **ApiSMOImpl**: 服务调用实现类
  - **IApiServiceSMO**: 最终服务分发接口
  - **ApiServiceSMOImpl**: 最终服务分发实现类
  
  ## 处理流程
  
  ### 1. 员工权限校验
  - ApiSMOImpl校验员工与商户的关系权限
  - 验证员工在当前商户中的访问权限
  - 重写用户ID和商户ID到请求头
  
  ### 2. 请求头重写
  ```java
  // 重写用户和商户信息
  headers.put(CommonConstant.HTTP_USER_ID, userId);
  headers.put(CommonConstant.HTTP_STORE_ID, storeId);
  ```
  
  ### 3. 服务分发调用
  - 调用IApiServiceSMO进行最终服务分发
  - 传递请求体和头信息到下游处理
  
  ## 代码示例
  
  ### IApiSMO接口定义
  ```java
  public interface IApiSMO {
      ResponseEntity<String> doApi(String body, Map<String, String> headers, HttpServletRequest request);
  }
  ```
  
  ### ApiSMOImpl实现类
  ```java
  @Component
  public class ApiSMOImpl implements IApiSMO {
      
      @Autowired
      private IApiServiceSMO apiServiceSMOImpl;
      
      @Override
      public ResponseEntity<String> doApi(String body, Map<String, String> headers, HttpServletRequest request) {
          // 1. 校验员工与商户的关系权限
          String userId = headers.get(CommonConstant.HTTP_USER_ID);
          String storeId = headers.get(CommonConstant.HTTP_STORE_ID);
          validateEmployeePermission(userId, storeId);
          
          // 2. 重写用户ID和商户ID
          headers.put(CommonConstant.HTTP_USER_ID, getActualUserId(userId));
          headers.put(CommonConstant.HTTP_STORE_ID, getActualStoreId(storeId));
          
          // 3. 调用最终服务分发
          return apiServiceSMOImpl.service(body, headers);
      }
      
      private void validateEmployeePermission(String userId, String storeId) {
          // 实现员工权限校验逻辑
          // 验证员工是否属于当前商户
          // 验证员工是否有访问权限
      }
  }
  ```
  
  ### IApiServiceSMO接口定义
  ```java
  public interface IApiServiceSMO {
      ResponseEntity<String> service(String reqJson, Map<String, String> headers);
  }
  ```
  
  ### 在网关中的调用
  ```java
  // 在AppController中调用服务分发
  @RequestMapping(path = "/{service:.+}", method = RequestMethod.POST)
  public ResponseEntity<String> servicePost(@PathVariable String service,
                                           @RequestBody String postInfo,
                                           HttpServletRequest request) {
      
      // 请求接收和权限验证阶段...
      
      // 服务分发阶段
      ResponseEntity<String> responseEntity = apiSMOImpl.doApi(postInfo, headers, request);
      
      return responseEntity;
  }
  ```
  
  ## 关键配置
  
  ### 请求头常量
  ```java
  public final static String HTTP_USER_ID = "USER_ID";      // 用户ID
  public final static String HTTP_STORE_ID = "STORE_ID";    // 商户ID
  public final static String HTTP_APP_ID = "APP_ID";        // 应用ID
  ```
  
  ### 服务编码传递
  ```java
  // 服务编码通过头信息传递
  headers.put(CommonConstant.HTTP_SERVICE, service);
  ```
  
  ## 服务分发机制
  
  ### 1. 员工权限验证
  - 验证员工与商户的关联关系
  - 检查员工在当前商户中的状态
  - 验证员工的业务操作权限
  
  ### 2. 请求头重写策略
  - 根据实际业务需求重写用户ID
  - 确保下游服务获取正确的商户信息
  - 维护请求链路的完整性
  
  ### 3. 服务路由逻辑
  - 基于服务编码进行服务发现
  - 动态路由到对应的业务服务
  - 支持服务版本管理
  
  ## 异常处理
  
  ### 员工权限异常
  ```java
  try {
      validateEmployeePermission(userId, storeId);
  } catch (NoEmployeePermissionException e) {
      logger.error("员工权限验证失败", e);
      return ResultVo.error("员工没有访问权限", HttpStatus.FORBIDDEN);
  }
  ```
  
  ### 服务分发异常
  ```java
  try {
      return apiServiceSMOImpl.service(body, headers);
  } catch (ServiceNotFoundException e) {
      logger.error("服务未找到", e);
      return ResultVo.error("服务不存在", HttpStatus.NOT_FOUND);
  }
  ```
  
  ## 技术要点
  
  1. **权限继承**: 在网关权限基础上增加员工权限校验
  2. **请求头传递**: 通过请求头传递上下文信息
  3. **服务发现**: 基于服务编码的动态服务路由
  4. **责任链模式**: 多层次的服务分发架构
  
  ## 性能优化
  - 员工权限信息缓存
  - 服务路由信息预加载
  - 请求头信息复用
  - 连接池管理