使用任意编程语言为nginx扩展高性能逻辑


使用任意编程语言为nginx扩展高性能逻辑

文章插图
 
?架构如上图所示
Lua-resty-ffi提供了一个高效和通用的API , 用于使用主流语言(go、Python/ target=_blank class=infotextkey>Python、JAVA、Rust等)进行开放式编程 。
因为是通过c扩展直接调用因此可以保证性能 , 对于任何对c扩展支持的编程语言都可以快速接入 。
?特征介绍
lua-resty-ffi提供了一个高效和通用的API , 用于使用主流语言(Go、Python、Java、Rust等)进行开放式编程 。
特点:
 
  • 非阻塞 , 以协程方式
  • 简单但可扩展的界面 , 支持任何符合C ABI的语言
  • 总的来说 , 不再需要编写C/Lua代码来进行耦合
  • 高性能 , 比unix域套接字方式更快
  • Python/java的通用加载程序库
  • 您喜欢的任何序列化消息格式
?使用举例 
以go为例
cd /opt
git clone https://github.com/kingluo/lua-resty-ffi
cd lua-resty-ffi
# compile and install openresty with lua-resty-ffi
# optionally, you could specify any compile options you need, e.g.
# ./build.sh --with-pcre-jit --add-module=...
./build.sh
cd examples/go
# install golang if not yet
wget https://go.dev/dl/go1.19.3.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.3.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
# compile example libraries
make
# run Nginx
make run
# in another terminal
curl http://localhost:20000/echo
ok
有关详细信息 , 请查看每种编程语言的目录 。
此外 , 请查看此博客文章:http://luajit.io/post/implement-grpc-client-in-rust-for-openresty/
该文章讲到如何通过rust使用openresty
?背景
在openresty领域 , 当你转向实现一些逻辑 , 特别是与第三方流行框架相结合时 , 它可能会很尴尬:没有对应的接入方式 。
C是一种低级语言 , 没有统一和丰富的库和生态系统 , 大多数现代框架不支持C , 相反 , 它们喜欢Java、Python、Go 。C适用于基础软件 。
Lua是一种嵌入式和最小的编程语言 , 这意味着所有力量都来自主机 。在开放中 , 这意味着所有功能都来自lua-nginx模块 。像C一样 , 甚至更糟糕的是 , 你必须通过Cosocket重新发明车轮 , 才能做现代网络的事情 。许多lua-resty-*诞生了 , 但与其他语言的母语lib相比 , 它们几乎是半成品 。例如 , lua-resty-kafka不支持消费者团体 , lua-resty-postgres不支持通知和准备声明等 。此外 , lua-resty-*的大多数作者在某个阶段停止了开发 , 因为lua社区太小了 , 吸引力也更小 。
?为什么不用wasm
WASM有以下缺点 , 因此不适合开放:
 
  • 没有协程 , 这意味着您需要从头到尾执行逻辑 , 并以任意时间阻止nginx工作进程
  • 阉割的语言支持 , 例如
  • Go:你必须使用tinygo , 而不是官方golang 。
  • Rust:您必须使用专用工具集来完成工作 , 例如 , 当您需要异步网络编程时 , tokio不可用 , 相反 , 您必须使用基于WASI的定制版 , 例如wasmedge_wasi_socket 。
  • Python:您必须使用支持WASM的实现 , 例如rustpython 。
  • 复杂的开发 , 由于沙盒的初衷 , 您必须从nginx导出大量API
 
那么 , 我可以用现代编程语言(Go、Python、Java、Rust等)扩展开放性 , 并直接重用它们丰富的生态系统吗?是的 , 这就是lua-resty-ffi所做的 。
?相关概念
  • 扩展库:在Go和Rust中 , 它意味着编译的库 , 例如libffi_go_etcd.so 。
 
在Python3中 , 这意味着带有本机python3模块的加载程序库libffi_python3.so 。
在Java中 , 它意味着带有原生Java类/jar的加载程序库libffi_java.so 。
 
  • 库的配置 , 例如等端口、kafka端口等 。
 


推荐阅读