RabbitMQ是一個消息代理,用來負責接收和轉發消息。git
生產者,消費者,代理能夠駐留在不一樣主機或同一主機,一個應用能夠是生產者也能夠是消費者github
接下來咱們來實現RabbitMQ的「Hello World」,生產者將「Hello World」發送進隊列中,消費者將其接收並打印數組
**go get github.com/streadway/amqp
鏈接RabbitMQ異步
conn,err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { log.Fatal(err) } defer conn.Close()
RabbitMQ的鏈接已經爲咱們抽象了socket的鏈接,同時爲咱們處理了協議版本號和身份認證等等socket
建立通道編碼
ch,err := conn.Channel() if err != nil { log.Fatal(err) } defer ch.Close()
在使用其餘API完成任務的時候咱們首先經過以上方式建立通道代理
在開始發送消息以前咱們首先應該聲明一個隊列。聲明隊列以後咱們就能夠將消息發送至隊列當中code
q, err := ch.QueueDeclare( "hello", // name false, // durable false, // delete when unused false, // exclusive false, // no-wait nil, // arguments ) if err != nil { log.Fatal(err) } body := "Hello World!" err = ch.Publish( "", // exchange q.Name, // routing key false, // mandatory false, // immediate amqp.Publishing { ContentType: "text/plain", Body: []byte(body), }) if err != nil { log.Fatal(err) }
隊列的聲明是一個冪等性操做,若是不存在該隊列的話則會建立。此處注意,若是隊列存在,修改了隊列參數並不會影響已經存在的隊列,而且會返回錯誤。消息內容是一個字節數組,因此咱們必須進行編碼rabbitmq
鏈接,建立通道,隊列隊列
在接收端咱們一樣須要像發送端同樣鏈接RabbitMQ,建立通道後再建立隊列,注意此處隊列的建立是跟發送端的隊列徹底匹配的。隊列在接收端也建立是由於咱們接收端有可能比發送端先啓動,因此爲了保證咱們要消費的隊列存在咱們在此處也進行建立
消費消息
msgs, err := ch.Consume( q.Name, // queue "", // consumer true, // auto-ack false, // exclusive false, // no-local false, // no-wait nil, // args ) if err != nil { log.Fatal(err) } 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
使用通道消費隊列中的消息,當隊列有消息的時候將會異步的推送給咱們