RabbitMQ: Guida introduttiva
Come utilizzare Stackhero per RabbitMQ
Utilizzare Python per connettersi a RabbitMQ
Vediamo insieme come collegare la vostra applicazione Python a RabbitMQ utilizzando la libreria Aio Pika. Nella maggior parte dei casi, è sufficiente fornire l'URL AMQPS per stabilire una connessione sicura:
connection = await aio_pika.connect_robust(
"amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
)
Ecco un esempio completo che mostra come stabilire una connessione sicura a RabbitMQ, creare un canale e dichiarare una coda di base. Questo è un ottimo modo per verificare la vostra configurazione:
import asyncio
import logging
import aio_pika
async def main() -> None:
# Se desiderate visualizzare i log di debug, potete decommentare la riga seguente
# logging.basicConfig(level=logging.DEBUG)
connection = await aio_pika.connect_robust(
"amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>"
)
async with connection:
print("The connection worked!")
channel = await connection.channel()
await channel.set_qos(prefetch_count=10)
queue = await channel.declare_queue("test_queue", auto_delete=True)
if __name__ == "__main__":
asyncio.run(main())
Gestire l'errore unable to get local issuer certificate
Se riscontrate un errore di questo tipo durante la connessione da Python:
aiormq.exceptions.AMQPConnectionError: [Errno 5] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)
significa generalmente che il certificato CA Let's Encrypt manca sul vostro sistema. Per risolvere, installate il pacchetto dei certificati CA adatto al vostro sistema operativo:
-
Su Ubuntu/Debian, eseguite:
sudo apt install ca-certificates -
Su Alpine Linux, eseguite:
apk add ca-certificates
Se non potete utilizzare questi comandi, avete comunque la possibilità di installare manualmente il certificato CA:
-
Scaricate il certificato CA Let's Encrypt da https://letsencrypt.org/certs/isrgrootx1.pem.
-
Poi, potete collegarvi a RabbitMQ nel vostro codice Python specificando il file del certificato CA:
import ssl ssl_context = ssl.create_default_context() ssl_context.load_verify_locations(cafile='isrgrootx1.pem') connection = await aio_pika.connect_robust( "amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>", ssl_context=ssl_context )
Ecco un esempio completo che utilizza il certificato CA Let's Encrypt per connessioni sicure:
import asyncio
import logging
import ssl
import aio_pika
async def main() -> None:
# Per abilitare i log di debug, potete decommentare questa riga
# logging.basicConfig(level=logging.DEBUG)
ssl_context = ssl.create_default_context()
# Caricate il certificato CA Let's Encrypt che avete scaricato
# Ad esempio: wget https://letsencrypt.org/certs/isrgrootx1.pem
ssl_context.load_verify_locations(cafile='isrgrootx1.pem')
connection = await aio_pika.connect_robust(
"amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
ssl_context=ssl_context
)
async with connection:
print("The connection worked!")
channel = await connection.channel()
await channel.set_qos(prefetch_count=10)
queue = await channel.declare_queue("test_queue", auto_delete=True)
if __name__ == "__main__":
asyncio.run(main())
Utilizzare GoLang per connettersi a RabbitMQ
Se desiderate collegare una applicazione Go a RabbitMQ, la Go RabbitMQ Client Library ufficiale rende il processo semplice. Ecco come iniziare:
- Create una nuova directory e inizializzate il vostro modulo Go:
go mod init rabbitmq-example
- Aggiungete quindi la libreria RabbitMQ al vostro progetto:
go get github.com/rabbitmq/amqp091-go
-
Ora, create un file chiamato
main.goe aggiungete questo codice:package main import ( "fmt" amqp "github.com/rabbitmq/amqp091-go" ) func main() { connection, err := amqp.Dial("amqps://<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>") if err != nil { panic(err) } defer connection.Close() fmt.Println("Successfully connected to RabbitMQ instance") } -
Eseguite il vostro codice con:
go run main.go
Se la connessione va a buon fine, vedrete il messaggio "Successfully connected to RabbitMQ instance". Questo significa che siete collegati in modo sicuro tramite autenticazione e cifratura TLS.
Per esempi più dettagliati, potete consultare gli esempi Go nel repository ufficiale RabbitMQ: https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go.
Utilizzare PHP per connettersi a RabbitMQ
Se lavorate con PHP, potete utilizzare la libreria php-amqplib per collegarvi alla vostra istanza RabbitMQ. Poiché Stackhero utilizza la cifratura TLS (SSL), è consigliato utilizzare AMQPSSLConnection:
use PhpAmqpLib\Connection\AMQPSSLConnection;
$connection = new AMQPSSLConnection(
'<XXXXXX>.stackhero-network.com',
<AMQP_PORT_TLS>,
'admin',
'<PASSWORD>',
'/',
array()
);
/**
* @param \PhpAmqpLib\Connection\AbstractConnection $connection
*/
function shutdown($connection)
{
$connection->close();
}
register_shutdown_function('shutdown', $connection);
Scaricare manualmente il certificato CA
A volte, la vostra connessione TLS potrebbe richiedere un certificato di Autorità di Certificazione (CA). Molti sistemi lo includono già, ma potete scaricarlo manualmente se necessario. Ecco come fare:
- Scaricate il certificato da https://letsencrypt.org/certs/isrgrootx1.pem e salvatelo sul vostro server.
- Poi, potete collegarvi tramite PHP utilizzando il certificato scaricato come segue:
$sslOptions = array(
'cafile' => realpath(__DIR__ . '/isrgrootx1.pem'),
);
$connection = new AMQPSSLConnection(
'<XXXXXX>.stackhero-network.com',
<AMQP_PORT_TLS>,
'admin',
'<PASSWORD>',
'/',
$sslOptions
);
Utilizzare PHP/Symfony per connettersi a RabbitMQ
Se utilizzate Symfony, potete configurarlo per usare RabbitMQ come message broker impostando la variabile d'ambiente MESSENGER_TRANSPORT_DSN. È sufficiente aggiornare il vostro file .env:
MESSENGER_TRANSPORT_DSN=amqps://<USER>:<PASSWORD>@<HOST>:<PORT>/%2f/messages?cacert=%2Fetc%2Fssl%2Fcerts%2Fca-certificates.crt
Sostituite
<USER>,<PASSWORD>,<HOST>e<PORT>con i vostri dati RabbitMQ.
Successivamente, assicuratevi che il file config/packages/messenger.yaml utilizzi la variabile MESSENGER_TRANSPORT_DSN. Dovrebbe essere simile a questo:
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
Utilizzare Spring Boot per connettersi a RabbitMQ
Per le applicazioni Spring Boot, potete configurare una connessione sicura alla vostra istanza Stackhero RabbitMQ aggiornando le proprietà dell'applicazione:
spring.rabbitmq.host=<XXXXXX>.stackhero-network.com
spring.rabbitmq.port=<AMQP_PORT_TLS>
spring.rabbitmq.username=admin
spring.rabbitmq.password=<PASSWORD>
spring.rabbitmq.ssl.enabled=true
spring.rabbitmq.ssl.algorithm=TLSv1.2
Utilizzare .NET e MassTransit per connettersi a RabbitMQ
Se sviluppate con .NET e MassTransit, ecco come potete configurare il vostro progetto per collegarvi in modo sicuro a Stackhero RabbitMQ tramite cifratura TLS:
using MassTransit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
public class Program
{
public static void Main(string[] args)
{
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
services.AddMassTransit(x =>
{
x.UsingRabbitMq((context, cfg) =>
{
cfg.Host(new Uri("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>"), h =>
{
h.UseSsl(s =>
{
s.Protocol = System.Security.Authentication.SslProtocols.Tls12;
});
});
});
});
services.AddMassTransitHostedService(true);
})
.Build();
host.Run();
}
}
Gestire l'errore CLIENT ALERT: Fatal - Handshake Failure con Elixir
Se vi collegate da Elixir e visualizzate il messaggio di errore
CLIENT ALERT: Fatal - Handshake Failure
questo di solito indica un bug nel supporto della libreria AMQP per TLS 1.3. Una soluzione affidabile è forzare l'utilizzo di TLS 1.2 includendo questa opzione quando aprite la connessione:
AMQP.Connection.open("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>", :undefined, ssl_options: [ versions: [ :"tlsv1.2" ] ])
Gestire l'errore Error: Socket closed abruptly during opening handshake con Node.js
Se visualizzate l'errore Error: Socket closed abruptly during opening handshake utilizzando Node.js, probabilmente state usando una versione della libreria amqplib precedente alla 0.10.7 con RabbitMQ 4.1.0 o superiore. Questa modifica è legata all'impostazione frame_max introdotta in RabbitMQ 4.1.0.
Per risolvere il problema, aggiornate la vostra libreria amqplib alla versione 0.10.7 o successiva.