# shoulder-api-gateway



接入层网关：安全、限流、日志、监控、缓存（业务无关）

API 服务网关：超时、缓存、熔断、重试、查询聚合、数据校验（时间、方法、版本、AppKey、签名）
【贴近业务】

实际应用中，也可以根据自己的设计，将代理网关的能力赋予 API gateway 中。

- 安全
    - 租户识别
    - 调用者识别
    - 外部调用网关时请求验签、解密
    - 内部返回给外部、内部调用外部时加签、加密 （字段排序）
    - 参数校验
    - 字段控制
        - 排序
        - 黑白名单
        - 额外字段填充/抹除
    
    - Oauth 验权
    - 认证
    - 字段脱敏
    - 调用源信息解析
        - 源ip
        - 源地址
    - OAuthClient
    - WEB 攻击抵御
        - redirect
        - xss
        - ssrf
        - 文件上传
        - referer
    - 默认 error 页面
- 日志
    - 日志字段配置（解析方式/位置）、提取、记录
    - 摘要日志
    - 审计日志
    
- 协议转换
    - 通信协议转换
      - HTTP - GRPC
      - HTTP - DUBBO
      - ...
    - 格式转换
      - 标准错误码与 HTTP 响应码映射
      - 错误码转换
      - 错误消息处理
      - 特殊格式
      - 数据转换
- 上下文
    - Trace 追踪
  
- 流量控制
    - 流量切换
        - 流量分组（基于ip/cookie）
        - 机房转发
        - 流量复制
        - 链路分组
            - 基于应用版本，减少新老版本互通
            - 基于逻辑区域
        - 灰度引流
        - 单元分隔（全局存储G/可副本读C/逻辑分区R）
    - 流量限制
        - 滑动窗口
            - 直接用 redis incr (key为当前的秒时间)，计算一秒内的请求次数，当value大于 xxx 时，其余的请求丢弃。
            - 简单、但粒度较粗，可能在极端情况出现双倍流量、容易出现流量尖刺，使得整体响应时间变长体验较差
        - 漏桶
            - 遇到压力时流量仍然可控，但即使没有负载，也需要等待漏出，不能容忍突发峰值
        - 令牌桶【默认】
            - 比漏桶多了允许一定的突发流量，使用较广泛，最大峰值=桶大小，最大高压值=令牌产出速率
        
    - 流量回放
        - 流量记录
        - 流量重播
    - 负载均衡
    - 超时熔断
    - 数据缓存
    - 服务降级

- API 管理
    - 上线
    - 下线
    - 分组
    - 自定域名
    - 发布
        - 灰度
        - 流程审批
    - 导入导出
    - 订阅
    - 版本管理
    - OpenAPI
    - 扩展能力
        - API 文档
        - SDK 下载
        - 页面调试
        - API 市场
        - 官网管理
    
- 监控告警
    - 请求数
    - 流量
    - 响应时间
    - 错误率
    - 异常告警（返回值/波动）
    - 日志监控
    - 日志分析
    - 调用统计
    - 故障注入
    - API 巡检
    - 故障分析（埋点）
    

## 特点
- 高性能
    - 数据压缩/协议转换，充分利用网络，保证传输效率与质量
- 强安全
    - 加密、验签、认证、鉴权、流控
- 高可靠
    - 充分测试验证，极端环境仍可保证服务响应可控
- 高可用
    - 99.99%+，通过流量限制、引流转发、流量隔离、负载均衡、故障转移、降级、平滑升级等措施全方位避免服务宕机，极端情况仍可通过集群与灾备能力保证可用性。
- API 管控
    - 提供可视化的完整管理方案
- 易用性强
    - 配置、监控、维护通过可视化管理，极易维护
    

## 其他可选依赖
- 用户中心
- 开放中心（授权服务器、认证服务器）
- （硬件加解密服务器）
- （沙箱）
- 缓存




- 脚本语言选型
    - Groovy，JIT后最快
    - Aviator 被编译成字节码，不JIT最快，JIT 次之 √
    - IKExpression 超轻量级
    - Drools 较重，功能完善，企业级
  

上线流程 DEV、SIT/TEST、PRE、GRAY、PROD