首页 » 网站建设 » phpnginx添加扩大技巧_运用随便率性编程措辞为nginx扩展高机能逻辑

phpnginx添加扩大技巧_运用随便率性编程措辞为nginx扩展高机能逻辑

访客 2024-12-17 0

扫一扫用手机浏览

文章目录 [+]

由于是通过c扩展直接调用因此可以担保性能,对付任何对c扩展支持的编程措辞都可以快速接入。

‬特色先容

lua-resty-ffi供应了一个高效和通用的API,用于利用主流措辞(Go、Python、Java、Rust等)进行开放式编程。

phpnginx添加扩大技巧_运用随便率性编程措辞为nginx扩展高机能逻辑

特点:

phpnginx添加扩大技巧_运用随便率性编程措辞为nginx扩展高机能逻辑
(图片来自网络侵删)
非壅塞,以协程办法大略但可扩展的界面,支持任何符合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端口等。

该格式可以是任何序列化格式,例如json、yaml,只要它与运行时匹配。

运行时

库和配置的组合将引入一个新的运行时,该运行时期表一些线程或用于实行作业的协程。

您可以利用具有不同配置的同一库,这非常常见,特殊是对付Java和Python。

要求相应模式

Nginx事情进程和运行时之间的耦合基于交流,个中包含两个方向:

1,要求

Lua协程创造了一项任务

将任务与要求干系联,即C malloc()字符数组。
请把稳,这个字符数组将由lua-resty-ffi开释,运行时只是利用它。

将任务放入运行时的线程安全行列步队并天生

运行时轮询此行列步队

为什么不调用其他措辞供应的API?

在Go中,由于GMP模型,它可能会阻挡nginx事情进程

它增加了其他措辞供应此类API的包袱

2,回应

运行时将相应(也称为C malloc()字符数组)直接注入ngx_thread_pool_done行列步队,并通过eventfd关照nginx epoll循环,然后nginx将规复lua协程。
请把稳,lua-resty-ffi将开释相应,因此在您的运行时无需关心它。

‬压测

和unix socket domain 比拟性能报告如下

‬总结

从事nginx扩展开拓的同学可以关注下这个扩展库,它开放了一种多措辞模型,供应了灵巧的扩展办法和nginx高性能模型进行合营。

(此处已添加书本卡片,请到今日头条客户端查看)

项目地址:https://github.com/kingluo/lua-resty-ffi

标签:

相关文章

ajaxphpmysql教程技巧_PHPAJAX 与 MySQL

AJAX 数据库实例下面的实例将演示网页如何通过 AJAX 从数据库读取信息:本教程利用到的 Websites 表 SQL 文件:...

网站建设 2024-12-18 阅读0 评论0