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

44 | OpenResty 的杀手锏:动态

微服务API网关APISIX
动态控制
lua-resty-healthcheck
lua-resty-upstream-healthcheck
lua-resty-balancer
CloudFlare
健康检查机制
上游选择算法
CDN边缘节点
七层和四层代理
多平台支持
pcall
匿名函数
ngx.balancer
边缘计算
FaaS
loadstring
动态上游
动态加载代码
动态
OpenResty
性能优化

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

你好,我是温铭。
到目前为止,和 OpenResty 性能相关的内容,我就差不多快要介绍完了。我相信,掌握并灵活运用好这些优化技巧,一定可以让你的代码性能提升一个数量级。今天,在性能优化的最后一个部分,我来讲一讲 OpenResty 中被普遍低估的一种能力:动态。
让我们先来看下什么是动态,以及它和性能之间有什么样的关系。
这里的动态,指的是程序可以在运行时、在不重新加载的情况下,去修改参数、配置,乃至修改自身的代码。具体到 Nginx 和 OpenResty 领域,你去修改上游、SSL 证书、限流限速阈值,而不用重启服务,就属于实现了动态。至于动态和性能之间的关系,很显然,如果这几类操作不能动态地完成,那么频繁的 reload Nginx 服务,自然就会带来性能的损耗。
不过,我们知道,开源版本的 Nginx 并不支持动态特性,所以,你要对上游、SSL 证书做变更,就必须通过修改配置文件、重启服务的方式才能生效。而商业版本的 Nginx Plus 提供了部分动态的能力,你可以用 REST API 来完成更新,但这最多算是一个不够彻底的改良。
但是,在 OpenResty 中,这些桎梏都是不存在的,动态可以说就是 OpenResty 的杀手锏。你可能纳闷儿,为什么基于 Nginx 的 OpenResty 却可以支持动态呢?原因也很简单,Nginx 的逻辑是通过 C 模块来完成的,而 OpenResty 是通过脚本语言 Lua 来完成的——脚本语言的一大优势,便是运行时可以去做动态地改变。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

OpenResty的动态能力是其杀手锏,通过动态加载代码和实现函数即服务(FaaS),OpenResty可以在运行时修改参数、配置,甚至修改自身的代码,而无需重新加载服务。相比于Nginx,OpenResty的基于Lua脚本语言的动态特性使其能够更灵活地实现动态加载代码和函数级别的动态细化。这种动态能力不仅可以用于FaaS,还可以在边缘计算上发挥优势,将计算能力动态赋予边缘节点的设备,从而提高用户请求的响应速度。OpenResty的动态特性为CDN边缘节点的动态控制提供了可能,CloudFlare早已借助OpenResty实现了对CDN边缘节点的动态控制。 在实现动态上游方面,OpenResty提供了ngx.balancer库来设置上游,同时还包含了resty.chash和resty.roundrobin两类算法以及lua-resty-upstream-healthcheck来完成上游的选择算法和健康检查机制。然而,要充分利用OpenResty的动态能力,还需要考虑自身周边生态的完善和厂商的加入。为了实现动态上游的功能,需要整合ngx.balancer、lua-resty-balancer和lua-resty-upstream-healthcheck,以及使用lua-resty-healthcheck来完成上游的健康检查。 在实际的实践中,推荐使用lua-resty-healthcheck来完成上游的健康检查,因为它包含了主动和被动的健康检查,可靠性更高。此外,新兴的微服务API网关APISIX在lua-resty-healthcheck的基础上,对动态上游做了完整的实现,只有200多行代码,可以轻松地应用到自己的项目中。 总的来说,OpenResty的动态能力可以在FaaS、边缘计算、CDN边缘节点的动态控制等领域和场景发挥优势。通过动态加载代码和实现函数即服务,可以在不重新加载服务的情况下提升代码性能。

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

全部留言(11)

  • 最新
  • 精选
  • FF
    关于CloudFlare 实现的动态加载有个疑问:CloudFlare 在完成新文件替换后,如何用 loadstring 函数完成新文件的加载呢 ?loadstring 只能加载字符串,就算把文件内容转成字符串作为 loadstring 的入参,也不行吧,它的返回值是函数引用。那动态加载 lua 文件/模块,OR 是如何做的 ?温老师能否具体讲讲这块,或者 CloudFlare 具是如何实现的 ? 如果要重新加载一个 lua 文件/模块,以我目前对 OR 的掌握只能想办法重新执行 require ,但貌似用这种方式做不到,具体实现方式不知是如何 ? 感谢。

    作者回复: 给你一个更具体的示例: resty -e 'local s = [[ local ngx = ngx local _M = {} function _M.f() ngx.say("hello world") end return _M ]] local lua = loadstring(s) local ret, func = pcall(lua) func.f()' 这里的 `s` 就是一个完整的 Lua 模块,在发现变化的时候,你可以用 loadstring 或者 loadfile 重启加载。你也把可以把获取变化和重新加载用 code_loader 函数做一层包装: ``` local func = code_loader(name) ``` 而在 code_loader 中我们一般会用 lru cache 对 `s` 做一层缓存。 这差不多就是完整的实现了。

    2019-09-04
    4
  • Netfeel
    loadstring 在NYI列表是never,会不会对性能有很大影响?

    作者回复: 要看调用次数的,热代码才有 JIT 的必要性。loadstring 并不是一个频繁的操作,不会有性能问题的

    2019-09-04
    2
    1
  • manatee
    lua-resty-upstream-healthcheck是不是说反了,应该只有主动健康检查没有被动健康检查

    作者回复: 多谢指正,确实这里弄错了。lua-resty-upstream-healthcheck带的是 ngx.timer.at 这种主动健康检查的方式,而没有被动健康检查。

    2019-09-04
    1
  • helloworld
    老师,loadstring或loadfile这种热更新相关的代码,我们该写在哪里,就是怎么触发?通过resty命令吗

    作者回复: 可以写在 ngx.timer 里面,到数据库中定期的去检测版本号或者修改时间是否有变化。

    2019-09-06
  • 空知
    二进制热升级 也没有停止服务 启动新的配置的程序,不算动态吗?

    作者回复: 算的,这是 Nginx/OpenResty 自身的升级。但这个过程会关闭旧的 workers,启动新的 workers,可能耗时比较久,而且会丢失缓存。这种二级制热升级应该保持一个很低频的操作。

    2019-09-04
  • manatee
    在使用resty-healthcheck这个库时,如何检获取所有真实服务器的健康状态呢

    作者回复: 你可以使用 checker:add_target 来设置多个上游节点的 ip 和端口,就像这个测试案例一样:https://github.com/Kong/lua-resty-healthcheck/blob/master/t/06-report_http_status.t#L69

    2019-09-04
    2
  • manatee
    动态上游这块,我的做法是为一个服务设置2个upstream,然后根据路由条件选择不同的upstream,当机器ip有变化修改upstream中的ip即可,请问这样和直接使用balancer_by_lua有什么劣势或坑吗

    作者回复: balancer_by_lua 可以让用户选择负载均衡的算法是roundrobin 还是 chash,或者是其他的算法,比较自由。另外,在你的实现中,上游健康检查也需要自己来实现,有不少额外的工作量。

    2019-09-04
  • Geek_838843
    老师你好,对于动态还是没有十分明白。举个例子: 比如现在有个连接池功能,由于现有连接数不够了,需要增加一些连接数,并且不能影响正在跑的线上业务。这些配置现在在项目的配置文件里配好了,这时候需要动态发布,这时候这个动态该怎么做呢?
    2022-07-12
  • Varphp
    动态代理怎么做? 不是跳转301 302就是动态反向代理 想要通过redis来定义路由 这种有可能实现吗😂
    2021-01-17
    1
  • 钛合金猪头
    老师,我想实现 类似 tengine 中的 ngx_http_upstream_check_module,这样一旦检测到 unhealthy,就自动把这个unhealthy的节点踢掉,有什么可以参考的吗?
    2020-04-27
    1
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部