# 《API网关》开篇:如果让我设计一套,百万级API网关!
作者:小傅哥
博客:https://bugstack.cn (opens new window)
沉淀、分享、成长,让自己和他人都能有所收获!😄
是滴,小傅哥又要准备搞事情了!这次准备下手API网关项目,因为这是所有互联网大厂都有的一个核心服务,承接着来自用户的滴滴打车、美团外卖、京东购物、微信支付,更是大促期间千万级访问量的核心系统。
🤔 那么它是一个什么样的项目呢?为什么会有它的存在?它是怎么设计实现的呢?都用到了哪些技术栈呢?
# 一、前言:网关是啥东西
在计算机网络中,网关 (opens new window)(Gateway)是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。
而API网关也是随着对传统庞大的单体应用(All in one)拆分为众多的微服务(Microservice)以后,所引入的统一通信管理系统。用于运行在外部http请求与内部rpc服务之间的一个流量入口,实现对外部请求的协议转换
、参数校验
、鉴权
、切量
、熔断
、限流
、监控
、风控
等各类共性的通用服务。
# 二、大厂:为啥都做网关
各大厂做网关,其实做的就是一套统一方案。将分布式微服务下的RPC到HTTP通信的同类共性的需求,凝练成通用的组件服务,减少在业务需求场景开发下,非业务需求的同类技术诉求的开发成本。
那么以往没有网关的时候怎么做,基本的做法就是再 RPC 服务之上再开发一个对应的 WEB 服务,这些 WEB 服务可以是 Spring MVC 工程,在 Spring MVC 工程中调用 RPC 服务,最终提供 HTTP 接口给到 H5、Web、小程序、APP 等应用中进行使用。如图 1-1 所示
传统开发 WEB 服务的几个问题:
- 问题1:每一个 WEB 应用,都需要与之匹配申请一套工程、域名、机器等资源,一直到部署,研发效率降低,维护成本增加。
- 问题2:每一个 WEB 应用,都会有所涉及共性需求,限流、熔断、降级、切量等诉求,维护代码成本增加。
- 问题3:每一个 WEB 应用,在整个使用生命周期内,都会涉及到文档的维护、工程的调试、联调的诉求,类似刀耕火种一样的开发势必降低研发效率。
所以:综上在微服务下的传统开发所遇到的这些问题,让各个大厂都有了自己自研网关的诉求,包括;阿里
、腾讯
、百度
、美团
、京东
、网易
、亚马逊
等,都有自己成熟的 API 网关解决方案。毕竟这可以降低沟通成本、提升研发效率、提升资源利用率。
# 三、网关:系统架构设计
如果希望实现一个能支撑百亿级吞吐量的网关,那么它就应该是按照分布式架构思维做去中心化设计,支持横向扩展。让每一台网关服务都成为一个算力,把不同的微服务RPC接口,按照权重策略计算动态分配到各个算力组中,做到分布式运算的能力。
此外从设计实现上,要把网关的通信模块、管理服务、SDK、注册中心、运营平台等依次分开单独开发实现,这样才能进行独立的组合包装使用。
这就像为什么 ORM 框架在开发的时候不是与 Spring 强绑定在一起,而是开发一个独立的组件,当需要有 Spring 融合使用的时候,再单独开发一个 Mybatis-Spring 来整合服务。
所以在这里设计网关的时候也是同样的思路,就像官网的通信不应该一开始就把 Netty 相关的服务全部绑定到 Spring 容器,这样即增加了维护成本,也降低了系统的扩展性。
诸如此类的软件架构设计,都会在这套网关微服务架构中体现,整体架构如图 1-2 所示
整个API网关设计核心内容分为这么五块;
第一块
:是关于通信的协议处理,也是网关最本质的处理内容。这里需要借助 NIO 框架 Netty 处理 HTTP 请求,并进行协议转换泛化调用到 RPC 服务返回数据信息。第二块
:是关于注册中心,这里需要把网关通信系统当做一个算力,每部署一个网关服务,都需要向注册中心注册一个算力。而注册中心还需要接收 RPC 接口的注册,这部分可以是基于 SDK 自动扫描注册也可以是人工介入管理。当 RPC 注册完成后,会被注册中心经过AHP权重计算分配到一组网关算力上进行使用。第三块
:是关于路由服务,每一个注册上来的Netty通信服务,都会与他对应提供的分组网关相关联,例如:wg/(a/b/c)/user/... a/b/c 需要匹配到 Nginx 路由配置上,以确保不同的接口调用请求到对应的 Netty 服务上。PS:如果对应错误或者为启动,可能会发生类似B站事故。第四块
:责任链下插件模块的调用,鉴权、授信、熔断、降级、限流、切量等,这些服务虽然不算是网关的定义下的内容,但作为共性通用的服务,它们通常也是被放到网关层统一设计实现和使用的。第五块
:管理后台,作为一个网关项目少不了一个与之对应的管理后台,用户接口的注册维护、mock测试、日志查询、流量整形、网关管理等服务。
综上系统微服务模块结构如下:
序号 | 系统 | 描述 |
---|---|---|
1 | api-gateway-core | 网关核心系统:用于网络通信转换处理,承接http请求,调用RPC服务,责任链模块调用 |
2 | api-gateway-admin | 网关管理系统:用于网关接口后台管理,注册下线停用控制 |
3 | api-gateway-sdk | 网关注册组件:用于注解方式采集接口,发送消息注册接口 |
4 | api-gateway-center | 网关注册中心:提供网关注册中心服务,登记网关接口信息 |
5 | api-gateway-test-provider | 网关测试工程:提供RPC接口 |
6 | api-gateway-test-consumer | 网关测试工程:消费RPC接口 |
# 四、演示:网关运行效果
趁着周末假期小傅哥已经做了一部分的功能实现,就像小傅哥以前《手写Spring》 (opens new window)、《手写Mybatis》 (opens new window)一样,此项目也是渐进式的逐步完成各个模块功能的开发。并参照优秀源码级的项目架构设计,运用抽象和分治的设计技巧,解决功能间的耦合调用和服务设计。同时也结合设计原则和相应场景下的设计模式,开发出高质量易于迭代和维护的代码。部分代码实现和运行如图 1-3 所示
- 左侧是API网关核心通信模块,右侧是RPC(Dubbo)服务。通过对网页端发起的 http 请求,经过API网关的协议转换和对RPC的泛化调用包装结果数据并返回到页面,就是中间这张图的运行效果了。
- 左侧工程的实现,以渐进式分拆模块逐步完成,例如: core-01(Netty通信)、core-02(泛化调用)、core-03(执行器)等,让每一个对API网关感兴趣的读者都能从中学习到;架构的分层、功能的设计、代码的实现。
# 五、邀请:一起学习技术
💐以上关API网关的项目,也是小傅哥的星球【码农会锁 (opens new window)】准备带着读者一起利用周末
和假期
学习实践的内容。现在上车你将会通过小傅哥的视频
+小册
+代码
+直播
+作业
,5方面来与你一起学习,帮助你提升技术实力,为你的职业生涯续期,也为你可以走的更远,可以多赚些钱。
# 1. 优惠加入
注意:加入星球后,阅读星球🔝置顶消息
,进入《API网关:中间件设计和实践》学习项目。PS:或者直接点击此文章下方的阅读原文进入。复制链接也可以进入:https://t.zsxq.com/047EQfQfY (opens new window)
为什么知识付费?为什么是这个价格?
- 星球内的服务和实战项目都是小傅哥本人提供和原创,相信能够给大家带来超过该价格的价值 。举个例子,渐进式手把手带大家做进大厂才可能看得见的项目、有笔记有源码、有问题可以提,这比单独买一个课程或一套源码要值得多。其实都不到大城市一节补习班的钱,哪怕把我的课程时长换算成培训机构的课时,也是便宜的超级多。
- 持续的内容创作 + 回答问题 + 知识星球的运营(简历批阅、就业指导、架构设计) 需要小傅哥每个早上6点-8点以及周末/假期持续维护。如果不提高门槛(本次提价¥20),真的是维护不过来。也希望加入星球的同学都是真的下定了决心想要进步,而不是像免费的交流群和社区一样 “闲聊扯淡”。
- 希望加入进来的同学能够利用好星球来坚持学习。如果这个星球真的帮助你达成了目标(比如晋升加了薪、跳槽诺了坑、校招进了厂),回过头来你会发现,这绝对是你 最值得的一笔投资 !(免费的东西往往不会珍惜,别问我为什么知道!)
- 星球仍将随着人数和项目的增加会每次提价,感谢理解!—— 但已付费的加入的用户,续费折扣会很大,相当于只续费小傅哥的服务和新项目费用,没有什么比这更爽的了!如果当年有人这样对我,我会买它个10年!
# 2. 适合谁学
- 一直使用 SpringMVC,想了解分布式架构。
- 常年做CRUD开发,手里缺少硬核项目,面试张不开嘴。
- 在校准备校招,市面都是流水账项目,面试没竞争力。
- 希望多沉淀核心技术,让自己能公司留的下来,也能走的出去。
# 3. 能学到啥
- 优秀架构:学习微服务架构设计方案
- 整洁编码:学习源码级工程编程实现
- 扩充技术:学习开发中间件所需技术(Netty、CGlib、SPI、GenericReference)
- 打开思路:学习让自己开眼界的项目(技术并不难,但没人告诉你,就走的很难!)
# 4. 开发计划
- 每周末和假期编写API网关,并同时录制设计和实现的视频、编写小册和定期组织直播解决读者疑惑以及分享。稳定输出,可靠学习
- 整个系统的设计和实现,遵循分治和抽象的设计分层原则,按照微服务构建服务模块,以源码级体验学习。
- 关于API网关会更注重骨架的结构和核心流程的功能,把最干净的部分交给读者,让读者更加易懂,也易扩展。
目录:
[x] 第1章:HTTP请求会话协议处理
在小傅哥的公众号【bugstack虫洞栈】回复【星球】也可以领取专属优惠券[ ] 第2章:代理RPC泛化调用
[ ] 第3章:分治处理会话流程
[ ] 第4章:将连接抽象为数据源
[ ] 梳理中 ... 每周更新预计40章
# 5. 其他项目
🌹你以为加入小傅哥星球就只有一个API网关项目吗?不🙅🏻那不是性格!加入后,这些内容都是你的,这片鱼塘都给你了!—— 目前已有3700+伙伴在星球学习!