一、OpenResty 简介
OpenResty
是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。可以使用Lua脚本调用Ngnix支持的C以及Lua模块,快速构建10K~1000K单机并发连接的高性能web应用系统。OpenResty的目标是让web服务直接运行在Nginx服务内部,利用Ngnix的非阻塞IO模型,对HTTP客户端请求和后端DB进行一致的高性能响应。
OpenResty 基于Nginx
开发,可以简单认为是 Nginx
+ lua-nginx-module
的组合版。
官网:https://openresty.org/cn/
官方文档:https://github.com/openresty/lua-nginx-module#version
openresty最佳实战:https://github.com/moonbingbing/openresty-best-practices,https://moonbingbing.gitbooks.io/openresty-best-practices/content/
nginx使用的wiki:https://www.nginx.com/resources/wiki/
nginx3rd中lua模块wiki:https://www.nginx.com/resources/wiki/modules/lua/
二、高性能服务端两个重要要素
对于“高性能”服务端而言,我们所关注的并不是语言的性能,而是缓存,语言层面要支持异步非堵塞。
1、缓存速度上
内存 > SSD > 机械磁盘;本机 > 网络 ; 进程内 > 进程间 。缓存系统的目标是希望在进程内的命中率是最高的,那么此时缓存系统整体的效率也是最高的。
2、异步非阻塞指的是事件驱动方式(事件完成后再通知)
希望访问数据库、访问网络,访问一些比较慢的IO设备时,不要在等待上耗费大量时间。而是使用事件驱动的方式,当系统完成某项任务后再来通知我们。这样就可以将服务器CPU的空闲资源,用来服务客户端连接。
三、OpenResty 包含的技术
- Nginx:不仅仅是负载均衡+反向代理等功能,Nginx c module开发成本高。
- LuaJIT:OpenResty用的是 LuaJIT,LuaJIT 是主打性能的Lua。
OpenResty已经颠覆了高性能服务端的开发模式。OpenResty
本质上是将 LuaJIT
的虚拟机嵌入到 Nginx的worker中,所以效率特别高,在性能上,OpenResty
接近或超过 Nginx c module:
由于Nginx采用的是master-worker
模型,也就是一个master
主进程管理多个worker
进程,基本的事件处理都是放在worker
中,master
仅负责一些全剧初始化,以及对worker
的管理。在OpenResty中,每个worker
使用一个LuaVM,每个请求被分配到worker
时,将在这个LuaVM
中创建一个coroutine
协程。协程之间数据隔离,每个协程具有独立的全局变量_G
。
Lua中的协程和多线程下的线程类似,都有自己的堆栈、局部变量、指令指针...,但是和其他协程程序共享全局变量等信息。线程和协程主要不同在于:多处理器的情况下,概念上来说多线程是同时运行多个线程,而协程是通过代码来完成协程的切换,任何时刻只有一个协程程序在运行。并且这个在运行的协程只有明确被要求挂起时才会被挂起。
四、OpenResty
与市面上其他语言对比
- node.js:第一门将异步非阻塞特性放入自己语言中的,前端同学可以快速切入。但是 node.js 用回调(callback)实现异步非阻塞,代码写起来比较麻烦。
- Python:3.4之后加入了异步的支持,比如异步io和aiohttp;3.5引入了协程。缺点是版本跨度大,因为很多人还是使用2.7。
- Golang:最近几年非常火。缺点:代码写法上需要使用go关键字;线上热调试不方便(
SystemTap
提供了有限的支持)。 - Baas:后端即服务,(Backend as a Service),公司为移动应用开发者提供整合云后端的边界服务。
参考:
https://www.zhihu.com/question/23048744