深入理解 API 网关:原理、功能和用途
本文最后更新于:6 个月前
前言
这篇博客将会介绍什么是网关、为什么要使用网关以及如何使用网关等相关知识
在日益数字化和互联互通的时代,网关(Gateway)已经成为网络架构中不可或缺的一环。无论是企业网络还是个人用户,使用网关都能带来众多的好处和优势。
🔥 推荐阅读:
[27 API网关:系统的门面要如何做呢? (lianglianglee.com)](https://learn.lianglianglee.com/专栏/高并发系统设计40问/27 API网关:系统的门面要如何做呢?.md)(2023/11/18晚)
微服务网关-Spring Cloud Gateway - 掘金 (juejin.cn) (2024/01/16晚)
为什么要使用网关
- 为什么要使用网关呢?
- 首先,网关能够提供强大的网络安全保护。当今的网络环境充满了各种威胁和攻击,如病毒、恶意软件、黑客入侵等等。网关作为网络的前沿守卫,能够监控、过滤和阻止来自外部网络的恶意流量,确保内部网络的安全。它能够识别和阻止潜在的风险,保护机密数据和敏感信息免受损失。
- 其次,网关能够管理和优化网络流量。在庞大的网络环境中,流量管理和控制变得至关重要。网关可以实施流量限制、负载均衡和优先级管理等策略,确保网络资源的合理利用和高效分配。它能够减轻网络拥塞、提高网络性能,提供更优质的网络体验。
- 此外,网关还可以连接不同类型的网络。无论是公共云服务提供商、私有网络还是远程办公场景,网关都能搭建起桥梁连接不同的网络环境。通过网关的中转,用户可以访问不同网络中的资源和服务,实现远程访问和协作。
- 总而言之,无论是保护网络安全、管理网络流量,还是连接不同网络环境,网关都发挥着至关重要的作用。通过使用网关,我们能够打造更安全、高效和灵活的网络架构,满足各种实际需求。
- 希望这个简单的介绍能帮助你理解为什么需要使用网关,以及在何种情景下使用。如有任何疑问,请随时向我提问。祝你写作顺利!
正文
网关的分类
我们之前学习过 Nginx,它以其优秀的负载均衡和反向代理功能而闻名,这两个特点恰巧也赋予了 Nginx 作为网关的能力
有关 Nginx的相关知识,可以在《》一文中学习了解
我们可以按照是否与具体的业务逻辑相绑定,对网关的类别进行划分:
网关的分类:
- 全局网关(接入层网关): 作用是负载均衡、请求日志等,不和业务逻辑绑定
- 业务网关(微服务网关): 存在一些业务逻辑,作用是将请求转发到不同的业务/项目/接口/服务
参考文章:https://blog.csdn.net/qq_21040559/article/details/122961395
实现网关
Nginx (全局网关)、Kong 网关 (API 网关, Kong: https://github.com/Kong/kong),编程成本相对高点
Spring Cloud Gateway (取代了 Zuul ) ,性能高、可以用 Java 代码来写逻辑,适合学习
有关API网关的功能、API网关技术选型以及各类网关的比较:https://zhuanlan.zhihu.com/p/500587132
那么我们就深入学习下Spring Cloud Gateway网关👇
Spring Cloud Gateway
官网:https://spring.io/projects/spring-cloud-Gateway/
官方文档:https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/
核心概念
- 路由:根据什么条件,转发到哪里去
- 断言:定制一套规则、条件, 用来确定如何转发路由
- 过滤器: 对请求进行一系列的处理, 比如添加请求头、添加请求参数
请求流程:
- 客户端发起请求
- Handler Mapping: 根据断言,将请求转发到对应的路由
- Web Handler: 处理请求(一层层经过过滤器)
- 实际调用服务
两种配置方式
快速测试
- 在IDEA中新建工程,导入以下依赖,如图所示:
1 |
|
1 |
|
1 |
|
- 编程式,编写Gateway配置信息:
1 |
|
- 配置式,编写Gateway配置信息:
1 |
|
- 这两种配置作用是一样的,转发路由
1 |
|
这样,当我们访问 localhost:8090/blog/时,Gateway会将路由转发到 https://deng-2022.gitee.io/blog/,看下效果:
网关的作用
- 路由
- 负载均衡
- 统一鉴权
- 跨域
- 统一业务处理(缓存)
- 访问控制
- 发布控制
- 流量染色
- 接口保护
- 限制请求
- 信息脱敏
- 降级(熔断)
- 限流:学习令牌桶算法、学习漏桶算法,学习一下 RedisLimitHandler
- 超时时间
- 统一日志
- 统一文档
详细的配置内容,我们可以在Gateway官方文档中查阅学习:Spring Cloud Gateway
路由
- /b => 接口 B
Gateway 路由:https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/#Gateway-request-predicates-factories
负载均衡
- 在路由的基础上
- /c => 服务 A / 集群 A (随机转发到其中的某一个机器)
- uri 从固定地址改成 lb:xxxx
统一处理跨域
- 网关统一处理跨域,不用在每个项目里单独处理
- Gateway 处理跨域:https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/#cors-configuration
发布控制
- 灰度发布,比如上线新接口,先给新接口分配 20% 的流量,老接口 80%, 再慢慢调整比例
流量染色
- 给请求(流量)添加一些标识,一般是设置请求头中,添加新的请求头
- https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/#the-addrequestheader-Gatewayfilter-factory
- 全局染色:https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/#default-filters
统一接口保护
- 限制请求:https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/#requestheadersize-Gatewayfilter-factory
- 信息脱敏:https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/#the-removerequestheader-Gatewayfilter-factory
- 降级(熔断):https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/#fallback-headers
- 限流:https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/#the-requestratelimiter-Gatewayfilter-factory
- 超时时间:https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/#http-timeouts-configuration
- 重试(业务保护):https://docs.spring.io/spring-cloud-Gateway/docs/current/reference/html/#the-retry-Gatewayfilter-factory
统一业务处理
- 把每个项目中都要做的通用逻辑放到上层(网关),统一处理,比如本项目的次数统计
统一鉴权
- 判断用户是否有权限进行操作,无论访问什么接口,都统一验证权限,避免重复写验证权限操作。
访问控制
- 黑白名单,比如限制 DDOS IP
统一日志
- 统一的请求、响应信息记录
统一文档
- 将下游项目的文档进行聚合,在一个页面统一查看
这里我们还是建议使用 Swagger + Knif4j 快速生成接口文档:
https://doc.xiaominfo.com/docs/middleware-sources/aggregation-introduction
开启日志
1 |
|
常用配置
断言
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
- 权重
1 |
|
过滤器
- 基本功能:对请求头、请求参数、响应头的增删改查
- 添加请求头
- 添加请求参数
- 添加响应头
- 降级
- 限流
- 重试
这里就不引入具体配置了,详细配置可在官网文档查看:
Spring Cloud Gateway
引入:
1 |
|
总结
深入理解 API 网关:原理、功能和用途
http://example.com/2023/08/17/深入理解 API 网关:原理、功能和用途/