consul: Bibliothèque pour interagir avec l'API HTTP consul depuis nginx-module-lua
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
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
Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.
Ce document décrit lua-resty-consul v0.4.0 publié le 18 août 2021.
Bibliothèque pour interagir avec l'API HTTP consul depuis ngx_lua
Aperçu
Les méthodes retournent toutes un objet de réponse lua-resty-http.
Le corps de la réponse a été lu et est défini sur res.body, décodé en JSON si la réponse a un en-tête Content-Type de Application/JSON.
Tous les en-têtes de réponse sont disponibles à res.headers.
Le paramètre ACL Token est toujours envoyé en tant qu'en-tête X-Consul-Token plutôt que d'être inclus dans la chaîne de requête.
Si les arguments wait ou index sont fournis, le délai d'attente de lecture de la requête est prolongé en conséquence.
wait doit être passé en tant que nombre de secondes, n'incluez pas s ou toute autre chaîne d'unité.
local resty_consul = require('resty.consul')
local consul = resty_consul:new({
host = "127.0.0.1",
port = 8500,
connect_timeout = (60*1000), -- 60s
read_timeout = (60*1000), -- 60s
default_args = {
token = "my-default-token"
},
ssl = false,
ssl_verify = true,
sni_host = nil,
})
local res, err = consul:get('/agent/services')
if not res then
ngx.log(ngx.ERR, err)
return
end
ngx.print(res.status) -- 200
local services = res.body -- réponse décodée en JSON
local res, err = consul:put('/agent/service/register', my_service_definition, { token = "override-token" })
if not res then
ngx.log(ngx.ERR, err)
return
end
ngx.print(res.status) -- 200
ngx.print(res.headers["X-Consul-Knownleader"]) -- "true"
local service_register_response = res.body -- réponse décodée en JSON
local res, err = consul:list_keys() -- Obtenir toutes les clés
if not res then
ngx.log(ngx.ERR, err)
return
end
local keys = {}
if res.status == 200 then
keys = res.body
end
for _, key in ipairs(keys) do
local res, err = consul:get_key(key)
if not res then
ngx.log(ngx.ERR, err)
return
end
ngx.print(res.body[1].Value) -- Valeur de la clé après décodage base64
end
Méthodes de base
new
syntax: client = consul:new(opts?)
Crée un nouveau client consul. opts est une table définissant les options suivantes :
hostPar défaut 127.0.0.1portPar défaut 8500. À définir sur0si vous utilisez un socket unix commehost.connect_timeoutDélai d'attente de connexion en ms. Par défaut 60sread_timeoutDélai d'attente de lecture en ms. Par défaut 60sdefault_argsTable des arguments de chaîne de requête à envoyer avec toutes les requêtes (par exemple,token) Par défaut videsslBooléen, activer les requêtes HTTPS. Par défautfalse.ssl_verifyBooléen, vérifier les certificats SSL. Par défauttrue.sni_hostNom d'hôte à utiliser lors de la vérification des certificats SSL.
get
syntax: res, err = consul:get(path, args?)
Effectue une requête GET vers le chemin fourni. La version de l'API est automatiquement préfixée.
args est une table de paramètres de chaîne de requête à ajouter à l'URI.
Retourne un objet de réponse lua-resty-http.
En cas d'erreur, retourne nil et un message d'erreur.
put
syntax: res, err = consul:put(path, body, args?)
Effectue une requête PUT vers le chemin fourni. La version de l'API est automatiquement préfixée.
args est une table de paramètres de chaîne de requête à ajouter à l'URI.
Si body est une table ou une valeur booléenne, elle est automatiquement encodée en JSON avant d'être envoyée.
Sinon, tout ce que lua-resty-http accepte comme entrée de corps est valide.
Retourne un objet de réponse lua-resty-http.
En cas d'erreur, retourne nil et un message d'erreur.
delete
syntax: res, err = consul:delete(path, args?)
Effectue une requête GET vers le chemin fourni. La version de l'API est automatiquement préfixée.
args est une table de paramètres de chaîne de requête à ajouter à l'URI.
Retourne un objet de réponse lua-resty-http.
En cas d'erreur, retourne nil et un message d'erreur.
get_client_body_reader
Méthode proxy pour lua-resty-http
Helpers de clé-valeur
Ces méthodes préfixent automatiquement /v1/kv, seule la clé réelle doit être passée.
Les valeurs encodées en base64 sont automatiquement décodées.
get_key
syntax: res, err = consul:get_key(key, args?)
Récupère une clé KV de Consul. Les valeurs sont décodées en Base64.
args est une table de paramètres de chaîne de requête à ajouter à l'URI.
Retourne un objet de réponse lua-resty-http.
En cas d'erreur, retourne nil et un message d'erreur.
put_key
syntax: res, err = consul:put_key(key, value, args?)
Crée ou met à jour une clé KV.
args est une table de paramètres de chaîne de requête à ajouter à l'URI.
Si value est une table ou une valeur booléenne, elle est automatiquement encodée en JSON avant d'être envoyée.
Sinon, tout ce que lua-resty-http accepte comme entrée de corps est valide.
Retourne un objet de réponse lua-resty-http.
En cas d'erreur, retourne nil et un message d'erreur.
delete
syntax: res, err = consul:delete_key(key, args?)
Supprime une entrée KV.
args est une table de paramètres de chaîne de requête à ajouter à l'URI.
Retourne un objet de réponse lua-resty-http.
En cas d'erreur, retourne nil et un message d'erreur.
list_keys
syntax: res, err = consul:list_keys(prefix?, args?)
Récupère toutes les clés dans le magasin KV. Optionnellement dans un prefix.
args est une table de paramètres de chaîne de requête à ajouter à l'URI.
keys est toujours défini comme un paramètre de chaîne de requête avec cette méthode.
Retourne un objet de réponse lua-resty-http.
En cas d'erreur, retourne nil et un message d'erreur.
Helper de transaction
txn
syntax: res, err = consul:txn(payload, args?)
Effectue une requête PUT vers le point de terminaison API /v1/txn avec le payload fourni.
payload peut être fourni sous forme de table Lua, auquel cas les clés Value seront automatiquement encodées en base64.
Sinon, tout ce que lua-resty-http accepte comme entrée de corps est valide.
Retourne un objet de réponse lua-resty-http.
En cas d'erreur, retourne nil et un message d'erreur.
Les valeurs KV dans le corps de la réponse sont automatiquement décodées en base64.
local txn_payload = {
{
KV = {
Verb = "set",
Key = "foo",
Value = "bar",
}
},
{
KV = {
Verb = "get",
Key = "foobar",
}
}
}
local consul = resty_consul:new()
local res, err = consul:txn(txn_payload)
if not res then
ngx.say(err)
return
end
ngx.say(res.body.Results[2].KV.Value) -- "bar"
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.