RabbitMQ: 入门指南
如何使用 Stackhero 连接 RabbitMQ
使用 Python 连接 RabbitMQ
以下将为您介绍如何通过 Aio Pika 库,将您的 Python 应用程序连接到 RabbitMQ。大多数情况下,您只需提供 AMQPS URL 即可建立安全连接:
connection = await aio_pika.connect_robust(
"amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>",
)
下面是一个完整示例,展示如何建立到 RabbitMQ 的安全连接、创建 channel,并声明一个基础队列。这也是验证您配置是否正确的好方法:
import asyncio
import logging
import aio_pika
async def main() -> None:
# 如果您希望查看调试日志,可以取消下一行的注释
# 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())
处理 unable to get local issuer certificate 错误
如果您在使用 Python 连接时遇到如下错误:
aiormq.exceptions.AMQPConnectionError: [Errno 5] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)
这通常意味着您的系统缺少 Let's Encrypt 的 CA 证书。为了解决这个问题,您可以为您的操作系统安装常用的 CA 证书包:
-
在 Ubuntu/Debian 上,运行:
sudo apt install ca-certificates -
在 Alpine Linux 上,运行:
apk add ca-certificates
如果您无法使用上述命令,您也可以手动安装 CA 证书:
-
从 https://letsencrypt.org/certs/isrgrootx1.pem 下载 Let's Encrypt CA 证书。
-
然后,在您的 Python 代码中指定 CA 证书文件来连接 RabbitMQ:
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 )
以下是一个完整示例,演示如何使用 Let's Encrypt CA 证书进行安全连接:
import asyncio
import logging
import ssl
import aio_pika
async def main() -> None:
# 如需启用调试日志,可取消下方注释
# logging.basicConfig(level=logging.DEBUG)
ssl_context = ssl.create_default_context()
# 加载您下载的 Let's Encrypt CA 证书
# 例如: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 连接 RabbitMQ
如果您希望通过 Go 应用程序连接 RabbitMQ,可以使用官方的 Go RabbitMQ Client Library。操作非常简单,步骤如下:
- 新建一个目录并初始化 Go module:
go mod init rabbitmq-example
- 然后,将 RabbitMQ 库添加到您的项目中:
go get github.com/rabbitmq/amqp091-go
-
现在,创建一个名为
main.go的文件,并添加如下代码: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") } -
使用以下命令运行您的代码:
go run main.go
如果连接成功,您会看到 "Successfully connected to RabbitMQ instance" 的提示。这表示您已通过认证和 TLS 加密安全连接。
如需更多详细示例,建议参考 RabbitMQ 官方仓库中的 Go 示例:https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/go。
使用 PHP 连接 RabbitMQ
如果您使用 PHP,可以通过 php-amqplib 库连接到 RabbitMQ 实例。由于 Stackhero 默认启用 TLS 加密(SSL),建议使用 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);
手动下载 CA 证书
有时,您的 TLS 连接可能需要 CA(Certificate Authority)证书。大多数系统已内置该证书,但如有需要,您也可以手动下载。操作如下:
- 从 https://letsencrypt.org/certs/isrgrootx1.pem 下载证书,并保存到您的服务器。
- 然后,您可以在 PHP 中通过如下方式使用下载的证书连接:
$sslOptions = array(
'cafile' => realpath(__DIR__ . '/isrgrootx1.pem'),
);
$connection = new AMQPSSLConnection(
'<XXXXXX>.stackhero-network.com',
<AMQP_PORT_TLS>,
'admin',
'<PASSWORD>',
'/',
$sslOptions
);
使用 PHP/Symfony 连接 RabbitMQ
如果您使用 Symfony,可以通过设置 MESSENGER_TRANSPORT_DSN 环境变量,将 RabbitMQ 配置为消息代理。只需在 .env 文件中添加如下内容:
MESSENGER_TRANSPORT_DSN=amqps://<USER>:<PASSWORD>@<HOST>:<PORT>/%2f/messages?cacert=%2Fetc%2Fssl%2Fcerts%2Fca-certificates.crt
请将
<USER>、<PASSWORD>、<HOST>和<PORT>替换为您自己的 RabbitMQ 信息。
接下来,确保您的 config/packages/messenger.yaml 文件引用了 MESSENGER_TRANSPORT_DSN 变量,内容应类似如下:
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
使用 Spring Boot 连接 RabbitMQ
对于 Spring Boot 应用,您可以通过更新 application properties 文件,配置到 Stackhero RabbitMQ 实例的安全连接:
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 和 MassTransit 连接 RabbitMQ
如果您使用 .NET 和 MassTransit,可以按如下方式配置项目,通过 TLS 加密安全连接 Stackhero RabbitMQ:
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();
}
}
处理 Elixir 中 CLIENT ALERT: Fatal - Handshake Failure 错误
如果您在使用 Elixir 连接时看到如下错误信息:
CLIENT ALERT: Fatal - Handshake Failure
这通常是由于 AMQP 库对 TLS 1.3 支持存在 bug。一个可靠的解决方法是,在打开连接时强制使用 TLS 1.2,可通过如下方式实现:
AMQP.Connection.open("amqps://admin:<PASSWORD>@<XXXXXX>.stackhero-network.com:<AMQP_PORT_TLS>", :undefined, ssl_options: [ versions: [ :"tlsv1.2" ] ])
处理 Node.js 中 Error: Socket closed abruptly during opening handshake 错误
如果您在使用 Node.js 时遇到 Error: Socket closed abruptly during opening handshake 错误,通常是因为您使用的 amqplib 版本低于 0.10.7,并且 RabbitMQ 版本为 4.1.0 或更高。这个问题与 RabbitMQ 4.1.0 引入的 frame_max 设置有关。
为解决此问题,请将您的 amqplib 升级到 0.10.7 或更高版本。