lua-resty-ffi 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
lua-resty-ffi 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
lua-resty-ffi 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 BSD
开发语言 C/C++ Lua
操作系统 跨平台
软件类型 开源软件
所属分类 Web应用开发网站API
开源组织
地区 国产
投 递 者 kingluo
适用人群 未知
收录时间 2022-11-27

软件简介

lua-resty-ffi提供了一个通用高效的接口,使得你可以使用Go,Python,Java和Rust为 OpenResty/Nginx 直接开发你想要的功能。

众所周知,OpenResty使用的lua和C,生态很弱,很多重造的轮子也缺乏维护,以至于跟外围生态系统互通时,巧妇难为无米之炊。

特色:

  • 非阻塞,以协程的方式运行
  • 简单可扩展的接口,支持任何符合C ABI的语言
  • 一劳永逸,无需再编写任何C或者lua的模块来开发新功能
  • 高性能,比unix domain socket要快
  • 通用的java、python加载器
  • 可使用任何你喜欢的消息序列化格式

最简单的实例:

使用golang开发一个echo功能。

创建文件:​echo.go

package main

/*
#cgo LDFLAGS: -shared
#include <string.h>
void* ngx_http_lua_ffi_task_poll(void *p);
char* ngx_http_lua_ffi_get_req(void *tsk, int *len);
void ngx_http_lua_ffi_respond(void *tsk, int rc, char* rsp, int rsp_len);
*/
import "C"
import (
	"log"
	"unsafe"
)

//export libffi_init
func libffi_init(cfg_cstr *C.char, tq unsafe.Pointer) C.int {
	log.Println("start go echo runtime")
	go func() {
		for {
			task := C.ngx_http_lua_ffi_task_poll(tq)
			if task == nil {
				break
			}
			var rlen C.int
			r := C.ngx_http_lua_ffi_get_req(task, &rlen)
			res := C.malloc(C.ulong(rlen))
			C.memcpy(res, unsafe.Pointer(r), C.ulong(rlen))
			C.ngx_http_lua_ffi_respond(task, 0, (*C.char)(res), rlen)
		}
		log.Println("exit go echo runtime")
	}()
	return 0
}

func main() {}

 

创建文件:nginx.conf

daemon off;
error_log /dev/stderr info;
worker_processes auto;
env LD_LIBRARY_PATH;

events {}

http {
    server {
        listen 20000;

        location /echo {
            content_by_lua_block {
                local demo = ngx.load_ffi("ffi_go_echo")
                local ok, res = demo:echo("foobar")
                assert(ok)
                assert(res == "foobar")

                demo:__unload()
                ok, res = demo:echo("foobar")
                assert(not ok)
                ngx.log(ngx.ERR, res)

                ngx.say("ok")
            }
        }
    }
}

运行:

​go build -buildmode=c-shared -o libffi_go_echo.so echo.go
LD_LIBRARY_PATH=$(PWD) $(NGINX_BIN) -p $(PWD) -c nginx.conf
curl localhost:20000/echo

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论

点击引领话题📣 发布并加入讨论🔥
暂无内容
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
0 评论
7 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部