我正在编写一个简单的应用程序来测试与rabbitmq的使用。这是代码:
package main
import (
"log"
"time"
"github.com/streadway/amqp"
)
func failOnError(err error, msg string) {
if err != nil {
log.Printf("%s: %s", msg, err)
}
}
func main() {
var conn *amqp.Connection
var err error
for i := 0; i < 5; i++ {
conn, err = amqp.Dial("amqp://dev:test@rabbitmq:5672/")
if err != nil {
continue
}
log.Println(err)
time.Sleep(5 * time.Second)
}
if err != nil {
log.Printf("Failed to connect to RabbitMQ: %v", err)
}
ch, err := conn.Channel()
failOnError(err, "Failed to open a channel")
defer ch.Close()
q, err := ch.QueueDeclare(
"hello", // name
false, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
failOnError(err, "Failed to declare a queue")
body := "Hello World!"
err = ch.Publish(
"", // exchange
q.Name, // routing key
false, // mandatory
false, // immediate
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(body),
})
log.Printf(" [x] Sent %s", body)
failOnError(err, "Failed to publish a message")
msgs, err := ch.Consume(
q.Name, // queue
"", // consumer
true, // auto-ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
failOnError(err, "Failed to register a consumer")
forever := make(chan bool)
go func() {
for d := range msgs {
log.Printf("Received a message: %s", d.Body)
}
}()
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
}
问题是rabbitmq服务似乎启动并工作正常。我也可以进入管理插件Web应用程序。但我的应用程序总是给我这个错误:
024/01/22 13:16:33 Failed to connect to RabbitMQ: dial tcp 127.0.0.1:5672: connect: connection refused
FROM golang:latest
LABEL maintainer="Anatoliy"
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o main .
EXPOSE 8080
CMD ["./main"]
这是 docker-compose.yml:
version: '3.9'
services:
app:
build: .
ports:
- "8080:8080"
depends_on:
rabbitmq:
condition: service_healthy
rabbitmq:
image: "rabbitmq:3-management"
hostname: "rabbit"
environment:
RABBITMQ_DEFAULT_USER: dev
RABBITMQ_DEFAULT_PASS: test
ports:
- "5672:5672"
- "15672:15672"
healthcheck:
test: ["CMD", "rabbitmqctl", "status"]
interval: 30s
timeout: 10s
retries: 5
此外,我刚刚在 docker 中仅启动了rabbitmq,并且我能够连接到rabbitmq,使用以下连接线在docker之外启动我的应用程序:
conn, err = amqp.Dial("amqp://dev:[email protected]:5672/")
使用此连接线应用程序可以正常工作。我不明白如何设置我的应用程序以在 docker 内正常工作。
提供的列表工作正常(没有任何更改),因此您的环境可能存在某种问题。
docker-compose中提到的Rabbitmq无法启动,因为你的docker或主机上有另一个rabbitmq。要停止所有正在运行的容器,请执行以下操作
docker stop $(docker ps -aq)
。另外,您应该检查主机上是否有兔子。或者,您可以删除端口暴露的部分(从撰写文件中删除此行 - "5672:5672"
, - "15672:15672"
)。