本文介绍云原生网关和其他网关的区别,供您选择网关时使用。
概览
通过各网关的产品定位及语言栈和各网关产品的功能对比您可以了解各网关的产品定位、使用语言栈和具体可以实现哪些功能,从功能详情您可以了解网关具体功能的使用场景等信息。
内容 | 说明 |
介绍各个网关的产品定位和使用的语言栈。 | |
从各个功能对比网关的能力。 | |
对如下功能的使用场景等信息解释说明。 |
各网关的产品定位及语言栈
网关产品 | 产品定位 | 语言栈 |
云原生网关 |
| C++ |
传统的微服务网关,完善SpringCloud生态,替代原Zuul 1.0网关,基于Java Filter扩展。 | Java | |
传统的微服务网关,Zuul 1.0作为SpringCloud生态中的网关,目前已被SpringCloud Gateway替代,Zuul 2.0 SpringCloud生态未合入。 | Java | |
基于Nginx构建高性能、可扩展的微服务API网关。和传统API网关相比,具备动态路由、插件热加载、gRPC协议转换等功能,适合微服务体系下的API管理。基于Lua插件扩展。 | C | |
Ambassador | 基于Envoy构建的原生支持K8s Ingress的下一代API网关,开源品牌Emissary-ingress。 | C++ |
基于Envoy构建的功能丰富、原生支持K8s Ingress的下一代API网关。 | C++ | |
Nginx | 传统的流量网关,以稳定性与高性能著称,采用Reload机制更新配置。 | C |
安全、可扩展的微服务API网关,提供Golang扩展机制。 | Golang | |
Kong | 基于Nginx构建高性能、可扩展的、平台无关的云原生API网关。使用Lua插件扩展。 | C |
各网关产品的功能对比
本文基于如下功能横向介绍各网关产品的特性。关于下表中各个功能的应用场景等详细信息,请参见下文的功能详情。
下表中,表示支持此功能,表示不支持此功能。
功能 | 子功能 | 云原生网关 | Spring Cloud Gateway | Zuul | APISIX | Ambassador | Gloo | Nginx | Traefik | Kong |
Ingress支持 | ||||||||||
支持协议 | HTTP | |||||||||
HTTPS | ||||||||||
gRPC | ||||||||||
HTTP 2 | ||||||||||
WebSocket | ||||||||||
协议转换 | HTTP转Dubbo | |||||||||
路由配置 | Host | |||||||||
Path | ||||||||||
Header | ||||||||||
Query | ||||||||||
Rewrite | ||||||||||
重定向 | ||||||||||
Header新增、修改、删除 | ||||||||||
超时 | ||||||||||
跨域 | ||||||||||
重试 | ||||||||||
流量灰度 | 金丝雀 | |||||||||
A/B测试 | ||||||||||
基于权重的流量比例分发 | ||||||||||
标签路由 | ||||||||||
服务发现 | IP+Port | |||||||||
DNS | ||||||||||
K8s | ||||||||||
Nacos | ||||||||||
Eureka | ||||||||||
ZooKeeper | ||||||||||
Consul | ||||||||||
后端服务负载均衡策略 | 轮询 | |||||||||
最小请求数 | ||||||||||
随机 | ||||||||||
最小连接数 | ||||||||||
最小RT | ||||||||||
预热(无损上线) | ||||||||||
一致性哈希 ring_hash算法 | ||||||||||
一致性哈希 maglev算法 | ||||||||||
会话保持Sticky sessions | ||||||||||
后端服务配置 | TLS/MTLS | |||||||||
主动健康检测 | ||||||||||
无损下线 | ||||||||||
服务版本 | ||||||||||
认证鉴权 | JWT | |||||||||
OIDC(OAuth 2) | ||||||||||
Key-Auth | ||||||||||
Basic-Auth | ||||||||||
Hmac-Auth | ||||||||||
OPA(Open Policy Agent) | ||||||||||
阿里云应用身份服务IDaaS | ||||||||||
自定义认证鉴权 | ||||||||||
IP黑白名单 | ||||||||||
限流降级 | 本地限流 | |||||||||
集群限流 | ||||||||||
降级 | ||||||||||
熔断 | ||||||||||
WAF防护 | ||||||||||
插件市场 | Wasm插件 | |||||||||
Tracing | Zipkin | |||||||||
Skywalking | ||||||||||
Jaeger | ||||||||||
Datadog | ||||||||||
访问日志 | Access log | |||||||||
监控指标 | Metrics | |||||||||
报警 | ||||||||||
高可用 | 文件缓存 | |||||||||
过载保护 | ||||||||||
推空保护 | ||||||||||
性能 | TLS硬件加速 |
功能详情
Ingress支持
满足用户希望使用YAML方式配置Ingress网关。
协议转换
Dubbo服务常用于内部系统,若您希望将内部Dubbo服务暴露给外部用户时,可以选择HTTP转Dubbo。
云原生网关支持白屏化操作,您只需简单配置即可完成协议映射,极大地提升黑屏YAML等配置的效率与可靠性。
路由配置
Host:根据Host匹配请求URL中的域名。
Path:根据Path配置请求URL中的路径。
Header:根据Header配置请求中的请求头。
Query:根据Query配置请求中的参数。
重写:适用于对请求Host或者Path重写,通常用于API管理。例如,对外暴露的请求URL是www.example/my/test而后端服务的API是www.inner-api.com/test。
重定向:标准重定向,通常适用于业务的域名迁移、API变动的场景。
Header新增、修改、删除:适用于对原始请求/响应Header修改。例如,流量打标时需要在链路第一跳新增特殊标时添加Header key/value。
超时:适用于配置网关与后端业务的最大超时时间。
跨域:适用于某些请求需要配置跨域访问的场景。
重试:适用于配置网关与后端业务通讯时的重试策略。例如,根据后端状态码配置重试次数。
流量灰度
金丝雀:通常适用于新版本的小流量测试验证。利用网关的多服务或多版本路由可实现。
A/B测试:通常适用于使用相似的两个或多个版本分别让相似的目标客户随机使用,以验证用户体验、市场推广等是否正确。利用网关的多服务或多版本路由可实现。
基于权重的流量比例分发:适用于自定义比例的多服务流量分发。例如ServiceA、ServiceB和ServiceC三个服务,并划分流量比例分别为10、20和70。
标签路由:适用于需要根据后端服务的标签或者元信息划分版本,并对每个版本指定不同的流量比例。例如,根据Service的label Version值划分为v1、v2和v3三个版本,流量比例划分为20、40和40。
说明可以使用MSE服务治理的标签路由提供全链路灰度能力。
服务发现
IP+Port:适用于后端服务是传统物理机模式,采用固定IP+Port对外提供访问。
DNS:适用于后端服务通过域名方式提供访问。
K8s:适用于后端服务是K8s Service。
云原生网关支持阿里云ACK和ASK,即只要ACK容器服务可以托管的集群,都可以支持服务发现。
Nacos:适用于后端服务为典型的微服务场景,并采用Nacos作为注册中心。Dubbo服务使用较多。
Eureka:适用于后端服务为典型的微服务场景,并采用Eureka作为注册中心。
Zookeeper:适用于后端服务为典型的微服务场景,采用Zookeeper作为注册中心。Dubbo服务使用较多。
Consul:适用于后端服务为典型的微服务场景,采用Consul作为注册中心。
后端服务负载均衡策略
轮询:使用广泛、稳定的负载均衡策略,也是默认策略,即网关对于后端节点一视同仁,忽略不同节点之间的性能差异。目前在服务发现场景下加权轮询策略很难应用,因为需要动态调整每个节点的权重值。
最小请求数:流量调度到请求最少的后端节点,通常适用于需要优先将请求调度到新扩节点场景。
随机:适用于大请求流量,因为程序上没有真正的随机,小流量时会导致后端节点请求不均。
最小连接数:流量调度到连接数最少的后端节点,但流量调度精细度不如最小请求数,较适用于短连接场景。一般该策略使用较少。
最小RT:适用于对请求RT敏感的场景,流量调度时优先调度响应时间最小的节点,要求后端业务在稳定性、性能上都较好。
预热(无损上线):适用于新扩容业务节点平滑上线的场景,例如,典型的Java应用在新扩容时需要请求流量从小到大线性增加,以保证程序对数据库链接等做预热。
一致性哈希ring_hash算法:适用于需要根据Header某些字段做流量调度的场景。
一致性哈希Maglev算法:适用于需要根据Header某些字段做流量调度的场景。简单来说Maglev相比ring_hash散列效果更优,Envoy默认采用该算法。
会话保持Sticky Sessions:一致性哈希的具体应用场景,例如基于源IP的会话保持。
后端服务配置
TLS/MTLS:适用于网关转发给后端服务时要求使用HTTPS的高安全场景,例如零信任。
主动健康检测:网关主动检测后端节点是否健康,适用于对注册中心服务推送时延敏感或ECS场景。
无损下线:适用于对下线要求较高的场景,后端业务下线时通过在Response中添加下线标识,网关识别到该标识后主动将该节点拉黑。
使用条件:后端业务使用MSE服务治理。
服务版本:根据服务的元信息对服务下面的IP地址做进一步分类。例如,根据Version标签分为v1和v2等多版本,通常用于金丝雀灰度。
使用条件:目前支持K8s label与Nacos Metadata。
认证鉴权
JWT:目前业界使用广泛的认证方案,适用于API认证。
OIDC(OAuth2):一种使用OAuth 2.0协议构建的简单身份协议和开放标准,相比JWT更安全,通常用在三方账号登录认证,例如某App支持使用微信、支付宝账号登录。
Key-Auth:基于API Key实现身份认证和鉴权,通常用于API网关的认证。
Basic-Auth:基于HTTP Basic Auth标准实现身份认证和鉴权,典型的场景是内部访问某系统时需要输入用户名和口令的场景,但因安全性较低不适合公网访问。
Hmac-Auth:基于HMAC算法为HTTP请求生成不可伪造的签名,并基于签名实现身份认证和鉴权,常用于API之间的互调认证。
OPA(Open Policy Agent):Open Policy Agent(OPA)是CNCF下开源的通用策略引擎。OPA提供了一种高级声明式的语言(Rego)来编写安全策略,OPA可以和K8s结合提供安全认证。
阿里云应用身份服务IDaaS:适用于用户希望托管认证鉴权,或者希望系统支持外部用户体系登录认证。例如,支付宝和淘宝集成IDaaS让用户快速具备认证登录能力,省去开发成本。
自定义认证鉴权:适用于用户有自己的认证逻辑,且认证时使用的数据较为敏感。存量客户往往有自建认证服务,这种情况可以将认证服务路由到用户自定义认证服务器。
IP黑白名单:适用于对某个特定IP或IP段设置访问权限。针对东西向网关做白名单控制比较安全,针对南北向网关加黑名单过滤攻击IP。
限流降级
本地限流:适用于单节点限流,每个节点的限流值是一个静态数值。
集群限流:适用于全局精确控制限流,每个节点的请求数会实时上报给全局限流调度中心来动态决策。
降级:适用于异步场景因流量突发后端节点来不及处理时,在网关侧配置降级配置来保障用户请求不中断,后续根据日志等后台补充未处理任务。
熔断:适用于因某些原因后端节点无法正常服务时网关临时拉黑该节点。例如,配置后端连续N次返回500错误时拉黑M秒。
WAF防护
适用于拦截一些非法流量。例如爬虫扫描、流量攻击等。
云原生网关集成阿里云WAF产品,业务流量不需要经过WAF网关,RT更短、成本更低。
插件市场(Wasm插件)
适用于网关标准功能无法满足用户诉求,希望扩展插件挂载到网关中。
Tracing
Zipkin:云原生网关对接阿里云应用实时监控服务ARMS,默认提供企业级链路监控大盘。
Skywalking:云原生网关支持对接三方的Skywalking。
访问日志
用户可以存储访问日志,基于访问日志做二次开发,例如审计等。
云原生网关对接阿里云日志服务SLS,方便投递日志到用户存储。
监控指标(Metrics)
对网关的指标类数据的监控,例如请求成功率、请求RT等。
云原生网关对接阿里云应用实时监控服务ARMS Prometheus,默认提供业务监控大盘,包括全局以及服务级指标。
报警
用户对网关的指标需要做监控与报警。
云原生网关对接阿里云应用实时监控服务ARMS,不仅提供内置的常用告警模板,也支持用户自定义告警。
高可用
文件缓存:在网关控制面和后端注册中心不可用的场景下,保证数据面服务是持续可用的。若Nginx遇到api-server宕机的场景,服务直接中断。
过载保护:在网关数据面节点的CPU或Memory达到预警值后拒绝接受新建链接,保证数据面服务持续可用,防止压力过大整个集群雪崩。
推空保护:在网关控制面因非预期原因推送给数据面空数据时,数据面拒绝执行更新,以保证数据面服务持续可用。
性能(TLS硬件加速)
对HTTPS性能要求较高的场景,网关结合CPU对TLS卸载做硬件加速。