API网关的主要作用
在现代微服务架构中,API网关作为系统的入口点扮演着至关重要的角色。它不仅简化了客户端与后端服务之间的通信,还提供了多种关键功能来增强系统的灵活性、安全性和可管理性。
动态路由
动态路由是api网关的一个核心特性,它允许根据不同的条件将请求转发到合适的服务实例上。比如,在一个电商平台中,可能同时存在多个版本的订单处理服务:一部分负责日常交易,另一部分则专门用于促销活动期间的大流量应对。通过配置api网关,可以根据用户请求的具体内容(如时间窗口、地理位置等)自动选择最合适的后端服务进行响应,从而实现平滑地流量管理和负载均衡。此外,当需要对某些服务进行更新或维护时,也可以快速调整路由规则而不影响整个系统的正常运行。
协议转换
协议转换是指api网关能够支持不同类型的协议间的数据交换,这对于希望把内部系统开放给外部访问的情况尤其有用。例如,很多企业内部使用的是基于RPC(远程过程调用)的通信方式,如Dubbo协议,而对外提供的接口往往采用更广泛接受的HTTP/HTTPS协议。借助于api网关强大的协议转换能力,可以无缝地将这些内部RPC服务暴露为RESTful API,使得第三方开发者能够更加容易地集成和使用这些服务,同时也保证了企业内部技术栈的选择自由度不受限制。
安全防护
安全性是任何公开API设计时都必须考虑的重要因素之一。api网关通过提供诸如身份验证、授权控制以及加密传输等多种机制来保护数据的安全。以一个在线银行应用为例,其移动客户端与服务器之间的通信涉及到敏感信息(如账户余额查询)。此时,api网关可以设置严格的访问控制策略,确保只有经过认证且拥有相应权限的请求才能被转发到后端金融服务;同时还可以启用SSL/TLS加密,防止传输过程中发生数据泄露。另外,针对常见的Web攻击(如SQL注入、XSS攻击),许多先进的api网关还集成了Web应用防火墙(WAF)功能,进一步提升了整体系统的防御水平。
API网关的核心功能
API网关作为现代微服务架构中的重要组件,提供了多种核心功能来确保系统的高效、安全运行。
1)动态路由,使得API网关可以根据当前请求上下文灵活地决定如何转发请求至正确的后端服务。比如基于请求头中的某些标志字段或路径参数值进行条件判断,并据此选择合适的目标服务地址。这样的灵活性对于实现A/B测试、蓝绿部署等多种高级运维场景至关重要。
2)协议转换,API网关能够支持不同类型的协议接入与转换,比如将来自客户端的HTTP请求转为内部系统更常用的gRPC调用,或是处理WebSocket连接以实现实时数据流传输,这种能力极大地促进了前后端之间的解耦以及技术栈的多样化选择。
3)针对安全防护,API网关扮演了至关重要的角色,它不仅能够执行基本的身份验证(如OAuth2.0)和授权检查,还可能集成额外的安全层,例如Web应用防火墙(WAF)特性,用于识别并阻止恶意流量或攻击行为,保护后端服务免受SQL注入、XSS等常见威胁的影响。此外,通过配置访问控制列表(ACLs),可以精细化地管理哪些外部IP地址被允许访问特定资源,进一步增强了系统的安全性。
4)流量控制,也是API网关不可或缺的一部分,它帮助维持应用程序稳定性和性能。例如,在遇到突发高峰流量时,API网关可通过速率限制策略来防止过载情况发生;同时,健康检查机制能够自动检测并绕过后端不健康的服务实例,确保用户始终获得最佳体验。另外,超时设置则允许定义一个合理的等待时间阈值,超过该阈值则立即返回错误信息给调用方,避免长时间阻塞。
5)API管理功能,让开发者能够轻松创建、发布、维护以及监控其提供的API接口。这包括但不限于文档自动生成、版本控制、使用统计等功能,有助于提高开发效率的同时也便于运营团队更好地理解API的实际使用状况及潜在问题点。
有哪些主流的API网关
主流的API网关包括了Higress、SpringCloud Gateway、Zuul、APISIX、Ambassador、Gloo、Nginx Plus、Traefik 企业版以及Kong。
这些API网关在语言栈上有所区别,例如Higress是基于C++构建的,而SpringCloud Gateway则是基于Java开发;
它们各自具有独特的功能特点:
Higress能够将流量网关、微服务网关和安全网关的功能集于一体,并支持Dubbo协议转换等高级特性;
SpringCloud Gateway作为Spring Cloud生态的一部分,主要用作微服务架构下的网关解决方案;
APISIX则是一个高性能且可扩展的微服务API网关,它不仅支持多种协议如gRPC,还允许通过Lua插件进行功能扩展;
其他像Ambassador与Gloo这类基于Envoy构建的产品,则更加专注于为Kubernetes环境提供下一代API网关服务。每种API网关都有其适用场景及优势,在选择时需结合具体需求来决定最合适的选项。
API网关选型的主要考虑要素与说明
在选择API网关时,需要考虑多方面的要素。
1) 生态兼容性是首要考虑的因素之一。
一个良好的API网关应该能够无缝地融入现有的技术栈和基础设施中,无论是云原生应用还是传统的微服务架构。对于已经采用了Kubernetes、Spring Cloud等流行框架的组织来说,API网关对这些平台的支持意味着可以更平滑地进行集成,减少了迁移成本和技术债务。
2)性能也是评价API网关优劣的关键指标。
尤其是在高并发场景下,优秀的性能表现为低延迟、高吞吐量以及高效的资源利用率。这不仅直接影响到用户体验的好坏,还关系到系统整体稳定性和运营成本。无垃圾回收(GC)开销的设计尤其重要,因为这能确保即使在极端负载条件下也能保持稳定的响应速度和服务质量。
3)扩展性决定了API网关能否随着业务需求的变化而灵活调整。
通过支持WebAssembly (Wasm) 或者其他多语言扩展机制,开发者可以根据特定应用场景快速添加新的功能或优化现有逻辑,同时保证了代码的安全隔离与高效执行。此外,拥有丰富插件生态的网关还能提供更多现成解决方案供选择,加快开发速度。
4)安全性。
在保护敏感数据免受未经授权访问方面发挥着至关重要的作用。强大的认证鉴权机制如JWT、OIDC等可以帮助验证用户身份并控制其权限范围;同时,内置防火墙规则、加密传输等功能则进一步增强了整个系统的防御能力,确保信息交换过程中的机密性和完整性。
市面上主流网关的横向功能对比
核心维度 | 子维度 | 说明 | Higress | Java 类网关(典型:Spring Cloud Gateway) | OpenResty 类网关(典型:Kong) | Envoy 类网关(典型:Gloo) | Go 类网关(典型:Traefik) |
生态兼容性 | K8s 微服务生态(Ingress/Istio/Kruise/Argo/...) | 对云原生应用友好 | 有 | 有 | 有 | 有 | 有 |
Java 微服务生态(Nacos/Dubbo/Spring Cloud/...) | 对传统微服务应用友好 | 有 | 有 | ||||
扩展性 | Wasm 多语言扩展(C++/Rust/GO/JS/...) | 通过沙箱隔离确保内存安全,支持多种编程语言,有编译过程,类型检查,相比 Lua 弱类型更可靠(例子:7行代码让B站崩溃3小时) | 有 | ||||
40+ 插件生态,100+ 开发者生态,插件版本可以独立于网关版本升级,且流量完全无损 | 有 | ||||||
Lua 语言扩展 | 脚本型扩展,适合写简单逻辑 | 有 | 有 | 有 | 有 | ||
高性能 | 无 GC 开销 | 高并发下,低 CPU,低内存 | 有 | 有 | |||
CryptoMB/QAT 等适配 | 可以适配Intel等特定CPU实现软硬件结合的加速能力 | 有 | 有 | ||||
配置热更新 | 短连接无损 | 适用:HTTP 1.0,HTTP 1.1(将长连接变为短连接) | 有 | 有 | 有 | 有 | |
长连接无损 | 适用:HTTP 2,gRPC,WebSocket | 有 | 有 | 有 | |||
AI 业务亲和性 | 多 LLM Provider 支持 | 统一协议对接所有 LLM 厂商 | 有 | 有 | kong 支持一部分 | 有 | |
模型 fallback 能力 | 当主用模型不可用时,自动降级到备用模型,提高依赖 AI 业务的稳定性 | 有 | |||||
AIGC 安全防护 | 数据脱敏,输入/输出封禁 | 有 | 支持对接阿里云内容安全服务 | ||||
基于单词Token的限流 | 用于实现对单个调用方或IP等维度,限制每分钟/每天允许的单词 Token 开销,用于精确控制 AI 业务成本 | 有 | 有 | ||||
语义化缓存 | 基于语义相似度进行结果缓存,在 RAG 场景下可大幅提升响应速度,以及降低成本 | 有 | 有 | 收费功能 | 有 | ||
语义化路由策略 | 支持基于 LLM 识别请求意图,将特定请求转发给特定模型,或者对特定意图开启语义化缓存等 | 有 | 有 | 收费功能,仅支持语义化路由 |
Higress:来自阿里的开源 API网关
整体上我们更推荐阿里的Higress作为开源API网关,主要基于以下几个理由:
- 生态兼容性:Higress遵循开源Ingress/Gateway API标准,并支持Nacos、K8s Service等多种注册中心。这种广泛的兼容性使得用户可以轻松地从其他网关解决方案(如Nginx Ingress)迁移到Higress,极大地降低了迁移成本。
- 性能:Higress在超大规模路由配置与转发方面表现出色。例如,在处理10000个路由的情况下,生效时间仅为3秒。相较于Ingress Nginx,Higress的CPU成本节省了50%,内存成本节省了90%。这些数据表明Higress在高并发和大规模部署场景下具有显著的优势。
- 扩展性:Higress支持动态配置热更新,这意味着可以在不中断服务的情况下进行配置变更。此外,它还提供了通过Java编程模型进行扩展的能力,满足了用户对于自定义插件和功能的需求。
- 安全性:Higress全面支持主流的鉴权能力,包括key-auth、hmac-auth、jwt-auth等,确保了API的安全访问。同时,它内置了WAF模块,进一步增强了系统的防护能力。
- 实战经验:Higress来自阿里巴巴多年的实战经验,完全开源且免费。这一背景不仅证明了其在真实生产环境中的可靠性和稳定性,也体现了阿里对开源社区的贡献和支持。
Higress具体使用样例-基于docker的单机版快速部署
前置条件
确保本机已安装 Docker。如果还未安装,可以参考官方指引:Get Docker | Docker Docs
部署Higress
创建一个工作目录
mkdir higress
启动Higress
启动命令如下,这将自动下载并运行最新版本的Higress,并且把配置文件写入到之前创建的工作目录中:
docker run -d --rm --name higress-ai -v ./higress:/data \
-p 8001:8001 -p 8080:8080 -p 8443:8443 \
higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/all-in-one:latest
这里各端口的作用分别是:
8001
:Higress UI 控制台入口。
8080
:网关 HTTP 协议入口。
8443
:网关 HTTPS 协议入口。
注意:上述命令使用的是阿里云镜像仓库提供的Docker镜像,确保网络能够访问该地址。
登陆Higress控制台进行配置
- 在浏览器输入
http://127.0.0.1:8001
以打开Higress控制台。
- 首次访问时需初始化管理员账号。完成后,请用设置的用户名和密码登录Higress控制台。
- 点击左侧菜单中的“服务来源”导航栏,然后点击页面右侧的“创建服务来源”按钮,按照以下提示填写表单后保存提交:
-
- 服务类型:选择DNS域名。
-
- 服务名称:输入
httpbin
。
- 服务名称:输入
-
- 服务端口:填入
80
。
- 服务端口:填入
-
- 域名列表:输入
httpbin.org
。
- 域名列表:输入
- 继续在左侧菜单选择“路由配置”,点击“创建路由”按钮,按以下指示配置:
-
- 路由名称:设定为
my-route
。
- 路由名称:设定为
-
- 匹配规则:选择精确匹配,并填写路径
/get
。
- 匹配规则:选择精确匹配,并填写路径
-
- 目标服务:从下拉菜单中选择
httpbin.dns
。
- 目标服务:从下拉菜单中选择
测试生效
为了验证配置是否正确及路由是否正常工作,可以在浏览器或通过命令行工具执行如下请求:
curl http://localhost:8080/get
如果一切顺利,你将会看到一个JSON对象作为响应,它包含了发送此GET请求的相关信息,这意味着你的请求已经被成功代理到了httpbin.org
。
查看本地配置,了解生效原理
Higress遵循云原生的路由API标准,包括Ingress API和Gateway API。刚才通过控制台完成的所有配置都会转化为对应的YAML格式存储在安装目录下的ingresses
子目录中。你可以查看这些文件来更好地理解背后的运作机制。例如,在你的案例中应该存在一个名为my-route.yaml
的文件,其内容类似于:
annotations:
higress.io/destination: httpbin.dns
higress.io/ignore-path-case: "false"
labels:
higress.io/resource-definer: higress
rules:
- http:
paths:
- backend:
resource:
apiGroup: networking.higress.io
kind: McpBridge
name: default
path: /get
pathType: Exact
这个YAML定义了HTTP请求如何被转发到指定的服务上。
结论
至此,您已经完成了Higress基于Docker的单机版快速部署,并成功实现了对简单HTTP请求的路由处理。值得注意的是,Higress也支持使用Kubernetes等方式来做部署和集成,对于更复杂的应用场景,建议前往Higress官网查阅相关文档获取更多信息。