学会Kong网关,能让你年薪百万!!!

Kong最佳实践(二)- Kong网关深入探索

简介

在本篇文章中,我们会带大家深入探索API网关Kong,我们将详细对比它与其它Web服务器ApacheNginxOpenResty之间的区别。下面,我们将带领大家发现它们作为服务器时,页面表现的最显著差别,在浏览器中随便打开一个网页鼠标右击检查,选择网络/Network,选择Name列中第一个单击查看Response Headers,如下图所示:

Nginx.png
OpenResty.png
Kong.png
Apache.png

它们近些年的市场份额如下图所示:

市场份额折线统计图.png
市场份额统计图.png

由于Kong、OpenResty本身是基于Nginx,所以它们未单独列出,而是归于Nginx服务器,Apache与这三者没有任何联系,在这就不详细介绍了。本篇文章将详细介绍以下三点:

  1. Nginx
  2. OpenResty
  3. 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单进程模式图 .png

Nginx修改主配置文件将worker_processes参数设置为1,启动后只有一个进程,所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb[4]等工具进行调试。该模式不支持Nginx平滑升级功能,任何信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用

1.3.2 多进程模式
Nginx多进程模式图.png

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即可访问,效果如下:

Nginx.png
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 应用场景
  1. 动静分离[7]:当我们需要把网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源拆分以后,可根据静态资源的特点将其做缓存操作;
  2. 反向代理:当业务服务器由于一些原因不能被外部网络直接访问时,我们需要一台Nginx作为代理服务器,它即能被外部网络访问,同时又和业务服务器联通;
  3. 统一访问入口:当有多套业务系统时,如何使用同一个IP或域名进行访问,Nginx设置Localtion规则匹配不同的后缀转发至不同的业务服务器;
  4. 负载均衡:分布式架构中按照一定的策略分发至后端多台业务服务器,实现业务服务的高可用及高并发;
  5. 行为分析:可通过整个系统访问的浏览器信息、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工作模式图.png

OpenResty的Master与Work进程中都包含了一个LuaJIT[10] VM,在同一个进程内的所有协程都会共享这个VM,并在这个VM中运行Lua代码,而在同一时间上,每个Worker进程只能处理一个用户的请求,也就是只有一个协程在运行,如果代码中出现一些查询数据库的I/O操作,它就会先调用Lua协程的yieId把自己挂起,然后在Nginx中注册,等这个查询的操作结束后,回调resume来唤醒Lua协程,这样就完成了Lua协程和Nginx事件驱动的配合。如下图:

Work线程工作图.png

2.4 OpenResty成本

2.4.1 使用成本

OpenResty开箱即用,下面为Docker安装方式:

# 下载镜像
docker pull openresty/openresty
# 运行镜像
docker run -d -p 80:80 openresty/openresty

浏览器输入localhost:80即可访问,效果如下:

OpenResty.png
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、OpenResty、Kong关系图.png
  • 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经过历史的洗礼,功能越来越丰富,开发更便捷,更符合未来的架构。


注解


  1. 伊戈尔·赛索耶夫:Nginx创始人

  2. Apache:世界使用排名第一的Web服务器软件

  3. C10K:1万个并发请求(单台机器)

  4. gdb:是GNU项目调试器

  5. Filebeat:本地文件的日志数据采集器

  6. node_export:监控数据采集器,Prometheus的数据来源

  7. 动静分离:动态资源(jsp、ftl、thymeleaf)与静态资源(js、css、img)分开部署

  8. Perl:一种程序语言

  9. 章亦春:现任CloudFlare Inc.系统工程师,最早在雅虎中国写火狐浏览器扩展和网页信息抽取器,接着在淘宝做数据产品平台。而后因向往田园生活而南下福州专心做开源。供职于美国的CloudFlare 公司,使用自己的技术构建 CDN 需要的软件平台

  10. LuaJIT:实时编译器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,277评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,777评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,946评论 0 245
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,271评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,636评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,767评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,989评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,733评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,457评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,674评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,155评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,518评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,160评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,114评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,898评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,822评论 2 280
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,705评论 2 273