Dromara soul
项目地址:https://github.com/Dromara/soul。
Soul是一个异步的、高性能的、跨语言的、响应式的API网关,提供了统一的HTTP访问。
-
支持各种语言,无缝集成Dubbo和SpringCloud;
-
丰富的插件支持鉴权、限流、熔断、防火墙等;
-
网关多种规则动态配置,支持各种策略配置;
-
插件热插拔,易扩展;
-
支持集群部署,支持A/B Test。
3. 基于Go语言的网关
fagongzi
项目地址:https://github.com/fagongzi/gateway
fagongzi Gateway是一个Go实现的功能全面的API网关,自带了一个Rails实现的Web UI管理界面。
功能特性:流量控制、熔断、负载均衡、服务发现、插件机制、路由(分流,复制流量)、API聚合、API参数校验、API访问控制(黑白名单)、API默认返回值、API定制返回值、API结果Cache、JWT认证、API Metric导入Prometheus、API失败重试、后端Server的健康检查、开放管理API(gRPC、RESTful)、支持WebSocket协议。
Janus
项目地址:https://github.com/hellofresh/janus
Janus是一个轻量级的API网关和管理平台,能实现控制谁、什么时候、如何访问这些REST API,同时它也记录了所有的访问交互细节和错误。使用Go实现API网关的一个好处在于,一般只需要一个单独的二进制文件即可运行,没有复杂的依赖关系。功能特性:
-
热加载配置,不需要重启网关进程;
-
HTTP连接的优雅关闭;
-
支持OpenTracing,从而可以进行分布式跟踪;
-
支持HTTP/2;
-
可以针对每一个API实现断路器;
-
重试机制;
-
流控,可以针对每一个用户或key;
-
CORS过滤,可以针对具体的API;
-
多种开箱即用的验证协议支持,比如JWT、OAuth 2.0和Basic Auth;
-
Docker Image支持。
4. .NET
Ocelot
项目地址:https://github.com/ThreeMammals/Ocelot
功能特性:路由、请求聚合、服务发现(基于Consul或Eureka)、服务Fabric、WebSockets、验证与鉴权、流控、缓存、重试策略与QoS、负载均衡、日志与跟踪、请求头、Query字符串转换、自定义的中间处理、配置和管理REST API。
5. Node.js
Express Gateway
项目地址:
https://github.com/ExpressGateway/express-gateway与https://www.express-gateway.io/
Express Gateway是一个基于Node.js开发,使用Express和Express中间件实现的REST API网关。
功能特性:
-
动态中心化配置;
-
API消费者和凭证管理;
-
插件机制;
-
分布式数据存储;
-
命令行工具CLI。
MicroGateway
项目地址:
https://github.com/strongloop/microgateway与https://developer.ibm.com/apiconnect
StrongLoop是IBM的一个子公司,MicroGateway网关基于Node.js/Express和Nginx构建,作为IBM API Connect,同时也是IBM云生态的一部分。MicroGateway是一个聚焦于开发者,可扩展的网关框架,它可以增强我们对微服务和API的访问能力。
核心特性:
-
安全和控制,基于Swagger(OpenAPI)规范;
-
内置了多种网关策略,API Key验证、流控、OAuth 2.0、JavaScript脚本支持;
-
使用Swagger扩展(API Assembly)实现网关策略(安全、路由、集成等);
-
方便地自定义网关策略。
此外,MicroGateway还有几个特性:
-
通过集成Swagger,实现基于Swagger API定义的验证能力;
-
使用datastore来保持需要处理的API数据模型;
-
使用一个流式引擎来处理多种策略,使API设计者可以更好地控制API的生命周期。
核心架构如图7-9所示。
四大开源网关的对比分析
1. OpenResty/Kong/Zuul 2/SpringCloud Gateway重要特性对比
各项指标对比如表7-1所示。
以限流功能为例:
-
Spring Cloud Gateway目前提供了基于Redis的Ratelimiter实现,使用的算法是令牌桶算法,通过YAML文件进行配置;
-
Zuul2可以通过配置文件配置集群限流和单服务器限流,也可通过Filter实现限流扩展;
-
OpenResty可以使用resty.limit.count、resty.limit.conn、resty.limit.req来实现限流功能,可实现漏桶或令牌通算法;
-
Kong拥有基础限流组件,可在基础组件源代码基础上进行Lua开发。
对Zuul/Zuul 2/Spring Cloud Gateway的一些功能点分析可以参考Spring Cloud Gateway作者Spencer Gibb的文章:https://spencergibb.netlify.com/preso/detroit-cf-api-gateway-2017-03/。
2. OpenResty/Kong/Zuul 2/SpringCloudGateway性能测试对比
分别使用3台4Core、16GB内存的机器,作为API服务提供者、Gateway、压力机,使用wrk作为性能测试工具,对OpenResty/Kong/Zuul 2/SpringCloud Gateway进行简单小报文下的性能测试,如图7-10所示。
图7-10
图中纵坐标轴是QPS,横轴是一个Gateway的数据,每根线是一个场景下的不同网关数据,测试结论如下:
-
实测情况是性能SCG~Zuul 2 << OpenResty~< Kong << Direct(直连);
-
Spring Cloud Gateway、Zuul 2的性能差不多,大概是直连的40%;
-
OpenResty、Kong的性能差不多,大概是直连的60%~70%;
-
大并发下,例如模拟200并发用户、1000并发用户时,Zuul 2会有很大概率返回出错。