在 openresty 中使用 capnp lua 库

1. 安装必要的工具和库

bash 复制代码
apt-get install capnproto luarocks

luarocks install lua-capnproto
luarocks install lua-cjson

lua-cjson 库不是必须的,是由于后面的演示程序要使用,就一起装上了。

可以看下库的安装位置:

bash 复制代码
root@350983744ebf:~# luarocks show lua-capnproto

lua-capnproto 0.1.4-5 - Lua-capnproto is a pure lua implementation of capnproto based on LuaJIT.

Lua-capnproto is a pure lua implementation of capnproto based on LuaJIT.

License:        BSD
Homepage:       https://github.com/calio/lua-capnproto
Installed in:   /usr/local

Modules:
        capnp (/usr/local/share/lua/5.1/capnp.lua)
        capnp.compile (/usr/local/share/lua/5.1/capnp/compile.lua)
        capnp.util (/usr/local/share/lua/5.1/capnp/util.lua)
        handwritten_capnp (/usr/local/share/lua/5.1/handwritten_capnp.lua)
        handwritten_data_generator (/usr/local/share/lua/5.1/handwritten_data_generator.lua)
        random (/usr/local/share/lua/5.1/random.lua)
        schema_capnp (/usr/local/share/lua/5.1/schema_capnp.lua)
        test (/usr/local/share/lua/5.1/test.lua)
        tool (/usr/local/share/lua/5.1/tool.lua)

Depends on:
        lua ~> 5.1 (using 5.1-1)

默认库都是安装到了 /usr/local/share/lua/5.1/ 目录下。

2. 编译 capnp 文件

先将 openresty 自带的 luajit 程序目录加入 PATH 路径中:

bash 复制代码
export PATH=$PATH:/usr/local/openresty/luajit/bin

新建一个AddressBook.capnp 文件,内容如下:

复制代码
@0xdbb9ad1f14bf0b36;  # unique file ID, generated by `capnp id`

struct Person {
  id @0 :UInt32;
  name @1 :Text;
  email @2 :Text;
  phones @3 :List(PhoneNumber);

  struct PhoneNumber {
    number @0 :Text;
    type @1 :Type;

    enum Type {
      mobile @0;
      home @1;
      work @2;
    }
  }

  employment :union {
    unemployed @4 :Void;
    employer @5 :Text;
    school @6 :Text;
    selfEmployed @7 :Void;
    # We assume that a person is only one of these.
  }
}

struct AddressBook {
  people @0 :List(Person);
}

然后编译 capnp 文件:

bash 复制代码
root@350983744ebf:~# capnp compile -olua AddressBook.capnp
root@350983744ebf:~# ls -lh
total 36K
-rw-r--r-- 1 root root  532 Oct 22 21:18 AddressBook.capnp
-rw-r--r-- 1 root root  21K Oct 22 21:20 AddressBook_capnp.lua

得到 AddressBook_capnp.lua 文件。

3. 写一个测试程序

新建一个目录,将 AddressBook_capnp.lua 文件放到这个目录。

bash 复制代码
root@350983744ebf:~# mkdir /usr/local/openresty/lua
root@350983744ebf:~# cd /usr/local/openresty/lua
root@350983744ebf:/usr/local/openresty/lua# cp /root/AddressBook_capnp.lua .

在这目录新建一个 lua 程序文件 main.lua,内容如下:

lua 复制代码
local addressBook = require "AddressBook_capnp"
local capnp = require "capnp"
local cjson = require "cjson"
local util = require "capnp.util"

local data = {
    people = {
        {
            id = 123,
            name = "Alice",
            email = "alice@example.com",
            phones = {
                {
                    number = "555-1212",
                    ["type"] = "MOBILE",
                },
            },
            employment = {
                school = "MIT",
            },
        },
        {
            id = 456,
            name = "Bob",
            email = "bob@example.com",
            phones = {
                {
                    number = "555-4567",
                    ["type"] = "HOME",
                },
                {
                    number = "555-7654",
                    ["type"] = "WORK",
                },
            },
            employment = {
                unemployed = "Void",
            },
        },
    }
}

local bin = addressBook.AddressBook.serialize(data)
local decoded = addressBook.AddressBook.parse(bin)

ngx.say(cjson.encode(decoded))

这个程序将一个 lua 数据【数据格式是按照 AddressBook.capnp 文件定义的】序列化成 capnp 二进制数据,然后将二进制数据反序列化成 lua 数据,最后使用 cjson 库将 lua 数据序列化成 json 格式,使用 nginx 输出。

4. 验证程序

修改 nginx 配置文件【 /usr/local/openresty/nginx/conf/nginx.conf】内容为:

复制代码
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    lua_package_path "/usr/local/openresty/lua/?.lua;;";
    
    server {
        listen       80;
        server_name  localhost;

        location /capnp {
            content_by_lua_file /usr/local/openresty/lua/main.lua;
        }
    }
}

启动 nginx 并验证结果:

复制代码
root@350983744ebf:~# /usr/local/openresty/nginx/sbin/nginx        

root@350983744ebf:~# 
root@350983744ebf:~# curl 127.0.0.1/capnp
{"people":[{"phones":[{"number":"555-1212","type":"MOBILE"}],"id":123,"name":"Alice","employment":{"school":"MIT"},"email":"alice@example.com"},{"phones":[{"number":"555-4567","type":"HOME"},{"number":"555-7654","type":"WORK"}],"id":456,"name":"Bob","employment":{"unemployed":"Void"},"email":"bob@example.com"}]}

和预期相符。

相关推荐
笨鸟先飞的橘猫2 天前
基于Skynet的分布式游戏场景题:大型MMO的跨服战场系统设计
分布式·学习·游戏·面试·lua
xiufeia3 天前
后端项目初始化的一些小坑点
java·junit·maven·idea
Kiyra4 天前
Query Rewrite 不是越智能越好:RAG 检索的精确词保护与动态召回
redis·websocket·junit·单元测试·json
Huanzhi_Lin4 天前
skynet笔记
笔记·lua·skynet·actor·actor模型
笨鸟先飞的橘猫4 天前
MMO游戏中的“跨服团队副本”匹配与状态同步系统
分布式·学习·游戏·lua·skynet
Kiyra5 天前
限流不是加个计数器就行:用 Lua 脚本实现多维度原子限流
开发语言·人工智能·网络协议·职场和发展·架构·lua·ai-native
谙弆悕博士6 天前
Lua学习笔记
c语言·开发语言·笔记·学习·lua·创业创新·业界资讯
weixin_408099676 天前
触动精灵调用身份证OCR识别API实现智能信息录入(Lua脚本实战)
junit·ocr·lua·自动化脚本·石榴智能·身份证ocr识别·触动精灵
卷毛的技术笔记7 天前
双十一零点扛过10倍流量洪峰:Sentinel与Redis+Lua的分布式限流深度避坑指南
java·redis·分布式·后端·系统架构·sentinel·lua
庞轩px7 天前
第五篇:分布式锁实战——Lua脚本原子操作与库存扣减的强一致性
redis·lua·分布式锁·synchronized·原子性·零超卖