04 | 如何管理第三方包?从包管理工具luarocks和opm说起
下载APP
关闭
渠道合作
推荐作者
04 | 如何管理第三方包?从包管理工具luarocks和opm说起
2019-06-03 温铭 来自北京
《OpenResty从入门到实战》
课程介绍
讲述:温铭
时长09:29大小8.67M
你好,我是温铭。
在上一节中,我们大概了解了下 OpenResty 官方的一些项目。不过,如果我们把 OpenResty 用于生产环境,显然,OpenResty 安装包自带的这些库是远远不够的,比如没有 lua-resty 库来发起 HTTP 请求,也没有办法和 Kafka 交互。
那么应该怎么办呢?本节我们就来一起了解下,应该从什么渠道来找到这些第三方库。
这里,我再次强调下,OpenResty 并不是 NGINX 的 fork,也不是在 NGINX 的基础上加了一些常用库重新打包,而只是把 NGINX 当作底层的网络库来使用。
当你使用 NGINX 的时候,是不会想着如何发起自定义的 HTTP 请求,以及如何与 Kafka 交互的。而在 OpenResty 的世界中,由于 cosocket 的存在,开发者可以轻松地写出 lua-resty-http 和 lua-resty-kafka ,来处理这类需求,就像你用 Python、PHP 这类的开发语言一样。
另外,还有一个建议告诉你:你不应该使用任何 Lua 世界的库来解决上述问题,而是应该使用 cosocket 的 lua-resty-* 库。Lua 世界的库很可能会带来阻塞,让原本高性能的服务,直接下降几个数量级。这是 OpenResty 初学者的常见错误,而且并不容易觉察到。
那我们怎么找到这些非阻塞的 lua-resty-* 库呢?接下来,我来为你介绍下面几种途径。
OPM
OPM(OpenResty Package Manager)是 OpenResty 自带的包管理器,在你安装好 OpenResty 之后,就可以直接使用。我们可以试着去找找发送 http 请求的库 $ opm search http
第一次查询可能会比较慢,需要几秒钟的时间。opm.openresty.org 会从 PostgreSQL 数据库中做一次查询,并把结果缓存一段时间。search 具体的返回结果比较长,我们这里只看下第一条返回值:
呃,看到这个结果,你可能会疑惑:这个 lua-resty-upload 包和发送 http 有什么关系呢?
原来,OPM 做搜索的时候,是用后面的关键字同时搜索了包的名字和包的简介。这也是为什么上面的搜索会持续几秒,因为它在 PostgreSQL 里面做了字符串的全文搜索。
不过,不管怎么说,这个返回并不友好。让我们修改下关键字,重新搜索下:
其实,在 OpenResty 世界中,如果你使用 cosocket 实现了一个包,那么就要使用 lua-resty- 这个前缀,算是一个不成文的规定。
回过头来看刚刚的搜索结果,OPM 使用了贡献者的 GitHub 仓库地址作为包名,即 GitHub ID / repo name。上面返回了三个 lua-resty-http 第三方库,我们应该选择哪一个呢?
眼尖的你,可能已经发现了 agentzh 这个 ID,没错,这就是 OpenResty 作者春哥本人。在选择这个包之前,我们看下它的 star 数和最后更新时间:只有十几个 star,最后一次更新是在 2016 年。很明显,这是个被放弃的坑。更深入地看下,pintsized/lua-resty-http 和 ledgetech/lua-resty-http 其实指向了同一个仓库。所以,不管你选哪个都是一样的。
LUAROCKS
LuaRocks 是 OpenResty 世界的另一个包管理器,诞生在 OPM 之前。不同于 OPM 里只包含 OpenResty 相关的包,LuaRocks 里面还包含 Lua 世界的库。举个例子,LuaRocks 里面的 LuaSQL-MySQL,就是 Lua 世界中连接 MySQL 的包,并不能用在 OpenResty 中。
还是以 HTTP 库为例,我们尝试用 LuaRocks 来试一试查找:
你可以看到,也是返回了一大堆包。
我们不妨再换个关键字:
这里面包含了作者、License、GitHub 地址、下载次数、功能简介、历史版本、依赖等。和 OPM 不同的是,LuaRocks 并没有直接使用 GitHub 的用户信息,而是需要开发者单独在 LuaRocks 上进行注册。
其实,开源的 API 网关项目 Kong,就是使用 LuaRocks 来进行包的管理,并且还把 LuaRocks 的作者收归麾下。我们接着就来简单看下,Kong 的包管理配置是怎么写的。
通过文件你可以看到,依赖项里面掺杂了 lua-resty 库和纯 Lua 世界的库,使用 OPM 只能部分安装这些依赖项。写好配置后,使用 luarocks 的 upload 命令把这个配置上传,用户就可以用 LuaRocks 来下载并安装 Kong 了。
另外,在 OpenResty 中,除了 Lua 代码外,我们还经常会调用 C 代码,这时候就需要编译才能使用。LuaRocks 是支持这么做的,你可以在 rockspec 文件中,指定 C 源码的路径和名称,这样 LuaRocks 就会帮你本地编译。而 OPM 暂时还不支持这种特性。
不过,需要注意的是,OPM 和 LuaRocks 都不支持私有包。
AWESOME-RESTY
讲了这么多包管理的内容,其实呢,即使有了 OPM 和 LuaRocks,对于 OpenResty 的 lua-resty 包,我们还是管中窥豹的状态。到底有没有地方可以让我们一览全貌呢?
当然是有的,awesome-resty 这个项目,就维护了几乎所有 OpenResty 可用的包,并且都分门别类地整理好了。当你不确定是否存在适合的第三方包时,来这里“按图索骥”,可以说是最好的办法。
我们看到,这里有 8 个 lua-resty-http 的第三方库。对比一下前面的结果,我们使用 OPM 只找到 2 个,而 LuaRocks 里面更是只有 1 个。不过,如果你是选择困难症,请直接使用第一个,它和 LuaRocks 中的是同一个。
而对于愿意尝试的工程师,我更推荐你用最后一个库: lua-resty-requests,它是人类更友好的 HTTP 访问库,接口风格与 Python 中大名鼎鼎的 Requests 一致。如果你跟我一样是一个 Python 爱好者,一定会喜欢上 lua-resty-requests。这个库的作者是 OpenResty 社区中活跃的 tokers,因此你可以放心使用。
必须要承认,OpenResty 现有的第三方库并不完善,所以,如果你在 awesome-resty 中没有找到你需要的库,那就需要你自己来实现,比如 OpenResty 一直没有访问 Oracle 或者 SQLServer 的 lua-rsety 库。
写在最后
一个开源项目想要健康地发展壮大,不仅需要有硬核的技术、完善的文档和完整的测试,还需要带动更多的开发者和公司一起加入进来,形成一个生态。正如 Apache 基金会的名言:社区胜于代码。
还是那句话,想把 OpenResty 代码写好,一点儿也不简单。OpenResty 还没有系统的学习资料,也没有官方的代码指南,很多的优化点的确已经写在了开源项目中,但大多数开发者却是知其然而不知其所以然。这也是我这个专栏的目的所在,希望你学习完之后,可以写出更高效的 OpenResty 代码,也可以更容易地参与到 OpenResty 相关的开源项目中来。
你是如何看待 OpenResty 生态的呢?欢迎留言我们一起聊聊,也欢迎你把这篇文章转发给你的同事、朋友,一起在交流中进步。
分享给需要的人,Ta购买本课程,你将得18元
生成海报并分享
赞 15
提建议
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
上一篇
03 | 揪出隐藏在背后的那些子项目
下一篇
05 | [视频]opm项目导读
精选留言(20)
- 业余草2019-06-06OpenResty 一直没有访问 Oracle 或者 SQLServer 的 lua-rsety 库。这是有什么原因吗?
作者回复: 因为 Oracle 和 SQLServer 是闭源的商业产品
共 2 条评论6 - guoew2019-06-03以前都是把openresty当做nginx+lua,使用实现一些最简单的功能,都不知道这些包管理器,感谢老师6
- 咖啡猫2019-06-03luarocks安装了包后,在nginx.conf应该怎么设置lua_package_path呢,有时候设置了默认搜索路径,也是不生效,尝试将包拷贝到lualib的目录下才能找到
作者回复: luarocks 和 OpenResty 并没有配合和联动,需要你单独在 lua_package_path 中增加 luarocks 安装的路径才行。一般来说,luarocks 会把库安装到 lua5.1 或者 lua5.3 的目录下。
5 - qinsi2019-12-31Use of LuaRocks with OpenResty is strongly discouraged since OpenResty provides its own package manager, OPM. (https://openresty.org/en/using-luarocks.html) 一脸懵逼3
- baiyutang2019-06-05感觉OpenResty比较偏向于运维开发的一部分,因为业务开发比较少关系服务器部署或者性能,性能的话可能大厂会遇到更多问题或者需要定制化的问题。 1 很多小厂多仅限于运用作为一个web服务器。 2 程序员圈子中业务开发还是相对比较多的? 所以,虽然东西是好东西,但是不是每个厂 或者每个人都能玩的起来的。不能像Vuejs或者Golang这些业务开发技术直接做比较。当然,我仍然觉得OpenResty是值得投入的,从职业规划或者个人对软件的理解。我都看好学习好OR.展开
作者回复: 是的,OpenResty 使用广,但不热门。用 OpenResty 开发业务是没问题的,把它仅仅当做 nginx 的替代就有些大材小用了
2 - Panda2019-06-03包管理工具 最好用的应该是 composer 和 npm 包管理工具可以让我们站在前人的肩膀上更快的开发出应用
作者回复: luarocks 相对好用一些
共 3 条评论3 - 一步2019-06-03opm 上的第三方库,还是很少的,功能还有待完善
作者回复: opm 确实不够完善,还要多多加油才行
2 - TomShine2019-06-03OpenRestry 的生态看着确实不好,我们可以一起努力
作者回复: 众人拾柴火焰高
1 - manatee2019-06-03打卡,从opm中可以安装opresty相关的第三方包,从luarocks可以安装lua相关的第三方包。想请教一下老师,文中讲的cosocket具体是指什么呢
作者回复: cosocket 后面会专门讲,你可以简单的认为它是 OpenResty 特有的,用来访问网络的协程技术
2 - 高燕军2022-08-07 来自江苏我看了这么多,总结出一个道理,任何一个项目能不能成功,就看这个项目是不是在持续维护,只要有维护,有迭代,项目就不会死,就会变得更好。
- 平风造雨2021-07-26总结起来,对于使用方要主动甄别三方包的良莠,甄别的过程有一些潜在的规则。 比如,lua-resty-*作为前缀的和高性能相关,要重点关注。 配合OPM/LuaRocks以及awesome-resty对三方库做进一步的背景调查,最后还是需要关注代码本身,关注测试用例,进行三方库选择的把控。1
- 蜥蜴12142020-11-26老师,求助啊。我mac电脑,安装完openresty后,通过opm安装了lua-resty-requests后,按照官网demo,运行resty -e 'print(require "resty.requests".get("https://github.com", { stream = false}).content)'。但是直接报错。...nresty/1.19.3.1_1/site/lualib/resty/requests/adapter.lua:4: module 'resty.socket' not found。网上也没相关的资料,这个是少安装了东西吧共 1 条评论
- 贺钧威2020-02-22一直以为 Kong 读 空共 2 条评论
- ZeroIce2019-08-03老师,有什么书籍推荐的?英文书籍也行
作者回复: OpenResty 现在并没有比较合适的书推荐,有的也是中文的。
- 蓝色海洋2019-07-15请问老师,openresty支持grpc通信吗?有没有相关的组件可以将grpc转换为普通的http请求
作者回复: 现在 OpenResty 和 Nginx 一样,只支持 grpc 的转发,并没有实现协议的转换,也不支持 grpc 的客户端。这算是 OpenResty 的一个软肋。我们团队有计划对这方面做加强。
1 - 朋朋2019-06-25我的/usr/local/openresty/bin/ 下只有这俩 我是centos7 的环境 看来我得重新安装一下啦 openresty resty
- NEVER SETTLE2019-06-17yum install openresty 安装好openresty之后,为什么找不到opm
作者回复: sudo yum install openresty-opm 需要单独安装一下
1 - 小飞哥 超級會員2019-06-14为什么 我这里会提示使用luarocks 命令说不存在? 需要配置什么才可以? localhost:geektime yuesf$ luarocks search http -bash: luarocks: command not found localhost:geektime yuesf$
作者回复: luarocks 需要单独安装,你可以用系统的包管理工具安装,比如 brew install luarocks
- 英雄2019-06-10菜鸟推荐用哪个管理工具呢
作者回复: luarocks
1 - 王斌2019-06-03的确需要温老师这样的课程,lua虽然入门简单,但是openresty的正确打开方式不是很好找😢
作者回复: 是的,安装包就不容易
共 2 条评论