OpenResty 从入门到实战
温铭
OpenResty 软件基金会第一任主席,Apache APISIX 项目 VP
20903 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 52 讲
结束语 (1讲)
OpenResty 从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

16 | 秒杀大多数开发问题的两个利器:文档和测试案例

key 长度限制:65535
key 类型:字符串和数字
flags 参数
init 和 init_worker 阶段不能使用共享内存相关的 API
解决问题的方式
错误处理
学习 OpenResty 的正确途径
入参类型和长度限制
多个返回值
阶段限制
直接方式改造
测试案例
官方文档
API 学习资料
用途:限流、限速、缓存等数据
基于 NGINX 共享内存区的 Lua 字典对象
高覆盖度
可运行的代码示例
参数、返回值定义
写在最后
深入学习
使用 resty CLI
文档和测试案例的重要性
shared dict
测试案例集
文档详尽
容易学习
shdict get API
OpenResty API
文档和测试案例

该思维导图由 AI 生成,仅供参考

你好,我是温铭。在学习了 OpenResty 的原理和几个重要概念后,我们终于要开始 API 的学习了。
从我个人的经验来看,学习 OpenResty 的 API 是相对容易的,所以并没有占用本专栏太多的篇幅。你可以会疑惑:API 不是最常用、最重要的部分吗,为什么花的笔墨不多?
其实,这主要是出于两个方面的考虑。
第一,OpenResty 提供了非常详尽的文档。和很多其他的开发语言或者平台相比,OpenResty 除了会提供 API 的参数、返回值定义,还会提供完整的、可运行的代码示例,清楚地告诉你 API 是如何处理各种边界条件的。
这种在 API 定义下面紧跟着示例代码和注意事项的做法,就是 OpenResty 文档的一贯风格。这样一来,在看完 API 描述后,你就可以立即在自己的环境下运行示例代码,并修改参数来和文档互相印证,加深记忆和理解。
第二,在文档之外,OpenResty 还提供了高覆盖度的测试案例集。刚刚我提到过,OpenResty 文档中提供了 API 的代码示例,但终究篇幅有限,多个 API 之间如何配合使用、各种异常情况下的报错和处理等,在文档中并没有呈现。
不过,不用担心,这些内容你大都可以在测试案例集里找到。
对于 OpenResty 的开发者来说,最好的 API 学习资料就是官方文档和测试案例,它们足够专业和友好。在这个前提下,如果我单纯地把文档翻译成中文再放在专栏中来讲,就没有太大意义了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以OpenResty的API学习为例,强调了文档和测试案例在解决开发问题中的重要性。作者指出了文档中提供的API描述下面紧跟着示例代码和注意事项的做法,以及测试案例集的重要性。通过具体示例,展示了如何利用文档和测试案例来更好地理解和运用API。同时,强调了通过修改测试案例来验证对文档的理解,以及如何利用测试案例来验证对API的理解。最后,作者提醒读者在阅读OpenResty的官方文档时,应该仔细地把文档从头到尾读完,并在有疑问时,结合测试案例集和自己的尝试,去确定出答案。整体而言,本文突出了文档和测试案例在解决开发问题中的关键作用,以及如何利用它们来更好地理解和运用API。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OpenResty 从入门到实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • helloworld
    老师,指出文章中可能的一处错误:"哪些阶段不能使用共享内存相关的 API?" 这个例子举的貌似不太对。 restydoc -s ngx.shared 可知共享内存的相关API是支持init_by_lua和init_worker_by_lua阶段的,你在043-shdict.t的第一个测试案例中将content_by_lua修改为init_by_lua,执行测试报错,说明的是init_by_lua指令不能在location里,而不是说明共享内存API的问题。通过restydoc -s init_by_lua 查看,可知,init_by_lua指令的上下文只能是http。

    作者回复: 是的,确实写错了,抱歉,我去修改下。多谢指正。

    2019-07-02
    16
  • HelloBug
    温铭老师,你好~ 看了https://openresty.gitbooks.io/programming-openresty/content/testing里面的test-nginx文档。今天看到的部分有一个疑问,在RunningTest一节讲一个test file里的test block默认是shuffle方式随机运行的,以便在不同的执行顺序下可能出现的bug被遗漏。然后在PreparingTest一节里讲到,每个test block都会生成一个nginx.conf,生成nginx进程执行,执行下一个test block时,会关闭之前进程,重新启动新的进程。这样打乱test block和不打乱不就没有什么区别了吗?

    作者回复: 这是个好问题,我和你的感觉是一样的。我在自己的项目中都是用 no_shuffle,严格按照顺序来执行。 这是因为测试案例可能会依赖外部的持久化存储,比如 redis、memcached、postgres 等,那么这个时候随机运行测试就可能出错。 所以,我也不太理解为什么默认要用shuffle的方式运行。 我能想到的一个原因,可能是在把 TEST_NGINX_FORCE_RESTART_ON_TEST 设置为 0 的时候,也就是在配置文件不变化的时候不重启 nginx,这个时候随机就有意义了。 另外,如果TEST_NGINX_FORCE_RESTART_ON_TEST设置为 0, 并且 TEST_NGINX_BENCHMARK 设置为 1,那么就会在不重启和大压力的情况下去做随机测试。 test::nginx 有很多种组合的模式,我觉得有些设计的过于灵活和复杂了,个人见解,欢迎交流。 补充一句哈,还有 TEST_NGINX_USE_HUP 这个环境变量,可以保证测试案例间的 shared dict 不被清空。

    2019-07-02
    2
    6
  • 😑
    温老师,如果多个worker并发存数据,是不是需要加锁,例如这样 resty --shdict 'dogs 10m' -e 'local dogs = ngx.shared.dogs local lock= ngx.xxxx.lock lock.lock() dogs:set("Jim", 8) lock.unlock() local v = dogs:get("Jim") ngx.say(v) ' 那么以后的课程中会讲解到op的锁吗?出现死锁怎么处理呢?

    作者回复: 不用自己加锁哈,shared dict 的操作都是原子性的,这种类似加锁的处理已经帮你考虑到了。

    2019-07-02
    2
  • 风翱
    lua_shared_dict dogs 10m; 这一句应该放在哪里呢?按文中描述,放在www/conf/nginx.conf,通过http://www.chrono.com/demo访问,出现错误提示:2019/07/02 11:16:12 [error] 11184#3284: *3 lua entry thread aborted: runtime error: content_by_lua(http.conf:32):2: attempt to index global 'dogs' (a nil value) stack traceback: coroutine 0: content_by_lua(http.conf:32): in main chunk, client: 127.0.0.1, server: localhost, request: "GET /demo HTTP/1.1", host: "www.chrono.com"

    作者回复: lua_shared_dict dogs 10m 放在 nginx.conf 中是对的。你在代码中是如何引用 dogs 这个共享字典的呢?

    2019-07-02
    3
  • manatee
    想请问一下老师讲openresty的官方文档是指哪里的内容呢?是github中每个模块readme的部分吗

    作者回复: 是的

    2019-07-01
  • helloworld
    驱动测试案例: 1. 安装相关模块 sudo yum install cpan -y sudo cpan YAML sudo cpan Test::Nginx 2. test 测试案例 git clone git@github.com:openresty/lua-nginx-module.git cd lua-nginx-module/ prove t/043-shdict.t
    2019-07-02
    22
  • 刘丹
    请问OpenResty的测试环境要怎样搭建?运行prove t1.t 命令出错: t1.t .. Can't locate Test/Nginx/Socket/Lua.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at t1.t line 2. BEGIN failed--compilation aborted at t1.t line 2. t1.t .. Dubious, test returned 2 (wstat 512, 0x200) No subtests run Test Summary Report ------------------- t1.t (Wstat: 512 Tests: 0 Failed: 0) Non-zero exit status: 2 Parse errors: No plan found in TAP output Files=1, Tests=0, 0 wallclock secs ( 0.02 usr + 0.00 sys = 0.02 CPU) Result: FAIL
    2019-07-01
    3
    1
  • 张仕华
    赞赞赞
    2019-07-01
    1
  • nil
    ```shell resty --shdict 'dogs 10m' \ -e 'local dogs = ngx.shared.dogs local v, err = dogs:get({}) if v == nil and err then ngx.say("not ok: ", err) else ngx.say("got: ", v) end' # got: ``` 没有报错,是不是现在 get API 接受 table 类型的入参了
    2022-05-05
  • nobia
    resty --shdict 'dogs 10m' -e 'local dogs = ngx.shared.dogs dogs:get({}) ' 运行这个没有报错 resty -V resty 0.27 nginx version: openresty/1.19.3.1 built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) built with OpenSSL 1.1.1h 22 Sep 2020 (running with OpenSSL 1.1.1i 8 Dec 2020)
    2020-12-31
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部