Golang客户端操作RabbitMQ Streams:创建生产者遇地址缺失错误
RabbitMQ Stream Go客户端创建生产者失败:dial tcp: missing address 问题排查
问题场景
我通过以下Docker Compose配置了启用rabbitmq_stream及rabbitmq_stream_management插件的RabbitMQ服务:
rabbitmq: image: rabbitmq:3-management container_name: "vibe-rabbitmq" volumes: - rabbitmq_data:/var/lib/rabbitmq ports: - "5672:5672" - "15672:15672" - "5552:5552" environment: - RABBITMQ_PLUGINS=rabbitmq_stream,rabbitmq_stream_management - RABBITMQ_DEFAULT_USER=rabbitmq - RABBITMQ_DEFAULT_PASS=rabbitmq
并编写了对应的Golang代码:
package main import ( "fmt" "github.com/rabbitmq/rabbitmq-stream-go-client/pkg/amqp" "github.com/rabbitmq/rabbitmq-stream-go-client/pkg/stream" "log" "time" ) func main() { streamName := "your_stream_name" env, err := stream.NewEnvironment( stream.NewEnvironmentOptions(). SetHost("0.0.0.0"). SetPort(5552). // 5552 SetUser("rabbitmq"). SetPassword("rabbitmq"), ) if err != nil { log.Fatalf("Failed to create environment: %s", err) } err = env.DeclareStream(streamName, &stream.StreamOptions{}) if err != nil { log.Fatalf("Failed to declare stream: %v", err) } log.Printf("Stream '%s' created successfully", streamName) producer, err := env.NewProducer(streamName, &stream.ProducerOptions{}) if err != nil { log.Fatalf("Failed to create producer: %s", err) } }
运行代码后,成功创建了Stream,但创建Producer时出现如下错误:
2023/12/14 18:15:17 Stream 'your_stream_name' created successfully 2023/12/14 18:15:17 Failed to create producer: dial tcp: missing address exit status 1
疑惑点:为何能通过env实例创建流,却无法创建生产者?
问题原因
DeclareStream操作依赖RabbitMQ管理插件的HTTP API(端口15672),该操作即使Host设为0.0.0.0,也能通过内部逻辑 fallback 到本地地址完成请求;但创建Producer需要直接建立TCP连接到RabbitMQ Stream的专属端口5552,此时0.0.0.0作为服务端监听所有网卡的标识,无法被客户端用来发起连接——它不是一个可被访问的目标地址。
解决方案
修改代码中EnvironmentOptions的Host配置,将0.0.0.0替换为localhost(本地开发环境下):
env, err := stream.NewEnvironment( stream.NewEnvironmentOptions(). SetHost("localhost"). // 替换为localhost SetPort(5552). SetUser("rabbitmq"). SetPassword("rabbitmq"), )
如果代码在容器网络内运行,也可以直接使用RabbitMQ容器的名称vibe-rabbitmq作为Host值。
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

