微服务网关,如何选择?

什么是API网关

API网关(API Gateway)是微服务架构中的一个关键组件,它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关,客户端无需直接与多个微服务交互,而是通过统一的入口访问后端服务,从而简化了系统的复杂性。

API 网关的主要功能

路由功能:路由是微服务网关的核心能力。通过路由功能微服务网关可以将请求转发到目标微服务。在微服务架构中,网关可以结合注册中心的动态服务发现,实现对后端服务的发现,调用方只需要知道网关对外暴露的服务API就可以透明地访问后端微服务。

负载均衡:API网关结合负载均衡技术,利用Eureka或者Consul等服务发现工具,通过轮询、指定权重、IP地址哈希等机制实现下游服务的负载均衡。

统一鉴权:一般而言,无论对内网还是外网的接口都需要做用户身份认证,而用户认证在一些规模较大的系统中都会采用统一的单点登录(Single Sign On)系统,如果每个微服务都要对接单点登录系统,那么显然比较浪费资源且开发效率低。API网关是统一管理安全性的绝佳场所,可以将认证的部分抽取到网关层,微服务系统无须关注认证的逻辑,只关注自身业务即可。

协议转换:API网关的一大作用在于构建异构系统,API网关作为单一入口,通过协议转换整合后台基于REST、AMQP、Dubbo等不同风格和实现技术的微服务,面向Web Mobile、开放平台等特定客户端提供统一服务。

指标监控:网关可以统计后端服务的请求次数,并且可以实时地更新当前的流量健康状态,可以对URL粒度的服务进行延迟统计,也可以使用Hystrix Dashboard查看后端服务的流量状态及是否有熔断发生。

限流熔断:在某些场景下需要控制客户端的访问次数和访问频率,一些高并发系统有时还会有限流的需求。在网关上可以配置一个阈值,当请求数超过阈值时就直接返回错误而不继续访问后台服务。当出现流量洪峰或者后端服务出现延迟或故障时,网关能够主动进行熔断,保护后端服务,并保持前端用户体验良好。

黑白名单:微服务网关可以使用系统黑名单,过滤HTTP请求特征,拦截异常客户端的请求,例如DDoS攻击等侵蚀带宽或资源迫使服务中断等行为,可以在网关层面进行拦截过滤。比较常见的拦截策略是根据IP地址增加黑名单。在存在鉴权管理的路由服务中可以通过设置白名单跳过鉴权管理而直接访问后端服务资源。

灰度发布:微服务网关可以根据HTTP请求中的特殊标记和后端服务列表元数据标识进行流量控制,实现在用户无感知的情况下完成灰度发布。

流量染色:和灰度发布的原理相似,网关可以根据HTTP请求的Host、Head、Agent等标识对请求进行染色,有了网关的流量染色功能,我们可以对服务后续的调用链路进行跟踪,对服务延迟及服务运行状况进行进一步的链路分析。

文档中心:网关结合Swagger,可以将后端的微服务暴露给网关,网关作为统一的入口给接口的使用方提供查看后端服务的API规范,不需要知道每一个后端微服务的Swagger地址,这样网关起到了对后端API聚合的效果。

日志审计:微服务网关可以作为统一的日志记录和收集器,对服务URL粒度的日志请求信息和响应信息进行拦截。

API 网关的架构和工作原理

在微服务架构中,每个微服务可能负责不同的业务功能,而每个微服务又可能会有多个实例。当客户端发起请求时,API 网关作为所有请求的统一入口,接收并处理这些请求。API 网关的工作原理可以大致描述为:

接收请求:客户端向 API 网关发送请求,而不是直接访问各个微服务。

请求处理:API 网关根据请求内容决定将请求路由到哪个微服务。如果请求需要经过认证,API 网关会先验证请求的合法性。

转发请求:API 网关将请求转发到适当的微服务或服务实例。如果请求需要经过多个微服务的协作,API 网关可能会发起多个请求并聚合结果。

返回响应:API 网关收集微服务的响应,并将它们汇总后返回给客户端。

API网关选型

这些 API 网关是从云原生软件基金会(CNCF)的全景图中摘选的

先简单看一下市面上常用的API网关:

特性 Traefik Kong APISIX (API6) Zuul
架构 轻量级,基于 Go 和 Docker/K8s 集成 高性能,基于 Lua 和 Nginx 高性能,基于 Nginx 和 Lua 基于 Java,Spring Cloud 集成
协议支持 HTTP, HTTPS, WebSocket, gRPC HTTP, HTTPS, gRPC, TCP, UDP HTTP, HTTPS, WebSocket, gRPC HTTP, HTTPS
自动化/集成 自动发现服务,易于容器化环境集成 高度可扩展,支持 Kubernetes 动态路由,云原生支持 集成 Spring Cloud,适用于 Java
插件支持 少量插件支持 丰富的插件生态,支持认证、安全等 丰富的插件支持,功能强大 支持过滤器机制,集成 Spring Cloud
易用性 易于配置,自动化程度高 配置复杂,但功能强大 高度可定制,配置灵活 适合 Java 开发者,集成容易
社区支持 社区活跃,受 Kubernetes 支持 企业级解决方案,活跃的社区 新兴的高性能网关,社区活跃 主要用于 Java 环境,Spring Cloud 支持

选择建议:

如果在 Kubernetes 或容器化环境中工作,Traefik 可能是一个最合适的选择。

如果需要一个功能强大、可扩展并支持高并发的 API 网关KongAPISIX 都是非常优秀的选择,Kong 提供了更多的插件支持,而 APISIX 可能在高性能方面略有优势。

如果使用 Spring CloudJava 技术栈,Zuul 可能是更好的选择,Zuul由于与Spring Cloud深度集成,使用度也很高,近年来Istio服务网格的流行,Ambassador因为能够和Istio无缝集成也是相当大的优势。

相关推荐
007php0072 小时前
go语言zero框架中在线截图chromedp 设置超限的网页长度
java·开发语言·后端·docker·云原生·容器·golang
言之。5 小时前
【k8s面试题2025】2、练气初期
云原生·容器·kubernetes
佛州小李哥6 小时前
如何在亚马逊云科技上消除无服务器网页应用冷启动时间(下篇)
科技·云原生·serverless·云计算·开发·aws·亚马逊云科技
阿里云云原生6 小时前
云消息队列 Kafka 版 V3 系列荣获信通院“云原生技术创新标杆案例”
分布式·云原生·kafka
斯普信专业组8 小时前
Zookeeper 配置文件:核心参数优化与实操指南
分布式·zookeeper·云原生
秒云1 天前
MIAOYUN信创云原生项目亮相西部“中试”生态对接活动
云原生·云计算·创业创新·信创·中试·成果转化
ZPC82101 天前
Docker获取 Ubuntu 镜像
云原生·eureka
小峰编程1 天前
Linux浅谈——管道、网络配置和客户端软件的使用
linux·运维·服务器·网络·windows·云原生·ai原生
前端 贾公子1 天前
如何在Mac上彻底删除Docker及其相关组件:清理指南
spring cloud·云原生·eureka