44 | OpenResty 的杀手锏:动态
该思维导图由 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-044 - Netfeelloadstring 在NYI列表是never,会不会对性能有很大影响?
作者回复: 要看调用次数的,热代码才有 JIT 的必要性。loadstring 并不是一个频繁的操作,不会有性能问题的
2019-09-0421 - manateelua-resty-upstream-healthcheck是不是说反了,应该只有主动健康检查没有被动健康检查
作者回复: 多谢指正,确实这里弄错了。lua-resty-upstream-healthcheck带的是 ngx.timer.at 这种主动健康检查的方式,而没有被动健康检查。
2019-09-041 - 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-042 - 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-171
- 钛合金猪头老师,我想实现 类似 tengine 中的 ngx_http_upstream_check_module,这样一旦检测到 unhealthy,就自动把这个unhealthy的节点踢掉,有什么可以参考的吗?2020-04-271