44 | OpenResty 的杀手锏:动态
44 | OpenResty 的杀手锏:动态
讲述:温铭
时长09:29大小8.70M
动态加载代码
功能一:FaaS
功能二:边缘计算
动态上游
写在最后
赞 1
提建议
精选留言(11)
- FF2019-09-04关于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` 做一层缓存。 这差不多就是完整的实现了。
2 - Netfeel2019-09-04loadstring 在NYI列表是never,会不会对性能有很大影响?
作者回复: 要看调用次数的,热代码才有 JIT 的必要性。loadstring 并不是一个频繁的操作,不会有性能问题的
共 2 条评论1 - manatee2019-09-04lua-resty-upstream-healthcheck是不是说反了,应该只有主动健康检查没有被动健康检查
作者回复: 多谢指正,确实这里弄错了。lua-resty-upstream-healthcheck带的是 ngx.timer.at 这种主动健康检查的方式,而没有被动健康检查。
1 - Geek_8388432022-07-12老师你好,对于动态还是没有十分明白。举个例子: 比如现在有个连接池功能,由于现有连接数不够了,需要增加一些连接数,并且不能影响正在跑的线上业务。这些配置现在在项目的配置文件里配好了,这时候需要动态发布,这时候这个动态该怎么做呢?
- Varphp2021-01-17动态代理怎么做? 不是跳转301 302就是动态反向代理 想要通过redis来定义路由 这种有可能实现吗😂共 1 条评论
- 钛合金猪头2020-04-27老师,我想实现 类似 tengine 中的 ngx_http_upstream_check_module,这样一旦检测到 unhealthy,就自动把这个unhealthy的节点踢掉,有什么可以参考的吗?共 1 条评论
- 许童童2019-09-07老师的文章很棒。
- helloworld2019-09-06老师,loadstring或loadfile这种热更新相关的代码,我们该写在哪里,就是怎么触发?通过resty命令吗
作者回复: 可以写在 ngx.timer 里面,到数据库中定期的去检测版本号或者修改时间是否有变化。
- 空知2019-09-04二进制热升级 也没有停止服务 启动新的配置的程序,不算动态吗?
作者回复: 算的,这是 Nginx/OpenResty 自身的升级。但这个过程会关闭旧的 workers,启动新的 workers,可能耗时比较久,而且会丢失缓存。这种二级制热升级应该保持一个很低频的操作。
- manatee2019-09-04在使用resty-healthcheck这个库时,如何检获取所有真实服务器的健康状态呢
作者回复: 你可以使用 checker:add_target 来设置多个上游节点的 ip 和端口,就像这个测试案例一样:https://github.com/Kong/lua-resty-healthcheck/blob/master/t/06-report_http_status.t#L69
共 2 条评论 - manatee2019-09-04动态上游这块,我的做法是为一个服务设置2个upstream,然后根据路由条件选择不同的upstream,当机器ip有变化修改upstream中的ip即可,请问这样和直接使用balancer_by_lua有什么劣势或坑吗
作者回复: balancer_by_lua 可以让用户选择负载均衡的算法是roundrobin 还是 chash,或者是其他的算法,比较自由。另外,在你的实现中,上游健康检查也需要自己来实现,有不少额外的工作量。