Nginx、Kong、Apisix、Gateway网关比较

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生 API 网关,700元额度,多规格可选
简介: Nginx、Kong、Apisix、Gateway网关比较

Nginx

Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。能够支撑 5 万并发链接,并且 cpu、内存等资源消耗却非常低,运行非常稳定,由C语言编写。支持负载均衡、限流熔断、热部署、安全认证等。

应用场景

http 服务器:独立提供 http 服务,用于做网页静态服务器

虚拟主机:可以实现在一台服务器虚拟出多个网站

反向代理,负载均衡:多台服务器集群可以使用 nginx 做反向代理

缺陷

Nginx不支持集群管理

Nginx不支持配置的热加载。修改配置重新加载Nginx的时间可能需要半个小时以上

正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。

反向代理我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。

Kong

Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的Gateway项目。Kong是基于Nginx和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。解决了Nginx问题,支持集群部署和热加载。

支持使用插件进行定制功能,但插件基于lua编写,不易维护,目前官网提供的基础插件有:HTTP基本认证、密钥认证、文件日志、API请求限流、请求转发以及Nginx监控。

相关组件

Kong Server:基于nginx的服务器,用来接收API请求。

Apache Cassandra/PostgreSQL:用来存储操作数据。

Kong dashboard:官方推荐UI管理工具,当然,也可以使用restfull方式管理admin api

Kong的网关架构

Kong核心基于OpenResty构建,实现了请求/响应的Lua处理化

Kong插件拦截请求/响应

Kong Restful管理API提供了API/API消费者/插件的管理

数据中心用于存储Kong集群节点信息、API、消费者、插件等信息,目前提供了PostgreSQL和Cassandra支持,如果需要高可用建议使用Cassandra

Kong集群中的节点通过gossip协议自动发现其他节点,当通过一个Kong节点的管理API进行一些变更时也会通知其他节点。每个Kong节点的配置信息是会缓存的,如插件,那么当在某一个Kong节点修改了插件配置时,需要通知其他节点配置的变更。

缺陷

Kong需要依赖于PostgreSQL或Cassandra数据库,这使Kong的整个架构非常臃肿,会带来高可用的问题。如果数据库故障了,那么整个API网关都会出现故障。

Kong的路由使用的是遍历查找,当网关内有超过上千个路由时,它的性能就会出现比较急剧的下降。

APISIX

Apache APISIX基于 nginx(openresty)和 Lua 实现的一款国产软件,是一个动态、实时、高性能的云原生API网关,提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。可以使用ApacheAPISIX处理传统的南北向流量,也可以处理服务间的东西向流量。同时,它也支持作为K8s Ingress Controller来使用。

主要特性

全动态能力:APISIX支持热加载

高性能路由匹配算法:使用压缩前缀树RadixTree,当对某个请求进行匹配时,RadixTree将采用层层递进的方式进行匹配,其复杂度为O(K)(K是路由中URI的长度,与API数量多少无关)。当进行IP匹配时使用Hash的方式进行查找,时间复杂度为O(1),性能更高。

精细化路由:APISIX支持使用Nginx内置变量做为路由的匹配条件,你可以自定义匹配函数来过滤请求,匹配路由。

运维友好:APISIX支持与以下工具和平台集成:Zipkin、SkyWalking、Consul、Nacos、Eureka。通过APISIXDashboard控制台,运维人员可以通过友好且直观的UI配置APISIX。

支持多语言插件:目前官网支持80多种插件(grpc、serverless、skywalking、kafka、es等),也支持通过PluginRunner或者Wasm(运行字节码文件)自定义插件。

APISIX网关架构

数据面:它是真正去处理来自客户端请求的一个组件,去处理用户的真实流量,包括像身份验证、证书卸载、日志分析和可观测性等功能。数据面本身并不会存储任何数据,所以它是一个无状态结构。如果监听etcd的配置信息变更,APISIX就可以将获取最新配置的时间控制在毫秒级别之内,达到实时生效。

控制面:使用etcd存储配置,能更好地体现高可用特性,拥有低于毫秒级别的变化通知。

应用场景

负载均衡和API网关

具备高性能、安全等特性,在负载均衡的服务能力上也更优秀。从Nginx切换到APISIX不仅性能不会下降,而且可以享受到动态、统一管理等特性带来的管理效率的提升。

微服务网关

支持多种语言编写扩展插件,可以解决东西向微服务API网关面临的主要问题(异构多语言和通用问题)。内置支持的服务注册中心有Nacos、Eureka等,可以平滑替代Zuul、Gateway等微服务API网关。(东西向微服务指系统内各个微服务间的调用)

K8s Ingress

官网的 Ingress主要基于Nginx配置文件的方式,使用APISIX Ingress Controller可以支持全动态,无需重启加载。同时继承了APISIX的所有优势,还支持原生KubernetesCRD,方便用户迁移。

Gateway

API网关为微服务架构的系统提供简单、有效 且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。

Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul。旨在为微服务架构提供一种简单且有效的 API 路由的管理方式,并基于Filter 的方式提供网关的基本功能,例如说安全认证、监控、限流等等。Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 实现的响应式的 API 网关。

相关概念

路由:路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成

断言:断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。如果断言为真,则说明请求的URL和配置的路由匹配

过滤器:分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理。默认支持的过滤器有:AddRequestHeader请求头,AddRequestParameter请求参数、RequestRateLimiter限流、Hystrix熔断、Retry重试等20多种过滤器,也支持自定义过滤器。

# 相关配置

spring:

 cloud:

   gateway:

     #设置路由:路由id、路由到微服务的uri、断言

     routes:

       - id: order_route  #路由ID,全局唯一,建议配置服务名

         uri: lb://mall-order  #lb 整合负载均衡器ribbon,loadbalancer

         predicates:

           - Path=/order/**   # 断言,路径相匹配的进行路由

         filters: #过滤器

‐ AddRequestHeader=X‐Request‐color, red  #添加请求头过滤

工作原理

跟 Zuul 的差不多,最大的区别就是 Gateway 的 Filter 只有 pre和 post 两种。

客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发送到网关Web 处理程序, 先执行pre过滤器,再执行代理请求,代理请求完成后执行post 过滤器逻辑。


网关选型

云原生领域APISIX更加优于Kong和Nginx,Apisix 是对标云原生网关的,严格来说和 Spring Cloud Gateway 这种业务形网关没什么可比性。

如果是小公司,架构简单,业务单一,则使用Gateway作为业务网关完全够用,而且还便于定制化扩展。若架构复杂,业务流量大,k8s容器化部署,对标云原生的则可以使用Apisix。也可以Apisix和gateway搭配使用,流量网关使用Apisix,业务网关使用gateway,使用流量网关对公网入口流量进行转发到业务网关,再由业务网关将请求转发至各个系统。


目录
相关文章
|
14天前
|
监控 负载均衡 API
Apache Apisix轻松打造亿级流量Api网关
Apache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上行、灰度发布、熔断、鉴权、可观测等丰富的流量管理功能。适用于处理传统南北向流量、服务间东西向流量及 k8s 入口控制。Airflow 是一个可编程、调度和监控的工作流平台,基于有向无环图 (DAG) 定义和执行任务,提供丰富的命令行工具和 Web 管理界面,方便系统运维和管理。
Apache Apisix轻松打造亿级流量Api网关
|
11天前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
Gateway服务网关
25 1
Gateway服务网关
|
7天前
|
运维 Cloud Native Java
热联集团:从 APISIX 迁移到云原生网关
我们将核心业务系统从 IDC 全栈迁移到阿里云后,并采用了云原生 API 网关,通过其独有的软硬一体的加速方案,相比普通 HTTPS 请求 TLS 握手时延降低一倍,极限 QPS 提升 80% 以上,运维效率也提升了 50%,此外,我们把 Nacos 迁移到 MSE Nacos,稳定性、性能和运维成本等方面都具备了明显的优势。
|
2月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
102 5
|
3月前
|
Java API 微服务
服务网关Gateway
该博客文章详细介绍了Spring Cloud Gateway的使用方法和概念。文章首先阐述了API网关在微服务架构中的重要性,解释了客户端直接与微服务通信可能带来的问题。接着,文章通过具体的示例代码,展示了如何在Spring Cloud Gateway中添加依赖、编写路由规则,并对路由规则中的基本概念如Route、Predicate和Filter进行了详细解释。最后,文章还提供了路由规则的测试方法。
服务网关Gateway
|
4月前
|
负载均衡 应用服务中间件 API
深入理解 Nginx 与 Kong 的配置与实践
在微服务架构中,Nginx 用于配置负载均衡,如示例所示,定义上游`pay-service`包含不同权重的服务节点。Kong API 网关则通过service和route进行服务管理和路由,与Nginx的upstream和location类似。通过Kong的命令行接口,可以创建upstream、target、service和route,实现对后端服务的负载均衡和请求管理。Nginx和Kong协同工作,提供高效、灵活的API管理和流量控制。
128 1
深入理解 Nginx 与 Kong 的配置与实践
|
3月前
|
Java 应用服务中间件 nginx
【Azure Spring Apps】Spring App部署上云遇见 502 Bad Gateway nginx
【Azure Spring Apps】Spring App部署上云遇见 502 Bad Gateway nginx
|
3月前
|
安全 API
【Azure API 管理】APIM Self-Host Gateway 自建本地环境中的网关数量超过10个且它们的出口IP为同一个时出现的429错误
【Azure API 管理】APIM Self-Host Gateway 自建本地环境中的网关数量超过10个且它们的出口IP为同一个时出现的429错误
|
3月前
|
存储 容器
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
|
4月前
|
JSON 前端开发 Java
SpringCloud怎么搭建GateWay网关&统一登录模块
本文来分享一下,最近我在自己的项目中实现的认证服务,目前比较简单,就是可以提供一个公共的服务,专门来处理登录请求,然后我还在API网关处实现了登录拦截的效果,因为在一个博客系统中,有一些地址是可以不登录的,比方说首页;也有一些是必须登录的,比如发布文章、评论等。所以,在网关处可以支持自定义一些不需要登录的地址,一些需要登录的地址,也可以在网关处进行校验,如果未登录,可以返回JSON格式的出参,前端可以进行相关处理,比如跳转到登录页面等。
116 4