在Envoy上运行lua-resty-ffi

在Envoy上运行lua-resty-ffi

💡 原文约900字/词,阅读约需3分钟。
📝

内容提要

本文讨论了如何在Envoy 2023.7.9上运行lua-resty-ffi,利用Envoy的过滤器机制实现异步处理和Lua过滤器。文章介绍了适配lua-resty-ffi的回调机制,以便在Envoy中调用C++方法,并展示了如何与主流编程语言(如Go、Python等)进行开发,充分利用其生态系统。

🔎

延伸解读

Envoy 与 Nginx 的线程模型差异

Envoy 采用多线程模型,每个工作线程独立接受请求,而 Nginx 使用多进程模型。这一差异导致 lua-resty-ffi 的回调机制需要适配:在 Envoy 中,回调通过 eventfd(基于 libevent)和锁定队列实现,而非 Nginx 的 pthread 条件通知。此外,Envoy 的每个过滤器配置中的源块拥有独立的 Lua 虚拟机实例,因此 lua-resty-ffi 可能在每个 Lua VM 中有多个实例,这要求开发者注意资源隔离和状态管理。

适配 Envoy 回调的关键修改

为了在 Envoy Lua 过滤器中调用 C++ 方法,需要修改 resty_ffi.lua 中的 post 函数。具体来说,通过 wrapper:this() 获取 C++ 对象地址,并实现 ffiYield 方法,将状态设为 FFICall 并挂起请求(StopIteration),等待 FFI 恢复。回调路径中,使用 Dispatcher::post 将回调投递到工作线程,进而调用 callbacks_.continueIteration() 恢复协程。这些修改确保了异步 FFI 调用与 Envoy 事件循环

多语言混合开发的实践示例

文章提供了一个 Envoy 配置示例,在 envoy_on_request 中通过 ngx.load_ffi 加载 Go 和 Python 的 FFI 模块,并调用其方法。例如,加载 ffi_go_echo 并调用 foobar 方法,以及加载 resty_ffi_python 并调用 echo 方法。测试时需设置 PYTHONPATH、LD_LIBRARY_PATH 和 LUA_PATH 环境变量,并以 --concurrency 1 运行 Envoy。这展示了如何利用 lua-resty-ffi 在 Envoy

❓

Q&A

如何在Envoy上运行lua-resty-ffi?

在Envoy 2023.7.9上运行lua-resty-ffi需要利用Envoy的过滤器机制,并适配lua-resty-ffi的回调机制,以便调用C++方法。

lua-resty-ffi的回调机制如何适配Envoy?

lua-resty-ffi的回调机制需要适配Envoy的回调机制,使用eventfd和锁定队列来实现。

Envoy的Lua过滤器支持哪些功能?

Envoy的Lua过滤器支持对请求和响应流的完全控制,并允许基于协程的异步处理。

如何在Envoy中调用C++方法?

在Envoy Lua过滤器中调用C++方法需要修改resty_ffi.lua中的post函数,并实现返回C++地址的方法。

lua-resty-ffi如何与主流编程语言集成?

lua-resty-ffi可以与Go、Python等主流编程语言集成,开发者可以直接利用Nginx和Envoy的生态系统。

在Envoy中使用lua-resty-ffi的示例代码是什么?

示例代码展示了如何在Envoy中使用lua-resty-ffi加载和调用不同的FFI模块,如Go和Python的示例。

🏷️

标签

➡️

继续阅读