当前位置: 首页 > news >正文

在 openresty 中使用 capnp lua 库

1. 安装必要的工具和库

apt-get install capnproto luarocksluarocks install lua-capnproto
luarocks install lua-cjson

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

可以看下库的安装位置:

root@350983744ebf:~# luarocks show lua-capnprotolua-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/localModules: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 路径中:

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 文件:

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 文件放到这个目录。

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,内容如下:

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"}]}

和预期相符。

http://www.lryc.cn/news/206986.html

相关文章:

  • 私藏小技巧:让微信朋友圈营销方便化的小窍门!
  • Centos使用tomcat部署jenkins
  • uni-app打包apk实现自动更新
  • SRS srs-bench
  • HackTheBox-Starting Point--Tier 1---Appointment
  • 【工具】Java请求带http重定向的地址 自动进行重定向
  • 接口自动化测试方案
  • TikTok文化探索:热议时事与社会话题
  • springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
  • QWEN technical report
  • 提升MODBUS-RTU通信数据刷新速度的常用方法
  • PyTorch 与 TensorFlow:机器学习框架之战
  • 超简单理解冒泡排序
  • 模拟IC设计工程师成长日记
  • 修炼k8s+flink+hdfs+dlink(六:学习namespace,service)
  • 法语导游就业前景如何?
  • iOS自动混淆测试处理笔记
  • C51--单片机中断
  • Linux中关于glibc包导致的服务器死机或者linux命令无法使用的情况
  • 艾泊宇产品战略:华为手机品牌是如何从低端到高端的
  • 视频批量AI智剪:提升剪辑效率的秘密方法
  • linux环境执行jar脚本
  • 特权同学FPGA官方全资料包括电子书下载
  • 《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力
  • iOS_Crash 四:的捕获和防护
  • spring boot项目运行jar包读取包内resources目录下的文件
  • 浙大陈越何钦铭数据结构06-图1 列出连通集
  • C# Winform编程(9)网络编程
  • RabbitMQ中方法channel.basicAck的使用说明
  • Jenkins+Python自动化测试持续集成详细教程