kong组件_技术趣读 | Kong与Nginx的媒介—Openresty

82455a1def25ea04f8377d2d9b5f290c.png

f1ccfb881c0ffc24a7adbe124f82ec3e.png

着上次说的话题,我们来看看Kong又是怎么和Nginx互动的,要揭开它们的神秘面纱之前,咱们还得先聊聊Nginx的架构模型。

Nginx采用的是Master-Worker模型,一个Master进程管理多个Worker进程,基本的事件处理都放在 Worker 中,Master负责部分全局初始化以及对Worker的管理。Master进程监控着 Worker进程的运行状态,当 Worker进程因异常情况退出后,会自动启动新的 Worker进程,请求方不会有任何感觉。

为了一窥全貌,这里引用下Nginx官方的架构图,如果你的嗅觉足够,肯定会发现一些有技术含量的东西,这图可是弥漫着众多高可用性的强大气息啊。

b5a13dab1f605fd35528913905686eef.png

关于内部功能模块,Nginx主要有5大块,分别是核心模块、配置模块、事件模块、HTTP模块、Mail模块。配置模块和核心模块是其他模块的基础,事件模块则是HTTP模块和Mail模块的基础。

a83932d97d6bf263481d241fda446bfb.png

而HTTP模块处理几乎所有用户客户端发起的请求,请求通过Master进入Worker进程主循环后,系统会根据请求调用11个阶段的处理模块,其中有7个阶段可以调用第三方的处理模块,几乎包含了所有的解析阶段,这就是我们经常会说的业务可扩展的切入点,在不需要调整Nignx源码的情况下而实现功能插件的调用,只不过被Nginx调用的功能插件是需要基于C/C++语言编写的,但这已不是重点,重要的是为满足企业不同的业务需求而打开了潘多拉盒子。

fc8dd7b5062d475c2a3a775f63d1e51a.png

窥探了Nginx架构模型后,我们再看看OpenResty又是什么?

简单的说是ngx_http_lua_module插件模块、Nginx、Luajit三者的整合,是Nginx的扩展,并提供了诸多公共组件供开发插件调用,安装OpenResty就不需要再安装Nginx了。当然!如果不想用OpenResty而直接用Nginx搭配ngx_http_lua_module和Luajit也是可以的,完全满足喜欢走不寻常路的技术大咖们,这有点像组装机和品牌机的区别,只要够专业,搭配随意,变腐朽为传奇往往也只是一念之间而已。

Kong启动意味着OpenResty启动,也就等同于Nginx的启动,Kong会把配置文件通过OpenResty最终传递给Nginx。在OpenResty中Nginx启动会自动装载ngx_http_lua_module插件模块,该模块扩展了Nginx可支持的几个阶段。

在来自外部请求触发后,Nginx会调用ngx_http_lua_module插件模块中相应的方法,而这些方法已经集成了Luajit库的解析接口,会由LuaVM来解析用lua语言编写的脚本模块,这就是整个Kong的业务模块与Nginx交互的基本处理过程。

到这里也已解决了不会C/C++语言却又想编写Nginx插件模块的问题,做运维的兄弟们可以洗洗睡了。

c7ea32fe2d5b9bf39c80bbd0608066df.png

OpenResty的作用就像媒介或桥梁,解决了原本并不能连接的两个端点,既然是连接自然是双向的,在Luajit库中除了提供C/C++语言调用lua语言外,也提供了FFI接口从lua语言调用C/C++语言的通道。

简单吧,还能想到什么?

对了,咱们缺的就是一个解析器!如果够专业,完全可以自定义任何语言让Nginx来调用,只要拥有一个自己的解析器,外加一个供Nginx调用的插件模块,那么属于你的世界来了,KVM、JVM、LLVM、LuaVM……等诸多神器都在欢迎你的到来,当能力匹配上任性时,才算堪称完美!做开发的兄弟们也可以洗洗睡了。

d4ccd98f5cbf8e45a7c6817b0e0e35d0.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值