RabbitMQ: Pierwsze kroki
Jak korzystać ze Stackhero dla RabbitMQ
Łączenie się z RabbitMQ za pomocą Pythona
Pokażemy, jak połączyć swoją aplikację Python z RabbitMQ, korzystając z biblioteki Aio Pika. W większości przypadków wystarczy podać adres URL AMQPS, aby nawiązać bezpieczne połączenie:
connection = await aio_pika.connect_robust(
"amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
)
Poniżej znajduje się kompletny przykład pokazujący, jak nawiązać bezpieczne połączenie z RabbitMQ, utworzyć kanał i zadeklarować podstawową kolejkę. To dobry sposób na weryfikację konfiguracji:
import asyncio
import logging
import aio_pika
async def main() -> None:
# Jeśli chcesz zobaczyć logi debugowania, możesz odkomentować poniższą linię
# 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())
Obsługa błędu unable to get local issuer certificate
Jeśli podczas łączenia się z Pythona pojawi się błąd:
aiormq.exceptions.AMQPConnectionError: [Errno 5] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)
najczęściej oznacza to brak certyfikatu CA Let's Encrypt w systemie. Aby to naprawić, zainstaluj pakiet certyfikatów CA odpowiedni dla Twojego systemu operacyjnego:
-
Na Ubuntu/Debian uruchom:
sudo apt install ca-certificates -
Na Alpine Linux uruchom:
apk add ca-certificates
Jeśli nie możesz użyć tych poleceń, możesz również zainstalować certyfikat CA ręcznie:
-
Pobierz certyfikat CA Let's Encrypt ze strony https://letsencrypt.org/certs/isrgrootx1.pem.
-
Następnie połącz się z RabbitMQ w swoim kodzie Python, wskazując plik certyfikatu 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 )
Poniżej znajduje się pełny przykład użycia certyfikatu CA Let's Encrypt do bezpiecznego połączenia:
import asyncio
import logging
import ssl
import aio_pika
async def main() -> None:
# Aby włączyć logi debugowania, możesz odkomentować tę linię
# logging.basicConfig(level=logging.DEBUG)
ssl_context = ssl.create_default_context()
# Załaduj pobrany certyfikat CA Let's Encrypt
# Na przykład: 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())
Łączenie się z RabbitMQ za pomocą GoLang
Aby połączyć aplikację Go z RabbitMQ, oficjalna Go RabbitMQ Client Library znacznie to ułatwia. Oto jak zacząć:
- Utwórz nowy katalog i zainicjuj moduł Go:
go mod init rabbitmq-example
- Następnie dodaj bibliotekę RabbitMQ do swojego projektu:
go get github.com/rabbitmq/amqp091-go
-
Teraz utwórz plik o nazwie
main.goi dodaj poniższy kod: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") } -
Uruchom swój kod poleceniem:
go run main.go
Jeśli połączenie się powiedzie, zobaczysz komunikat "Successfully connected to RabbitMQ instance". Oznacza to, że połączenie zostało nawiązane bezpiecznie, z użyciem uwierzytelniania i szyfrowania TLS.
Po bardziej zaawansowane przykłady zajrzyj do oficjalnego repozytorium RabbitMQ: https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go.
Łączenie się z RabbitMQ za pomocą PHP
Jeśli pracujesz z PHP, możesz użyć biblioteki php-amqplib do połączenia z instancją RabbitMQ. Ponieważ Stackhero korzysta z szyfrowania TLS (SSL), zalecane jest użycie 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);
Ręczne pobranie certyfikatu CA
Czasami połączenie TLS może wymagać certyfikatu urzędu certyfikacji (CA). Wiele systemów już go posiada, ale w razie potrzeby możesz pobrać go ręcznie. Oto jak to zrobić:
- Pobierz certyfikat z https://letsencrypt.org/certs/isrgrootx1.pem i zapisz go na swoim serwerze.
- Następnie połącz się z RabbitMQ w PHP, korzystając z pobranego certyfikatu:
$sslOptions = array(
'cafile' => realpath(__DIR__ . '/isrgrootx1.pem'),
);
$connection = new AMQPSSLConnection(
'<XXXXXX>.stackhero-network.com',
<AMQP_PORT_TLS>,
'admin',
'<PASSWORD>',
'/',
$sslOptions
);
Łączenie się z RabbitMQ za pomocą PHP/Symfony
Jeśli korzystasz z Symfony, możesz skonfigurować je do używania RabbitMQ jako brokera wiadomości, ustawiając zmienną środowiskową MESSENGER_TRANSPORT_DSN. Wystarczy zaktualizować plik .env:
MESSENGER_TRANSPORT_DSN=amqps://<USER>:<PASSWORD>@<HOST>:<PORT>/%2f/messages?cacert=%2Fetc%2Fssl%2Fcerts%2Fca-certificates.crt
Zamień
<USER>,<PASSWORD>,<HOST>i<PORT>na swoje dane dostępowe do RabbitMQ.
Następnie upewnij się, że plik config/packages/messenger.yaml korzysta ze zmiennej MESSENGER_TRANSPORT_DSN. Powinien wyglądać następująco:
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
Łączenie się z RabbitMQ za pomocą Spring Boot
W aplikacjach Spring Boot możesz skonfigurować bezpieczne połączenie z instancją RabbitMQ Stackhero, aktualizując właściwości aplikacji:
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
Łączenie się z RabbitMQ za pomocą .NET i MassTransit
Jeśli tworzysz aplikację w .NET i korzystasz z MassTransit, poniżej znajdziesz przykład konfiguracji projektu do bezpiecznego połączenia ze Stackhero RabbitMQ z użyciem szyfrowania 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();
}
}
Obsługa błędu CLIENT ALERT: Fatal - Handshake Failure w Elixir
Jeśli podczas łączenia się z Elixir pojawi się komunikat błędu
CLIENT ALERT: Fatal - Handshake Failure
najczęściej oznacza to błąd w obsłudze TLS 1.3 przez bibliotekę AMQP. Skutecznym obejściem jest wymuszenie użycia TLS 1.2 poprzez dodanie tej opcji podczas otwierania połączenia:
AMQP.Connection.open("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>", :undefined, ssl_options: [ versions: [ :"tlsv1.2" ] ])
Obsługa błędu Error: Socket closed abruptly during opening handshake w Node.js
Jeśli podczas korzystania z Node.js pojawi się błąd Error: Socket closed abruptly during opening handshake, prawdopodobnie używasz wersji biblioteki amqplib starszej niż 0.10.7 z RabbitMQ 4.1.0 lub nowszym. Zmiana ta związana jest z ustawieniem frame_max wprowadzonym w RabbitMQ 4.1.0.
Aby rozwiązać ten problem, zaktualizuj bibliotekę amqplib do wersji 0.10.7 lub nowszej.