Zum Inhalt

consul-event: Consul Events HTTP API Wrapper

Installation

Wenn Sie noch kein RPM-Repository-Abonnement eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.

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

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-consul-event v0.3.0, das am 17. Juni 2019 veröffentlicht wurde.


Consul Events HTTP API Wrapper

Übersicht

Dieses Modul bietet einen OpenResty-Client-Wrap für die Consul Events API. Dies ermöglicht die Integration von OpenResty mit dem benutzerdefinierten Ereignismechanismus von Consul, der verwendet werden kann, um Skripting-Infrastrukturen zu erstellen, um automatisierte Deployments durchzuführen, Dienste neu zu starten oder andere Orchestrierungsaktionen auszuführen.

Dieses Modul nutzt das Konzept der blockierenden Abfragen von Consul, um auf Ereignisse zu achten, die unter einem bestimmten Ereignisnamen gesendet werden.

Zusammenfassung

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, "ich habe ", ngx.decode_base64(event.payload))
end)

Verwendung

new

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

Instanziiert ein neues Watch-Objekt. opts kann eine Tabelle mit den folgenden Optionen sein:

  • host: String, der den Consul-Host definiert
  • port: Nummer, die den Consul-Port definiert
  • timeout: Nummer, in Sekunden, die an die Consul blockierende Abfrage-API über den wait-Parameter übergeben wird. Dieser Wert wird auch verwendet, um TCP-Schicht-Timeouts zu definieren, die höher als das Timeout der Anwendungsschicht gesetzt sind.
  • ssl_verify: Boolean, der definiert, ob das vom Remote-Consul-Server präsentierte TLS-Zertifikat validiert werden soll.
  • token: String, der das Consul ACL-Token definiert, das über den X-Consul-Token-Anforderungsheader gesendet wird.

watch

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

Überwacht die Consul-Ereignis-API auf Ereignisse, die unter einem bestimmten name gesendet werden, und führt die Funktion callback aus. callback erhält einen einzelnen Parameter event, der den Inhalt eines einzelnen Ereignisses enthält, wie er von der Consul Events API definiert ist. Callback-Funktionen sind in pcall eingewickelt, sodass es sicher ist, innerhalb dieser Funktion einen Fehler auszulösen. Callback-Funktionen können einen einzelnen Wert zurückgeben, aber dieser Wert ist weitgehend bedeutungslos; derzeit wird dieser einzelne Wert als Debug-Eintrag protokolliert.

Die Werte initial_index und seen_ids sind optional und können verwendet werden, um das Watch gegen einen bestimmten Zustand im Consul-Ereignisring zu initialisieren. initial_index wird als String erwartet, der von einem vorherigen X-Consul-Index-Header ausgegeben wird. seen_ids wird als Liste von Consul Event-ID-Werten erwartet, für die Callback-Ereignisse nicht ausgeführt werden sollen. Zum Beispiel kann der aktuelle Zustand des Ereignis-Puffers verwendet werden, um ein bestimmtes Watch zu initialisieren:

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

-- hole die aktuellen Ereignisse
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)

Hinweis: Der Inhalt dieser Funktion läuft in einer Endlosschleife, um die Consul-Ereignis-API unbegrenzt zu überwachen. Daher wird dringend empfohlen, diese Funktion innerhalb eines Hintergrundtimers aufzurufen, der über ngx.timer.at generiert wird.

Testen

Ein Test-Suite für dieses Repository ist vorhanden. Die Tests sind mit Test::Nginx geschrieben und werden mit prove ausgeführt.

Um das Verhalten der Bibliothek optimal zu testen, wird erwartet, dass ein Consul-Server läuft und zugänglich ist. Standardmäßig wird Consul unter 127.0.0.1:8500 aufgerufen; der Consul-Host und der Port können durch Definieren der Umgebungsvariablen TEST_NGINX_CONSUL_ADDR und TEST_NGINX_CONSUL_PORT überschrieben werden.

GitHub

Sie finden zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-consul-event.