RabbitMQ: Aan de slag
Hoe Stackhero gebruiken voor RabbitMQ
Python gebruiken om verbinding te maken met RabbitMQ
Hier leggen we uit hoe u uw Python-applicatie kunt verbinden met RabbitMQ met behulp van de Aio Pika bibliotheek. In de meeste gevallen hoeft u alleen de AMQPS-URL op te geven voor een beveiligde verbinding:
connection = await aio_pika.connect_robust(
"amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
)
Hieronder vindt u een volledig voorbeeld dat laat zien hoe u een beveiligde verbinding met RabbitMQ tot stand brengt, een channel aanmaakt en een eenvoudige queue declareert. Dit is een goede manier om uw setup te verifiëren:
import asyncio
import logging
import aio_pika
async def main() -> None:
# Als u debuglogs wilt zien, kunt u de volgende regel deblokkeren
# 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())
Foutmelding unable to get local issuer certificate oplossen
Als u bij het verbinden vanuit Python een foutmelding zoals deze krijgt:
aiormq.exceptions.AMQPConnectionError: [Errno 5] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)
betekent dit meestal dat het Let's Encrypt CA-certificaat op uw systeem ontbreekt. U kunt dit oplossen door het pakket met CA-certificaten voor uw besturingssysteem te installeren:
-
Op Ubuntu/Debian voert u uit:
sudo apt install ca-certificates -
Op Alpine Linux voert u uit:
apk add ca-certificates
Als u deze commando's niet kunt gebruiken, kunt u het CA-certificaat ook handmatig installeren:
-
Download het Let's Encrypt CA-certificaat van https://letsencrypt.org/certs/isrgrootx1.pem.
-
Vervolgens kunt u in uw Python-code verbinding maken met RabbitMQ door het CA-certificaatbestand op te geven:
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 )
Hieronder vindt u een volledig voorbeeld waarbij het Let's Encrypt CA-certificaat wordt gebruikt voor een beveiligde verbinding:
import asyncio
import logging
import ssl
import aio_pika
async def main() -> None:
# Om debuglogs te activeren, kunt u deze regel deblokkeren
# logging.basicConfig(level=logging.DEBUG)
ssl_context = ssl.create_default_context()
# Laad het Let's Encrypt CA-certificaat dat u heeft gedownload
# Bijvoorbeeld: 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())
GoLang gebruiken om verbinding te maken met RabbitMQ
Als u vanuit een Go-applicatie verbinding wilt maken met RabbitMQ, maakt de officiële Go RabbitMQ Client Library dit eenvoudig. Zo kunt u aan de slag:
- Maak een nieuwe directory aan en initialiseer uw Go-module:
go mod init rabbitmq-example
- Voeg vervolgens de RabbitMQ-bibliotheek toe aan uw project:
go get github.com/rabbitmq/amqp091-go
-
Maak nu een bestand met de naam
main.goen voeg deze code toe: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") } -
U kunt uw code uitvoeren met:
go run main.go
Als de verbinding succesvol is, ziet u het bericht "Successfully connected to RabbitMQ instance". Dit betekent dat u veilig bent verbonden met authenticatie en TLS-encryptie.
Voor meer uitgebreide voorbeelden kunt u de Go-voorbeelden in de officiële RabbitMQ-repository bekijken: https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go.
PHP gebruiken om verbinding te maken met RabbitMQ
Als u met PHP werkt, kunt u de php-amqplib bibliotheek gebruiken om verbinding te maken met uw RabbitMQ-instantie. Omdat Stackhero TLS-encryptie (SSL) gebruikt, is het aan te raden om AMQPSSLConnection te gebruiken:
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);
CA-certificaat handmatig downloaden
Soms vereist uw TLS-verbinding een Certificate Authority (CA) certificaat. Veel systemen bevatten dit al, maar u kunt het indien nodig handmatig downloaden. Zo doet u dat:
- Download het certificaat van https://letsencrypt.org/certs/isrgrootx1.pem en sla het op uw server op.
- Vervolgens kunt u verbinding maken met PHP door het gedownloade certificaat als volgt te gebruiken:
$sslOptions = array(
'cafile' => realpath(__DIR__ . '/isrgrootx1.pem'),
);
$connection = new AMQPSSLConnection(
'<XXXXXX>.stackhero-network.com',
<AMQP_PORT_TLS>,
'admin',
'<PASSWORD>',
'/',
$sslOptions
);
PHP/Symfony gebruiken om verbinding te maken met RabbitMQ
Als u Symfony gebruikt, kunt u deze configureren om RabbitMQ als message broker te gebruiken door de omgevingsvariabele MESSENGER_TRANSPORT_DSN in te stellen. U hoeft alleen uw .env-bestand aan te passen:
MESSENGER_TRANSPORT_DSN=amqps://<USER>:<PASSWORD>@<HOST>:<PORT>/%2f/messages?cacert=%2Fetc%2Fssl%2Fcerts%2Fca-certificates.crt
Vervang
<USER>,<PASSWORD>,<HOST>en<PORT>door uw eigen RabbitMQ-gegevens.
Controleer vervolgens of uw config/packages/messenger.yaml-bestand de variabele MESSENGER_TRANSPORT_DSN gebruikt. Dit zou er ongeveer zo uit moeten zien:
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
Spring Boot gebruiken om verbinding te maken met RabbitMQ
Voor Spring Boot-applicaties kunt u een beveiligde verbinding met uw Stackhero RabbitMQ-instantie opzetten door uw application properties bij te werken:
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
.NET en MassTransit gebruiken om verbinding te maken met RabbitMQ
Als u ontwikkelt met .NET en MassTransit, kunt u uw project als volgt configureren om veilig verbinding te maken met Stackhero RabbitMQ via TLS-encryptie:
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();
}
}
Foutmelding CLIENT ALERT: Fatal - Handshake Failure oplossen met Elixir
Als u verbinding maakt vanuit Elixir en de volgende foutmelding ziet:
CLIENT ALERT: Fatal - Handshake Failure
wijst dit meestal op een bug in de AMQP-bibliotheek met betrekking tot ondersteuning voor TLS 1.3. Een betrouwbare workaround is om het gebruik van TLS 1.2 af te dwingen door deze optie toe te voegen bij het openen van de verbinding:
AMQP.Connection.open("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>", :undefined, ssl_options: [ versions: [ :"tlsv1.2" ] ])
Foutmelding Error: Socket closed abruptly during opening handshake oplossen met Node.js
Als u de foutmelding Error: Socket closed abruptly during opening handshake ziet bij het gebruik van Node.js, komt dit waarschijnlijk doordat u een versie van de amqplib-bibliotheek gebruikt die ouder is dan 0.10.7 in combinatie met RabbitMQ 4.1.0 of nieuwer. Deze wijziging houdt verband met de frame_max instelling die is geïntroduceerd in RabbitMQ 4.1.0.
Om dit op te lossen, kunt u uw amqplib-bibliotheek bijwerken naar versie 0.10.7 of nieuwer.