设计开发API网关(01-概览介绍)

311 阅读4分钟

概览

高性能可扩展弹性部署的HTTP网关

github.com/wuxins/api-…

背景

可视化 & 可配置化解决如下问题:

  • 接口级安全控制
  • API监控治理
    • 系统有多少API?
    • 每个业务流程涉及哪些API?
    • 每个API的错误比率和请求时间 (均值、最大值) 情况?
  • 灰度策略南北流量管控
  • API通用功能处理
    • 限流、熔断、降级、超时、参数过滤
  • API接口文档动态更新

架构

arch.png

  1. 中间件依赖
中间件启动时运行时用途
MySQLAPI元数据存储
Redis分布式限流

强:中间件不可用时,网关无法启动
弱:出现故障时,不影响网关对外提供服务

Redis不可用时,分布式流控会降级为本地流控
MySQL不可用时,API数据实时性可能会有影响
中间件不可用时,有监控数据上报
中间件恢复可用时,网关相关功能会自恢复

  1. 部署环境
  • Go 版本
    go 1.16+
  • 操作系统
    linux、macos、windows

特性列表

  • 接口级安全控制
  • API渐进式发布
  • Restful API 转发支持
  • 限流
  • 熔断
  • 降级
  • 超时控制
  • OAuth2.0 客户端鉴权
  • 参数过滤
  • API分组
  • 灰度
  • 监控
  • API文档生成

核心概念

  • 环境
  • API分组
  • 上游应用
  • 租户
  • API接口

快速启动

  1. 启动依赖中间件
    启动MySql,运行gateway.sql
    启动Redis

  2. 生成镜像
    docker 运行 Makefile

  3. 启动网关
    支持两种启动方式:

(1) 本地配置文件(config.toml)
默认启动方式,启动命令:./api-gateway

(2) 远程配置文件
目前仅支持: nacos
启动命令: ./api-gateway -CONFIG_MODE=nacos -NACOS_ADDRESS=127.0.0.1:8888 -NACOS_NAMESPACE=dev -NACOS_DATAID=api-gateway -NACOS_GROUP=DEFAULT_GROUP

最佳实践

  • API上线流程:

上报->开发自测->测试验证->生产上线

  • 服务列表:
服务名称开发语言描述
api-gatewaygo网关服务
api-gateway-adminjava网关后管后台
api-gateway-fontjs、html网关后管页面
upstream-service-demojava模拟后端springboot web微服务提供API接口
  • 上报API信息有两种方式:

1、开发maven插件jar(api-gateway-reporter),deploy 到maven 仓库

原理:集成运维平台maven编译阶段扫描springboot-demo项目api信息,并自动上报到api-gateway-admin

备注:实现基于开源工具,感谢smart-doc-maven-pluginsmart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具

2、登录后管界面人工录入

第一种方式相对于第二种方案的优点:

(1) 节省了人工录入成本

(2) API文档实现了自动更新,节省了API文档维护成本

  • 管控平台操作示例图:
  1. API信息查询 gateway-api-info.png

  2. API信息同步 gateway-api-sync.png

  3. API租户信息管理 gateway-tenant-info.png

  4. API文档预览 gateway-api-docs-01.png

gateway-api-docs-02.png

性能

压测工具 : Apache bench httpd-tools ab test

后端接口: /upstream-service-test/outer/resources/{{resourceId}}

网关转发接口: /upstream-service-test/resources/{{resourceId}}

请求方法: GET

响应内容:

{
  "code": "200000",
  "msg": "Success",
  "data": {
    "dictKey": "GENDER",
    "keyDisplayName": "性别",
    "dictCodes": [
      {
        "dictCode": "MALE",
        "dictValue": "1",
        "dictOrder": 1,
        "isDefault": true,
        "codeDisplayName": "男"
      },
      {
        "dictCode": "FEMALE",
        "dictValue": "2",
        "dictOrder": 2,
        "isDefault": false,
        "codeDisplayName": "女"
      }
    ]
  },
  "success": true
}
服务器用途资源
192.168.45.19压测机阿里云 8C 16G
192.168.45.141API网关阿里云 8C 16G
192.168.45.142上游后端服务阿里云 8C 16G
场景开启限流开启监控并发数请求总量错误率CPU(%)内存(%)QPS压测指令
压测后端服务××2005000000%450%0.122194.36ab -c 200 -n 500000 -H 'G-Tenant:website' http://192.168.45.142:8888/upstream-service-test/outer/resources/12345
压测API网关××2005000000%610%0.115370.83ab -c 200 -n 500000 -H 'G-Tenant:website' http://192.168.45.141:7777/upstream-service-test/resources/12345
压测API网关×2005000000%610%0.113141.76ab -c 200 -n 500000 -H 'G-Tenant:website' http://192.168.45.141:7777/upstream-service-test/resources/12345
压测API网关×2005000000%610%0.111361.08ab -c 200 -n 500000 -H 'G-Tenant:website' http://192.168.45.141:7777/upstream-service-test/resources/12345
压测API网关2005000000%610%0.110595.93ab -c 200 -n 500000 -H 'G-Tenant:website' http://192.168.45.141:7777/upstream-service-test/resources/12345

后话

git: github.com/wuxins/api-…

mail:270504819@qq.com

后续会对每个特性做详细的讲解,有兴趣的兄弟请star 给个支持,也欢迎随时沟通。