Rabbitmq应用场景
- 流量削峰,当大流量访问时,可以将服务进行排队,对大流量削峰
- 异步,可以将用户的操作排入队列,先行返回,再进行后台操作。
先安装rabbitmq环境,我为了方便,使用docker启动rabbitmq。
拉取镜像
docker pull rabbitmq
创建实例
docker run -p 5672:5672 --rm rabbitmq
rabbitmq使用的端口号是5672所以将5672端口映射到主机,也可以使用host模式。
现在使用go连接rabbitmq,进行传输消息。
发送端
package main
import (
"encoding/json"
//"fmt"
"github.com/streadway/amqp"
"log"
"time"
)
type User struct {
Name string
Sex int
}
func main () {
//连接服务器
con , err := amqp.Dial("amqp://guest:guest@localhost:5672/")
fallerror(err)
//创建管道
ch , err := con.Channel()
fallerror(err)
//在管道中声明队列,一个管道对应多个队列
qu , err := ch.QueueDeclare("world" , false , false , false , false , nil)
fallerror(err)
f := User{
Name: "xiang",
Sex: 1,
}
for {
//不断地将消息推送到消息队列中
err = ch.Publish("" , qu.Name , false , false , amqp.Publishing{Body: t(f) , ContentType: "text/plain"})
time.Sleep(time.Second)
}
fallerror(err)
}
func fallerror (err error) {
if err != nil {
log.Println(err)
}
}
func t (msg interface{}) (mbyte []byte){
mbyte , _ = json.Marshal(msg)
return
}
接收端
package main
import (
"encoding/json"
"fmt"
"github.com/streadway/amqp"
"log"
)
type U struct {
Name string
Sex int
}
func main () {
//连接服务器
con , err := amqp.Dial("amqp://guest:guest@localhost:5672/")
fall(err)
//声明管道
ch , err := con.Channel()
fall(err)
//在管道中创建队列,注意队列的名称要与发送的队列的名称相同。
q , err := ch.QueueDeclare("world" , false , false , false , false , nil)
fall(err)
//消费队列的消息
msg , err := ch.Consume(q.Name , "" , true , false , false , false , nil)
fall(err)
for d :=range msg{
var y U
json.Unmarshal(d.Body , &y)
fmt.Println(y)
}
}
func fall (err error) {
if err != nil {
log.Println(err)
}
}