云原生架构下的 API 网关实践: Kong (一)

API 网关选型

业界有不少流行的 API 网关,开源的有 Nginx、Netflix Zuul、Kong 等。固然 Kong 还有商业版,相似的商业版网关还有 GoKu API Gateway 和 Tyk 等。nginx

GoKu API Gateway 是由国内公司 eolinker 使用 Go 语言研发,拥有社区版和商业版,包含 API Gateway 和 Dashboard 两部分。其中社区版本包含大量基础功能,能够知足中型企业和产品的使用;企业版本包含更多扩展;比较适合大型软件和大型组织使用。git

Tyk 由国外的 TykTechnologies 公司研发,也是基于 Go 语言。Tyk 一切均导向收费版本,免费版本第一次申请有一年的使用受权。后端

下面将会介绍经常使用的 API 网关组件 Nginx、Zuul 和 Kong 的相关特性。api

Nginx

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 的反向代理和负载均衡可实现负载均衡及高可用,除此以外还须要咱们解决自注册和网关自己的扩展性。restful

Netflix Zuul

Zuul 是 Netflix 开源的微服务网关组件,它能够和 Eureka、Ribbon、Hystrix 等组件配合使用。社区活跃,融合于 SpringCloud 完整生态,是构建微服务体系前置网关服务的最佳选型。Zuul 的核心是一系列的过滤器,这些过滤器能够完成如下功能:网络

  • 身份认证与安全:识别每一个资源的验证要求,并拒绝那些与要求不符的请求。
  • 审查与监控:与边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
  • 动态路由:动态地将请求路由到不一样的后端集群。
  • 压力测试:逐渐增长指向集群的流量,以了解性能。
  • 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
  • 静态响应处理:在边缘位置直接创建部分响应,从而避免其转发到内部集群。
  • 多区域弹性:跨越 AWS Region 进行请求路由,旨在实现 ELB(Elastic Load Balancing,弹性负载均衡)使用的多样化,以及让系统的边缘更贴近系统的使用者。

上面说起的这些特性是 Nigix 所没有的,Netflix 公司研发 Zuul 是为了解决云端的诸多问题(特别是帮助 AWS 解决跨 Region 状况下的这些特性实现),而不只仅是作一个相似于 Nigix 的反向代理,固然,咱们能够仅使用反向代理功能,这里很少作描述。

Zuul 目前有两个大的版本:Zuul1 和 Zuul2。

  • Zuul1 是基于 Servlet 框架构建,如图所示,采用的是阻塞和多线程方式,即一个线程处理一次链接请求,这种方式在内部延迟严重、设备故障较多状况下会引发存活的链接增多和线程增长的状况发生。
  • Netflix 发布的 Zuul2 有重大的更新,它运行在异步和无阻塞框架上,每一个 CPU 核一个线程,处理全部的请求和响应,请求和响应的生命周期是经过事件和回调来处理的,这种方式减小了线程数量,所以开销较小。

Kong

Kong 是 Mashape 开源的高性能高可用 API 网关和 API 服务管理层,一款基于 Nginx_Lua 模块写的高可用服务网关,因为 Kong 是基于 Nginx 的,因此能够水平扩展多个 Kong 服务器。经过前置的负载均衡配置把请求均匀地分发到各个 Server,来应对大批量的网络请求。

Kong 主要有三个组件:

  • Kong Server :基于nginx的服务器,用来接收 API 请求。
  • Apache Cassandra/PostgreSQL:用来存储操做数据。
  • Kong dashboard:官方推荐 UI 管理工具,固然,也可使用 restfull 方式管理 admin api。

Kong 采用插件机制进行功能定制,插件集(能够是 0 或 N 个)在 API 请求响应循环的生命周期中被执行。插件使用 Lua 编写,基础功能包括:HTTP 基本认证、密钥认证、CORS(Cross-Origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API 请求限流、请求转发以及 Nginx 监控等。

Kong 网关具备如下的特性:

  • 可扩展性: 经过简单地添加更多的服务器,能够轻松地进行横向扩展,这意味着您的平台能够在一个较低负载的状况下处理任何请求;
  • 模块化: 能够经过添加新的插件进行扩展,这些插件能够经过RESTful Admin API轻松配置;
  • 在任何基础架构上运行: Kong 网关能够在任何地方都能运行。能够在云或内部网络环境中部署 Kong,包括单个或多个数据中心设置,以及 public,private 或 invite-only APIs。

动态负载均衡、基于散列的负载均衡、断路器、健康检查、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。下面咱们将重点介绍。

更多内容,欢迎订阅。

相关文章
相关标签/搜索