Aller au contenu

consul-event: Wrapper de l'API HTTP des événements Consul

Installation

Si vous n'avez pas configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

CentOS/RHEL 7 ou 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

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-consul-event v0.3.0 publié le 17 juin 2019.


Wrapper de l'API HTTP des événements Consul

Vue d'ensemble

Ce module fournit un wrapper client OpenResty pour l'API des événements Consul. Cela permet l'intégration d'OpenResty avec le mécanisme d'événements utilisateur personnalisé de Consul, qui peut être utilisé pour construire une infrastructure de script pour effectuer des déploiements automatisés, redémarrer des services ou effectuer toute autre action d'orchestration.

Ce module exploite le concept de requêtes bloquantes de Consul pour surveiller les événements diffusés sous un nom d'événement donné.

Synopsis

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, "j'ai reçu ", ngx.decode_base64(event.payload))
end)

Utilisation

new

syntax: e, err = event.new(opts?)

Instancie un nouvel objet de surveillance. opts peut être une table avec les options suivantes :

  • host: Chaîne définissant l'hôte Consul
  • port: Nombre définissant le port Consul
  • timeout: Nombre, en secondes, à passer à l'API de requête bloquante de Consul via le paramètre wait. Cette valeur est également utilisée pour définir les délais d'attente de la couche TCP, qui sont fixés plus élevés que le délai d'attente de la couche application.
  • ssl_verify: Booléen définissant s'il faut valider le certificat TLS présenté par le serveur Consul distant.
  • token: Chaîne définissant le jeton ACL Consul à envoyer via l'en-tête de requête X-Consul-Token.

watch

syntax: e:watch(name, callback, initial_index, seen_ids)

Surveille l'API des événements Consul pour les événements diffusés sous un name donné, et exécute la fonction callback. callback reçoit un seul paramètre event, qui contient le corps d'un événement unique tel que défini par l'API des événements Consul. Les fonctions de rappel sont enveloppées dans pcall, il est donc sûr de lancer une erreur depuis cette fonction. Les fonctions de rappel peuvent renvoyer une seule valeur, mais cette valeur est largement insignifiante ; actuellement, cette valeur unique est enregistrée comme une entrée de débogage.

Les valeurs initial_index et seen_ids sont optionnelles et peuvent être utilisées pour initialiser la surveillance contre un certain état dans le cercle des événements Consul. initial_index est censé être une chaîne produite par un en-tête X-Consul-Index précédent. seen_ids est censé être une liste de valeurs d'ID d'événements Consul pour lesquels les événements de rappel ne doivent pas être exécutés. Par exemple, l'état actuel du tampon d'événements peut être utilisé pour initialiser une surveillance donnée :

local h = require("resty.http").new()

-- obtenir les événements actuels
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)

Note : Le corps de cette fonction s'exécute dans une boucle infinie afin de surveiller indéfiniment l'API des événements Consul. Par conséquent, il est fortement recommandé d'appeler cette fonction à l'intérieur d'un minuteur en arrière-plan généré via ngx.timer.at

Tests

Une suite de tests pour ce dépôt est fournie. Les tests sont écrits en utilisant Test::Nginx et exécutés avec prove.

Pour tester au mieux le comportement de la bibliothèque, la suite s'attend à ce qu'un serveur Consul soit en cours d'exécution et accessible. Par défaut, Consul est accessible à 127.0.0.1:8500 ; l'hôte et le port de Consul peuvent être remplacés en définissant les variables d'environnement TEST_NGINX_CONSUL_ADDR et TEST_NGINX_CONSUL_PORT, respectivement.

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-consul-event.