作者:小傅哥
博客: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 测试、日志查问、流量整形、网关治理等服务。
综上零碎微服务模块构造如下:
序号 | 零碎 | 形容 |
---|---|---|
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》]()、[《手写 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