• home > tools > webServer > nginx >

    Nginx、Tengine、OpenResty、Kong概念到kong架构概述

    Author:zhoulujun Date:

    Kong 基于 Nginx 来实现 Api Gateway 基本的负载均衡、反向代理等功能。OpenResty 是一个基于 Nginx 的库,它将 Nginx 进行封装,并提供了整个生命周期的 Hook( 钩子 ),使得开发者可以通过 Lua 脚本对 Nginx 进行插件化管理。

    Nginx、OpenResty、Kong 的基本概念和区别联系

    Nginx、OpenRestry、Kong 这三个项目关系比较紧密:

    • Nginx 是模块化设计的反向代理软件,C语言开发;

    • Tengine 是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。但是感觉是一个kpi项目,现在已经停止维护。

    • OpenResty 是以 Nginx 为核心的 Web 开发平台,可以解析执行 Lua 脚本

    • Kong 是 OpenResty 的一个应用,是一个 API 网关,具有API管理和请求代理的功能。

    既然都是基于Nginx,同等条件下在性能方面自然是差异不大的,那么,Tengine和OpenResty跟Nginx的差别到底在哪里呢!?

    首先从模块方面做个对比

    绿色为Nginx共有模块,橙色为Tengine模块,紫色为OpenResty模块

    Nginx

    从表格中显而易见,OpenResty的模块要比前两者多得多,虽然它基于 Nginx 实现,但其适用范围,早已远远超出反向代理和负载均衡。

    Nginx

    Nginx  是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

    Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:

    作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

    作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

    作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

    Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。

    OpenResty

    官方:https://github.com/openresty/openresty

    OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

    OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

    OpenResty强仔哪里?

    • 它的核心是基于 Nginx 的一个 C 模块(lua-nginx-module),该模块将 LuaJIT 嵌入到 Nginx 服务器中,并对外提供一套完整的 Lua API。

    • 我们可以用 Lua 语言来进行字符串和数值运算、查询数据库、发送 HTTP 请求、执行定时任务、调用外部命令等,还可以用 FFI 的方式调用外部 C 函数。这基本上可以满足服务端开发需要的所有功能。

    • 很多的OpenResty 使用者,都把 OpenResty 用在 API 网关的开发上。如Orange、Kong、APISIX,他们都是实时、高性能的 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。

    OpenResty更新迭代非常快,跟nginx也非常紧,社区庞大,一大堆优秀的人在推,支持新的内容也快,使用起来比较放心。

    网关神器Kong

    Kong 是 API 管理的强大效率工具。对需要从事 API 管理的广大开发员来说,它是最出色的工具之一。Kong 是开源工具,具有可扩展性和模块性,可以在任何一种基础设施上运行。多年来,Kong 一直在支持优秀的开发项目,比如 Mashape(世界上规模最大的API市场)。最棒的是,Kong得到了强大的 Nginx 的支持。

    Kong 是由 Mashape 开源的一款具有高性能、高可用特点的云原生架构下的分布式 API 网关。基于 Nginx 和 OpenResty 的 Kong 获得了非常高的性能, Lua

     脚本的插件系统架构设计也使得其具有高扩展性的能力后并不会丢失性能。

    Kong的主要特性

    • Kong 的扩展性:只要增添更多的服务器实例,它就能横向扩展,毫无问题,那样你可以支持更多流量,同时确保网络延迟很短。

    • Kong 的灵活性:它可以部署在单个或多个数据中心环境的私有云或公有云上。它还支持大多数流行的操作系统,比如Linux、Mac和Windows。Kong包括许多实用技巧,以便针对大多数现代平台完成安装和配置工作。

    • Kong 的模块性:它可以与新的插件协同运行,扩展基本功能。可将你的API与许多不同的插件整合起来,以增强安全、分析、验证、日志及/或监测机制。最好的例子之一就是Nginx Plus插件(https://getkong.org/plugins/nginx-plus-monitoring/),该插件提供了服务器实时监测机制,以获得关于负载和请求的度量指标和统计数字。

    • Kong 的生态:虽然 Kong 是开源工具,可供每个人免费使用,但你也能获得企业版,企业版通过电子邮件、电话和聊天提供了快速支持,此外还提供初始安装、从第三方API管理工具来迁移、紧急补丁、热修复程序及更多特性。

    常见的API网关有Nginx、Kong、Zuul、Spring Cloud Gateway等。这些网关都可以提供高可用、高性能和安全的API服务。开发者可以根据自己的需求和场景选择合适的API网关。

    在 IOT 系统架构中,为了保证系统的鲁棒性和高可扩展性。我们需要一个强大的 API 网关来承受住遍布各地的 IOT 设备所传输的信息。插件架构设计的 Kong 使得它具有了强大的兼容性,和可扩展性。TCP 和 UDP

    原始流的支持,更是使得它可以适配多种协议,完美的解决了 IOT 系统中的协议适配问题。

    Kong 的基本架构


    来看一下 Kong 的整体架构。

    • Kong 基于 Nginx 来实现 Api Gateway 基本的负载均衡、反向代理等功能。由 C 语言编写的 Nginx 有着超高的性能和低内存开销。

    • OpenResty 是一个基于 Nginx 的库,它将 Nginx 进行封装,并提供了整个生命周期的 Hook( 钩子 ),使得开发者可以通过 Lua 脚本对 Nginx 进行插件化管理。

    什么是 Hook ?

    钩子编程( hooking ),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook )

     简单来说就是在每个生命周期调用一个函数,而你只要实现这个函数就可以进行中间操作等功能。例如:

     你想要做饭,做饭的整个生命周期可以概括为 洗锅->烧油->放菜->出锅。

     而 Hook 则是在每个步骤中会调用的。比如在洗锅后会调用洗锅的 Hook 、烧油后会调用一个烧油的 Hook 。

     而你则可以实现洗锅的 Hook,在里面做一些事。比如你实现了洗锅的 Hook,其功能是检查锅洗的干不干净。

     那么系统将会在执行到洗锅这个步骤后检查有没有人实现洗锅的 Hook,结果就发现了你声明的检查洗锅的函数。接下来就会调用你写的函数来检查锅洗的干不干净。

    • Kong 使用PostgreSQL 或 Cassandra 来对其配置文件进行持久化存储,使得可以进行集群管理。

    • Kong 提供了插件模型,使用 Lua 脚本来对 Nginx 整个生命周期进行扩展。实现了一些常用插件( 限流、熔断、验权等 )。

    什么是限流与熔断?

    在系统承受到特别大的流量压力时,限流与熔断就显得格外重要。主要用于保护核心服务不会被压力所击垮。

    •  限流:即对访问的客户端进行并发访问速度的限制。

    1. 最简单的拒绝服务,直接将用户的请求拒绝掉。

    2. 服务降级,对一些服务进行降级或直接关闭一些服务。

    3. 特权请求, 可以对一些特殊身份的请求进行放行,其他拒绝。

    4. 可以将请求进行延时处理。

    •  熔断:类似家里的保险丝。熔断器会判断当前服务的存活状态。在服务被击垮后可以由熔断器自行返回错误,而不用继续对请求进行等待与重试。

     Kong 提供了 Http/Rest 的接口来实现配置 ,使得其可以更简单的构建图形化界面进行动态配置。

    为什么使用 Kong?

    了解了Kong 的基本架构,我们来谈谈为什么使用 Kong 与 Kong 的特点。

    • Cloud-Native:与平台无关,Kong可以在任何平台上运行-从裸机到容器-并且可以在本机上的每个云上运行。

    • Kubernetes-Native:使用官方的Ingress Controller通过本地Kubernetes CRD声明性地配置Kong,以路由和连接所有L4 + L7通信。

    • 动态负载平衡:跨多个上游服务对流量进行负载平衡。

    • 基于哈希的负载平衡:具有一致的哈希/粘性会话的负载平衡。

    • 熔断器:智能跟踪不健康的上游服务。

    • 运行状况检查:主动和被动监视您的上游服务。

    • 服务发现:在第三方DNS解析器(例如Consul)中解析SRV记录。

    • 无服务器:直接从Kong调用和保护AWS Lambda或OpenWhisk功能。

    • WebSockets:通过WebSockets与您的上游服务进行通信。

    • gRPC:与gRPC服务进行通信,并通过日志记录和可观察性插件观察流量

    • OAuth2.0:轻松将OAuth2.0身份验证添加到您的API。

    • 日志记录:通过HTTP,TCP,UDP或磁盘记录对系统的请求和响应。

    • 安全性:ACL,僵尸程序检测,允许/拒绝IP等…

    • Syslog:登录到系统日志。

    • SSL:为基础服务或API设置特定的SSL证书

    • 监视:实时监视提供关键的负载和性能服务器指标。

    • 转发代理:使Kong连接到中间透明HTTP代理。

    • 认证:HMAC,JWT,基本等。

    • 速率限制:基于许多变量来阻止和限制请求。

    • 转换:添加,删除或处理HTTP请求和响应。

    • 缓存:在代理层缓存并提供响应。

    • CLI:从命令行控制Kong群集。

    • REST API:Kong可以使用其RESTful API进行操作,以实现最大的灵活性。

    • 地理复制:跨不同区域的配置始终是最新的。

    • 故障检测和恢复:如果您的Cassandra节点之一发生故障,则Kong不会受到影响。

    • 集群:所有Kong节点自动加入集群,并在各个节点之间更新其配置。

    • 可扩展性:Kon本质上是分布式的,只需添加节点即可水平扩展。

    • 性能:Kong通过扩展和使用NGINX作为核心轻松处理负载。

    • 插件:可扩展的体系结构,用于向Kong和API添加功能。




    参考文章:

    Nginx|OpenResty|Tengine--到底该爱谁 https://juejin.cn/post/6918044485586780173

    网关神器Kong(一):介绍 https://cloud.tencent.com/developer/beta/article/1938873



    转载本站文章《Nginx、Tengine、OpenResty、Kong概念到kong架构概述》,
    请注明出处:https://www.zhoulujun.cn/html/tools/webServer/nginx/2023_0509_8946.html