Saltar a contenido

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 Consul
  • port: Número que define el puerto de Consul
  • timeout: Número, en segundos, que se pasa a la API de consulta bloqueante de Consul a través del parámetro wait. 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 solicitud X-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.