consul-event: Consul 事件 HTTP API 包装器
安装
如果您尚未设置 RPM 仓库订阅,请 注册。然后您可以继续以下步骤。
CentOS/RHEL 7 或 Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-consul-event
CentOS/RHEL 8+、Fedora Linux、Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-consul-event
要在 NGINX 中使用此 Lua 库,请确保已安装 nginx-module-lua。
本文档描述了 lua-resty-consul-event v0.3.0,于 2019 年 6 月 17 日发布。
Consul 事件 HTTP API 包装器
概述
该模块为 Consul 事件 API 提供了 OpenResty 客户端包装器。这允许 OpenResty 与 Consul 的自定义用户事件机制集成,可用于构建脚本基础设施,以进行自动部署、重启服务或执行任何其他编排操作。
该模块利用 Consul 的 阻塞查询 概念来监视在给定事件名称上广播的事件。
概要
local event = require "resty.consul.event"
local e, err = event.new({
host = "127.0.0.1",
port = 8500,
})
if err then
ngx.log(ngx.ERR, err)
end
e:watch("foo", function(event)
ngx.log(ngx.INFO, "我得到了 ", ngx.decode_base64(event.payload))
end)
用法
new
语法: e, err = event.new(opts?)
实例化一个新的监视对象。opts 可以是一个包含以下选项的表:
host: 定义 Consul 主机的字符串port: 定义 Consul 端口的数字timeout: 以秒为单位的数字,通过wait参数传递给 Consul 阻塞查询 API。此值也用于定义 TCP 层超时,设置高于应用层超时。ssl_verify: 布尔值,定义是否验证远程 Consul 服务器提供的 TLS 证书。token: 定义通过X-Consul-Token请求头发送的 Consul ACL 令牌的字符串。
watch
语法: e:watch(name, callback, initial_index, seen_ids)
监视 Consul 事件 API 中以给定 name 广播的事件,并执行函数 callback。callback 接收一个参数 event,该参数包含由 Consul 事件 API 定义的单个事件的主体。回调函数被包装在 pcall 中,因此从此函数内部抛出错误是安全的。回调函数可以返回一个单一的值,但这个值在很大程度上是没有意义的;目前,这个单一的值被记录为调试条目。
initial_index 和 seen_ids 是可选的,可以用于根据 Consul 事件环中的某个状态初始化监视。initial_index 预计是由先前的 X-Consul-Index 头输出的字符串。seen_ids 预计是一个 Consul 事件 ID 值的列表,对于这些 ID,不应执行回调事件。例如,可以使用事件缓冲区的当前状态来初始化给定的监视:
local h = require("resty.http").new()
-- 获取当前事件
local res, err = h:request_uri("http://127.0.0.1:8500/v1/event/list?name=foo")
if err then
ngx.log(ngx.ERR, err)
end
local event = require "resty.consul.event"
local e, err = event.new({
host = "127.0.0.1",
port = 8500,
})
if err then
ngx.log(ngx.ERR, err)
end
local l = {}
for _, e in ipairs(require("cjson").decode(res.body)) do
table.insert(l, e.ID)
end
ngx.timer.at(0, function()
e:watch(
"foo",
function(p) ngx.log(ngx.DEBUG, p.payload) end,
res.headers["X-Consul-Index"],
l
)
end)
注意:此函数的主体在无限循环中运行,以便无限期监视 Consul 事件 API。因此,强烈建议在通过 ngx.timer.at 生成的后台定时器中调用此函数。
测试
为此仓库提供了测试套件。测试使用 Test::Nginx 编写,并通过 prove 执行。
为了最佳测试库行为,套件期望 Consul 服务器正在运行并可访问。默认情况下,Consul 通过 127.0.0.1:8500 访问;可以通过定义环境变量 TEST_NGINX_CONSUL_ADDR 和 TEST_NGINX_CONSUL_PORT 来覆盖 Consul 主机和端口。
GitHub
您可以在 nginx-module-consul-event 的 GitHub 仓库 中找到此模块的其他配置提示和文档。