最近笔者写了两篇在OpenResty上进行插件开发的文章,但可能忽略了一个关键点,即读者也许不知道OpenResty是什么,能做什么,因此对于怎么做并不感兴趣。本文尝试从是什么、能做什么、怎么做三个角度对OpenResty进行更详细的说明,争取让读者理解并对OpenResty有兴趣。
Nginx & Lua
Nginx
OpenResty最精简的描述是等于Nginx + Lua。
Nginx是HTTP反向代理杰出的代表、最佳实践,主要可完成如下工作:
-
静态资源代理
-
请求转发,按一定路由规则转发Downstream请求到Upstream,Upstream即backend server
PS: 笔者曾有疑问为何请求从client -> nginx -> backend server,却将backend server称为Upstream,因为HTTP资源存在服务器,Upstream描述的是资源流向而非数据流向
-
负载均衡,一个Upstream可以对应多个backend server,单个请求具体转发哪个backend server,可以设置一些策略如:round robin、ip hash、url hash等
-
限流,按照一定策略限制client调用频率
-
缓存,使Nginx可以“复用”backend server的返回数据
-
日志,访问日志以及错误日志,访问日志可以提供一些较有价值的内容如:host、clientIp、请求耗时等
Nginx虽强大优秀,但随技术更新迭代所体现出美中不足的点是扩展能力不灵活,需要用C/C++编写插件模块,这对当下开发者不友好,门槛高且开发周期长。
OpenResty的出现完美解决了Nginx上述缺点,赋予开发者在Nginx上使用Lua开发扩展的能力,扩展实现灵活高效且Nginx的高性能也继续得以保持。
Lua
Lua是葡萄牙语月亮的意思,总结一下主要有如下特点:
-
小众,不是OpenResty,压根不知道有这么一门语言
-
可嵌入脚本语言,胶水语言,专注辅助主角C/C++,不想做主角
-
游戏领域用的多,与C/C++交互API友好,方便实现热更
-
解释器体积小(不到200k),笔者不懂解释器,看相关文章都会提到,应该很牛逼
通过学习与实践Lua基础语法、数据类型、模块机制这些内容,整体感觉较简单,稍高阶的内容有模式匹配、协程、元表元方法、C API等。在OpenRe