consul-event: Envoltura de la API HTTP de Eventos de Consul
Instalación
Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.
CentOS/RHEL 7 o 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
Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.
Este documento describe lua-resty-consul-event v0.3.0 lanzado el 17 de junio de 2019.
Envoltura de la API HTTP de Eventos de Consul
Descripción general
Este módulo proporciona una envoltura de cliente OpenResty para la API de Eventos de Consul. Esto permite la integración de OpenResty con el mecanismo de eventos de usuario personalizado de Consul, que se puede utilizar para construir infraestructura de scripting para realizar despliegues automáticos, reiniciar servicios o realizar cualquier otra acción de orquestación.
Este módulo aprovecha el concepto de consultas bloqueantes de Consul para observar eventos transmitidos bajo un nombre de evento dado.
Sinopsis
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, "recibí ", ngx.decode_base64(event.payload))
end)
Uso
new
syntax: e, err = event.new(opts?)
Instancia un nuevo objeto de observación. opts puede ser una tabla con las siguientes opciones:
host: Cadena que define el host de Consulport: Número que define el puerto de Consultimeout: Número, en segundos, que se pasa a la API de consulta bloqueante de Consul a través del parámetrowait. Este valor también se utiliza para definir los tiempos de espera de la capa TCP, que se establecen más altos que el tiempo de espera de la capa de aplicación.ssl_verify: Booleano que define si se debe validar el certificado TLS presentado por el servidor remoto de Consul.token: Cadena que define el token ACL de Consul que se enviará a través del encabezado de solicitudX-Consul-Token.
watch
syntax: e:watch(name, callback, initial_index, seen_ids)
Observa la API de eventos de Consul para eventos transmitidos bajo un name dado, y ejecuta la función callback. A callback se le pasa un único parámetro event, que contiene el cuerpo de un solo evento según lo definido por la API de Eventos de Consul. Las funciones de callback están envueltas en pcall, por lo que es seguro lanzar un error desde dentro de esta función. Las funciones de callback pueden devolver un único valor, pero este valor es en gran medida irrelevante; actualmente, este único valor se registra como una entrada de depuración.
Los valores initial_index y seen_ids son opcionales y pueden usarse para inicializar la observación contra un cierto estado en el anillo de eventos de Consul. Se espera que initial_index sea una cadena producida por un encabezado anterior X-Consul-Index. Se espera que seen_ids sea una lista de valores de ID de Evento de Consul para los cuales no se deben ejecutar eventos de callback. Por ejemplo, el estado actual del búfer de eventos se puede usar para inicializar una observación dada:
local h = require("resty.http").new()
-- obtener los eventos actuales
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)
Nota: El cuerpo de esta función se ejecuta en un bucle infinito para observar la API de eventos de Consul indefinidamente. Como resultado, se recomienda encarecidamente llamar a esta función dentro de un temporizador en segundo plano generado a través de ngx.timer.at
Pruebas
Se proporciona un conjunto de pruebas para este repositorio. Las pruebas están escritas utilizando Test::Nginx y se ejecutan con prove.
Para probar mejor el comportamiento de la biblioteca, el conjunto espera que un servidor Consul esté en ejecución y sea accesible. Por defecto, Consul se accede en 127.0.0.1:8500; el host y el puerto de Consul pueden ser sobreescritos definiendo las variables ambientales TEST_NGINX_CONSUL_ADDR y TEST_NGINX_CONSUL_PORT, respectivamente.
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-consul-event.