Kong最佳实践(二)- Kong网关深入探索
简介
在本篇文章中,我们会带大家深入探索API网关Kong,我们将详细对比它与其它Web服务器Apache、Nginx、OpenResty之间的区别。下面,我们将带领大家发现它们作为服务器时,页面表现的最显著差别,在浏览器中随便打开一个网页鼠标右击检查,选择网络/Network,选择Name列中第一个单击查看Response Headers,如下图所示:
它们近些年的市场份额如下图所示:
由于Kong、OpenResty本身是基于Nginx,所以它们未单独列出,而是归于Nginx服务器,Apache与这三者没有任何联系,在这就不详细介绍了。本篇文章将详细介绍以下三点:
- Nginx
- OpenResty
- Kong、Nginx、OpenResty三者对比
1 Nginx
1.1 发展历程
1.1.1 起源
Nginx起源于2000年,由伊戈尔·赛索耶夫[1]开发;并在2004年公开发布第一个版本0.1.0。
1.1.2 背景
在当时,随着互联网的普及,人们接触互联网的机会越来越多,导致其请求数快速增长,而当时Web服务Apache[2]使用一个连接对应一个进程的架构模型已经不足以支撑C10K[3]的场景。Nginx利用异步事件驱动的架构写成。是一个高性能HTTP和反向代理服务,Nginx的出现解决了当时C10K问题。
1.2 优缺点
1.2.1 优点
- 开源产品;
- 采用BSD开源协议;
- 使用成本低廉;
- 高并发、高性能、高稳定;
- 支持热部署;
- 模块功能丰富。
1.2.2 缺点
- 不可通过URL来对后端服务进行健康检查;
- 动态处理差,难以定制化,不易修改。
1.3 工作模式
1.3.1 单进程模式
Nginx修改主配置文件将worker_processes参数设置为1,启动后只有一个进程,所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb[4]等工具进行调试。该模式不支持Nginx平滑升级功能,任何信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。
1.3.2 多进程模式
Nginx启动成功后,在多进程模式中,会有一个Master进程和至少一个Worker进程:
- Master进程:对外用于接收外部信号,对内根据外部信号,管理 Worker进程,并监控Worker进程的运行状态,当Worker进程异常终止后,自动重启Worker进程;
- Worker进程:用来实际处理请求,它的进程数量通过配置文件来设置,一般设置为CPU核心数,充分利用CPU资源,避免进程数量过多,竞争CPU资源,增加上下文切换的损耗。
1.4 Nginx 使用成本
1.4.1 使用成本
Nginx开箱即用,下面为Docker安装方式:
# 下载镜像
docker pull nginx
# 运行镜像
docker run -d -p 80:80 nginx:latest
浏览器输入localhost:80即可访问,效果如下:
1.4.2 开发成本
Nginx模块使用C语言编写,开发水平高,难度大,开发周期长,而且开发模块必须熟悉Nginx源代码,这对于开发者来说,成本太高。
1.4.3 维护成本
Nginx将access与error日志,通过文件的形式打印在系统指定目录中,在nginx.conf配置文件中可自定义日志格式、日志内容,可通过Filebeat[5]中间件将Nginx日志集成进ELK平台中。通过node_export[6]收集Nginx的监控数据,展现在Grafana中,可设置一些硬件指标监控报警。
1.5 应用场景 & 发展趋势
1.5.1 应用场景
-
动静分离
[7]:当我们需要把网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源拆分以后,可根据静态资源的特点将其做缓存操作; -
反向代理
:当业务服务器由于一些原因不能被外部网络直接访问时,我们需要一台Nginx作为代理服务器,它即能被外部网络访问,同时又和业务服务器联通; -
统一访问入口
:当有多套业务系统时,如何使用同一个IP或域名进行访问,Nginx设置Localtion规则匹配不同的后缀转发至不同的业务服务器; -
负载均衡
:分布式架构中按照一定的策略分发至后端多台业务服务器,实现业务服务的高可用及高并发; -
行为分析
:可通过整个系统访问的浏览器信息、IP、地理位置、操作系统等信息作为项目上大数据展示的初始数据来源。
1.5.2 发展趋势
Nginx作为款开源的软件,始终关注于提供可以为工程师带来自由与灵活度的解决方案,现阶段微服务架构的兴起,Nginx也在作出改变,它可以作为Kubernetes集群中服务部署的入口,未来更多的倾向于微服务架构。
2 OpenResty
2.1 发展历程
2.1.1 起源
OpenResty诞生于2007年,不过它的第一个版本并没有选择Lua,而是用了Perl[8],这与作者章亦春[9]的技术偏好有很大关系,但Perl的性能远远不能达到要求,于是,在第二个版本中,Perl就被Lua给替换了。
2.1.2 背景
Nginx有很多的特性和好处,但是在Nginx上开发却成了一个难题,Nginx模块开发需要使用C语言,而且必须符合一系列复杂的规则,最重要的用C语言开发模块必须要熟悉Nginx源代码,使得开发者对其望而生畏。为了开发人员方便,所以有了一种整合了Nginx和Lua的框架,那就是OpenResty,它帮我们实现了可以用Lua的规范开发,随着系统架构的不断升级、优化,OpenResty在被广泛的应用。
2.1.3 定位方向
OpenResty是一个基于Nginx与Lua的高性能Web平台,内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。它的目标就是让你的Web服务直接跑在Nginx服务内部,充分利用 Nginx 的非阻塞I/O模型,对 HTTP 客户端请求和远程后端都进行一致的高性能响应。
2.2 优缺点
2.2.1 优点
- 开源产品,运作方式多样;
- 详尽的文档和测试用例;
- 同步非阻塞编程范式。
2.2.2 缺点
- 所有功能源自Nginx,也就受限于Nginx;
- 定制OpenResty网关需要掌握Lua语言,开发成本较高。
2.3 工作模式
OpenResty的Master与Work进程中都包含了一个LuaJIT[10] VM,在同一个进程内的所有协程都会共享这个VM,并在这个VM中运行Lua代码,而在同一时间上,每个Worker进程只能处理一个用户的请求,也就是只有一个协程在运行,如果代码中出现一些查询数据库的I/O操作,它就会先调用Lua协程的yieId把自己挂起,然后在Nginx中注册,等这个查询的操作结束后,回调resume来唤醒Lua协程,这样就完成了Lua协程和Nginx事件驱动的配合。如下图:
2.4 OpenResty成本
2.4.1 使用成本
OpenResty开箱即用,下面为Docker安装方式:
# 下载镜像
docker pull openresty/openresty
# 运行镜像
docker run -d -p 80:80 openresty/openresty
浏览器输入localhost:80即可访问,效果如下:
2.4.2 开发成本
OpenResty本身就是一个Web开发平台,官网中有大量测试用例,较少学习成本,对于开发者来说,使用Lua脚本语言开发,降低了开发门槛,大大缩短了开发周期。
2.4.3维护成本
OpenResty可以使用nginx-module-vts模块来实现与Promehtues和Grafana的紧密结合,监控指标齐全,日志文件与Nginx相同,使用Filebeat收集日志集成进ELK平台中。
2.5 应用场景 & 发展趋势
2.5.1 应用场景
OpenResty在融合了Lua之后所做的功能非常多,当一个请求真正到达上游服务之前,Lua代码中可以对来源请求做复杂的访问控制和安全检查,而且可以随意的修改header信息,还可以从外部存储中捕获后端信息,从这些信息中选择哪一个后端来完成业务访问,在Rewrite阶段,通过Lua代码完成非常复杂的处理,在Nginx子查询、Location调用中,通过Lua实现高级缓存机制,Lua代码中可以使用各种Nginx模块,没有任何限制,对硬件资源的使用非常小。
2.5.2 发展趋势
OpenResty一个全功能的Web应用服务器,基于OpenResty也演化了一些产物,例如Kong,一个API网关产品,在未来可能会有更多基于OpenResty开发出性能更优的API网关产物。
3 Kong、Nginx、OpenResty三者对比
3.1 三者之间的关系
- Nginx是模块化设计的反向代理
软件
,使用C语言开发; - OpenResty是以Nginx为核心的Web
开发平台
,揉合了Lua脚本; - Kong是OpenResty的一个
应用
,是一个API网关,基于API管理和请求代理的功能。
3.2 Kong 如何优胜
3.2.1 对比Nginx
Nginx使用C语言开发,而Kong基于Lua编写,开发周期远远低于Nginx,Kong加载新插件功能也是非常快速便捷,只需在放入指定目录中,修改配置文件中的路径,reload服务即可加载,如果不想停机加载,可以使用kong prepare
kong reload
命令来实现,而Nginx加载新的模块,则需要重新编译安装才可以使用。
3.2.2 对比OpenResty
OpenResty是以Nginx为核心的Web开发平台,在现阶段的微服务架构中,不能像Kong一样系统的管理服务,而且在维护过程中,如果有大量的Lua文件,这些文件如何统一的管理,Kong帮我们做的就是在使用通用功能时,就能开箱即用,即使需要二次开发新的功能或修改原有功能,也能最大的帮助我们减少开发周期,Kong是经过了历史的沉淀,有许多大型公司合作伙伴:AWS、IBM、Red-Hat等等。
3.3 三者未来趋势
Kong、Nginx、OpenResty三者紧密结合。相信OpenResty会在原有的基础上,开发出与Kong一样的API网关产品,而且性能更好,上手简单,功能更加的丰富,Kong的成功离不开Nginx与OpenResty的铺垫,未来发展中,Kong经过历史的洗礼,功能越来越丰富,开发更便捷,更符合未来的架构。
注解
-
伊戈尔·赛索耶夫:Nginx创始人 ↩
-
Apache:世界使用排名第一的Web服务器软件 ↩
-
C10K:1万个并发请求(单台机器) ↩
-
gdb:是GNU项目调试器 ↩
-
Filebeat:本地文件的日志数据采集器 ↩
-
node_export:监控数据采集器,Prometheus的数据来源 ↩
-
动静分离:动态资源(jsp、ftl、thymeleaf)与静态资源(js、css、img)分开部署 ↩
-
Perl:一种程序语言 ↩
-
章亦春:现任CloudFlare Inc.系统工程师,最早在雅虎中国写火狐浏览器扩展和网页信息抽取器,接着在淘宝做数据产品平台。而后因向往田园生活而南下福州专心做开源。供职于美国的CloudFlare 公司,使用自己的技术构建 CDN 需要的软件平台 ↩
-
LuaJIT:实时编译器 ↩