写点什么

开发一个 API Gateway

作者:无心
  • 2023-06-08
    广东
  • 本文字数:1234 字

    阅读完需:约 4 分钟

https://github.com/wuxins/api-gateway

概览

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

背景

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


  • 接口级安全控制

  • API 监控治理

  • 系统有多少 API?

  • 每个业务流程涉及哪些 API?

  • 每个 API 的错误比率和请求时间 (均值、最大值) 情况?

  • 灰度策略南北流量管控

  • API 通用功能处理

  • 限流、熔断、降级、超时、参数过滤

  • API 接口文档动态更新

架构



  1. 中间件依赖



强:中间件不可用时,网关无法启动

弱:出现故障时,不影响网关对外提供服务

Redis 不可用时,分布式流控会降级为本地流控

MySQL 不可用时,API 数据实时性可能会有影响

中间件不可用时,有监控数据上报

中间件恢复可用时,网关相关功能会自恢复


  1. 部署环境


  • Go 版本

  • go 1.16+

  • 操作系统

  • linux、macos、windows

特性列表

  • 接口级安全控制

  • API 渐进式发布

  • Restful API 转发支持

  • 限流

  • 熔断

  • 降级

  • 超时控制

  • OAuth2.0 客户端鉴权

  • 参数过滤

  • API 分组

  • 灰度

  • 监控

  • API 文档生成


核心概念


  • 环境

  • API 分组

  • 上游应用

  • 租户

  • API 接口

快速启动

  1. 启动依赖中间件

  2. 启动 MySql,运行 gateway.sql

  3. 启动 Redis

  4. 生成镜像

  5. docker 运行 Makefile

  6. 启动网关

  7. 支持两种启动方式:


(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 信息有两种方式:


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 信息查询

  1. API 信息同步

  1. API 租户信息管理


  1. API 文档预览




性能

压测工具 : 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}
复制代码

后话

git: github.com/wuxins/api-…


mail:270504819@qq.com


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



用户头像

无心

关注

8年+ java 开发经验 2019-02-13 加入

原来过得很快乐

评论

发布
暂无评论
开发一个API Gateway_API Gateway_无心_InfoQ写作社区