,有点懒怠。最近抽空捣鼓了 Kong 网关的使用实践,微服务网关之前的文章也写过,读者可以翻看之前的文章推送。插件是 Kong 扩展的重要特性,这次除了会介绍 Kong 的相关实践之外,还会讲解 Kong 自定义插件的实现。
业界有很多流行的 API 网关,开源的有 Nginx、Netflix Zuul、Kong 等。当然 Kong 还有商业版,类似的商业版网关还有 GoKu API Gateway 和 Tyk 等。
GoKu API Gateway 是由国内公司 eolinker 使用 Go 语言研发,拥有社区版和商业版,包含 API Gateway 和 Dashboard 两部分。其中社区版本包含大量基础功能,可以满足中型企业和产品的使用;企业版本包含更多扩展;比较适合大型软件和大型组织使用。
Tyk 由国外的 TykTechnologies 公司研发,也是基于 Go 语言。Tyk 一切均导向收费版本,免费版本第一次申请有一年的使用授权。
下面将会介绍常用的 API 网关组件 Nginx、Zuul 和 Kong 的相关特性。
Nginx 可以说是互联网应用的标配组件,主要的使用场景包括负载均衡、反向代理、代理缓存、限流等。
Nginx 由内核和模块组成,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件与客户端请求进行 URL 匹配,用于启动不同的模块去完成相应的工作。
Nginx 在启动后,会有一个 Master 进程和多个 Worker 进程,Master 进程和 Worker 进程之间是通过进程间通信进行交互的,如图所示。Worker 工作进程的阻塞点是在像 select()、epoll_wait() 等这样的 I/O 多路复用函数调用处,以等待发生数据可读 / 写事件。Nginx 采用了异步非阻塞的方式来处理请求,也就是说,Nginx 是可以同时处理成千上万个请求的。
还可以将 Lua 嵌入到 Nginx 中,从而可以使用 Lua 来编写脚本,这样就可以使用 Lua 编写应用脚本,部署到 Nginx 中运行,即 Nginx 变成了一个 Web 容器;这样开发人员就可以使用 Lua 语言开发高性能Web应用了。在开发的时候使用 OpenResty 来搭建开发环境,OpenResty 将 Nginx 核心、LuaJIT、许多有用的 Lua 库和 Nginx 第三方模块打包在一起;这样只需要安装 OpenResty,不需要了解 Nginx 核心和写复杂的 C/C++ 模块就可以,只需要使用 Lua 语言进行 Web 应用开发了。
使用 Nginx 的反向代理和负载均衡可实现负载均衡及高可用,除此之外还需要我们解决自注册和网关本身的扩展性。
Zuul 是 Netflix 开源的微服务网关组件,它可以和 Eureka、Ribbon、Hystrix 等组件配合使用。社区活跃,融合于 SpringCloud 完整生态,是构建微服务体系前置网关服务的最佳选型。Zuul 的核心是一系列的过滤器,这些过滤器可以完成以下功能:
上面提及的这些特性是 Nigix 所没有的,Netflix 公司研发 Zuul 是为了解决云端的诸多问题(特别是帮助 AWS 解决跨 Region 情况下的这些特性实现),而不仅仅是做一个类似于 Nigix 的反向代理,当然,我们可以仅使用反向代理功能,这里不多做描述。
Zuul 目前有两个大的版本:Zuul1 和 Zuul2。
Kong 是 Mashape 开源的高性能高可用 API 网关和 API 服务管理层,一款基于 Nginx_Lua 模块写的高可用服务网关,由于 Kong 是基于 Nginx 的,所以可以水平扩展多个 Kong 服务器。通过前置的负载均衡配置把请求均匀地分发到各个 Server,来应对大批量的网络请求。
Kong 主要有三个组件:
Kong 采用插件机制进行功能定制,插件集(可以是 0 或 N 个)在 API 请求响应循环的生命周期中被执行。插件使用 Lua 编写,基础功能包括:HTTP 基本认证、密钥认证、CORS(Cross-Origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API 请求限流、请求转发以及 Nginx 监控等。
Kong 网关具有以下的特性:
动态负载均衡、基于散列的负载均衡、断路器、健康检查、Websockets、OAuth2.0、日志记录、安全性、Syslog、监控、转发代理、认证、速率限制、故障检测和恢复
笔者在上面小节简要介绍了 Nginx、Zuul 和 Kong 这三种 API 网关组件的功能和特性,并制作了如下的对比表格:
组件/指标 | Nginx | Zuul(1.x) | Kong 社区版 |
---|---|---|---|
API 注册/动态路由 | 在Nginx中配置 | 动态路由 | 通过 Admin API 管理 |
支持协议 | RESTful API | RESTful API | RESTful API |
插件机制 | Lua 插件机制 | 可以基于源码定制开发,基于 Servlet/Filter | Lua 插件机制 |
安全认证 & 鉴权 | 插件支持 | 支持 OAuth、JWT 等 | 支持OAuth2.0、黑白名单、ACL、JWT、SSL 等 |
限流 | 插件 | 插件 | 支持Rate Limiting |
高可用集群 | 配合硬件负载均衡 | 可以通过部署多个 Zuul 做负载均衡 | 支持集群 |
可管理性 | 无 | 没有 GUI 管理台 | 提供 Rest API 交互 |
性能 | 高 | 一般 | 高 |
日志记录 | Nginx 可灵活记日志 | 可自行配置 | 日志可以记录到磁盘,或者HTTP、TCP、UDP发出去 |
总得来说,Zuul 复杂度较低,上手简单,可以自定义开发,但是高并发场景下的性能相对较差;Nginx 性能经受得住考验,配合 Lua 可以引入各种插件,但是功能性相对较弱,需要开发者自身去完善很多功能;Kong 基于 Nginx、OpenResty 和 Lua,对性能要求高,需要对外开放,建议考虑使用 Kong。下面我们将重点介绍。