关于网关:如果让我设计一套TPS百万级API网关

52次阅读

共计 2885 个字符,预计需要花费 8 分钟才能阅读完成。

作者:小傅哥
博客:https://bugstack.cn

积淀、分享、成长,让本人和别人都能有所播种!😄

是滴,小傅哥又要筹备搞事件了!这次筹备下手 API 网关 我的项目,因为这是所有互联网大厂都有的一个外围服务,承接着来自用户的滴滴打车、美团外卖、京东购物、微信领取,更是大促期间千万级访问量的外围零碎。

🤔 那么它是一个什么样的我的项目呢?为什么会有它的存在?它是怎么设计实现的呢?都用到了哪些技术栈呢?

一、前言:网关是啥货色

在计算机网络中,网关(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 测试、日志查问、流量整形、网关治理等服务。

综上零碎微服务模块构造如下:

序号零碎形容
1api-gateway-core网关外围零碎:用于网络通信转换解决,承接 http 申请,调用 RPC 服务,责任链模块调用
2api-gateway-admin网关管理系统:用于网关接口后盾治理,注册下线停用管制
3api-gateway-sdk网关注册组件:用于注解形式采集接口,发送音讯注册接口
4api-gateway-center网关注册核心:提供网关注册核心服务,注销网关接口信息
5api-gateway-test-provider网关测试工程:提供 RPC 接口
6api-gateway-test-consumer网关测试工程:生产 RPC 接口

四、演示:网关运行成果

趁着周末假期小傅哥曾经做了一部分的性能实现,就像小傅哥以前 [《手写 Spring》]()、[《手写 Mybatis》]() 一样,此我的项目也是渐进式的逐渐实现各个模块性能的开发。并参照优良源码级的我的项目架构设计,使用形象和分治的设计技巧,解决性能间的耦合调用和服务设计。同时也联合设计准则和相应场景下的设计模式,开发出高质量易于迭代和保护的代码。局部代码实现和运行如图 1-3 所示

  • 左侧是 API 网关外围通信模块,右侧是 RPC(Dubbo)服务。通过对网页端发动的 http 申请,通过 API 网关的协定转换和对 RPC 的泛化调用包装后果数据并返回到页面,就是两头这张图的运行成果了。
  • 左侧工程的实现,以渐进式分拆模块逐渐实现,例如:core-01(Netty 通信)、core-02(泛化调用)、core-03(执行器)等,让每一个对 API 网关感兴趣的读者都能从中学习到;架构的分层、性能的设计、代码的实现。

五、邀请:咱们一起开发

💐以上关 API 网关 的我的项目,也是小傅哥筹备带着读者一起利用 周末 假期 学习实际的内容。当初上车你将会通过小傅哥的 视频 + 文档 + 代码,三方面来与你一起学习,帮忙你晋升技术实力,为你的职业生涯续期,也为你能够走的更远,能够多赚些钱。

  • [x] 第 1 章:HTTP 申请会话协定解决
  • [] 第 2 章:代理 RPC 泛化调用
  • [] 第 3 章:XML 配置文件解析
  • [] 第 4 章:办法执行器封装
  • [] 梳理中 … 每周更新

  • Github:https://github.com/fuzhengwei/api-gateway
  • Gitcode:https://gitcode.net/fuzhengwei/api-gateway
正文完
 0