
一条消息的产生-》消息队列-》消费-》完整的流程
简单演示,一个生产者对多消费者

server.go
package main
import(
    "fmt"
    "log"
    "net/http"
)
func main(){
    mux := http.NewServeMux()
    mux.HandleFunc("/Login",Login)
    mux.HandleFunc("/Consumer1",Consumer1)
    mux.HandleFunc("/Consumer2",Consumer2)
    mux.HandleFunc("/Consumer3",Consumer3)
    if err:=http.ListenAndServe(":8080",mux);err!=nil{
        log.Fatal(err)
    }
}
/*一个生产者和多消费者*/
// 假定一个生产者
func Login(w http.ResponseWriter,r *http.Request){
    if r.Method != "GET"{
        return
    }
    fmt.Fprint(w,"生产者来了")
}
// 多个消费者
func Consumer1(w http.ResponseWriter,r *http.Request){
    if r.Method != "GET"{
        return
    }
    fmt.Fprint(w,"消费者1")
}
func Consumer2(w http.ResponseWriter,r *http.Request){
    if r.Method != "GET"{
        return
    }
    fmt.Fprint(w,"消费者2")
}
func Consumer3(w http.ResponseWriter,r *http.Request){
    if r.Method != "GET"{
        return
    }
    fmt.Fprint(w,"消费者3")
}client.go
package main
import(
    "fmt"
    "sync"
    "net/http"
    "io/ioutil"
)
type Message struct{
    Data string
}
var wg sync.WaitGroup
// 使用切片充当队列
var messages []*Message
func main(){
    fmt.Println("客户端这边执行消息队列")
    producer()
    wg.Add(3)
    // 轮询,获取消息
    for{
        if len(messages)>0{
            // 按需获取消息
            if messages[0]!=nil{
                go comsumer("Consumer1")
                go comsumer("Consumer2")
                go comsumer("Consumer3")
                wg.Wait()
                break
            }
        }
    }
    fmt.Println("打印结果")
}
// 生产者
func producer()error{
    mg := Message{}
    res,err := http.Get("http://localhost:8080/Login")
    if err!=nil{
        fmt.Println("err :",err)
        return err
    }
    defer res.Body.Close()
    data,err := ioutil.ReadAll(res.Body)
    if err!=nil{
        fmt.Println("err:",err)
        return err
    }
    fmt.Println(string(data))
    mg.Data = string(data)
    messages = append(messages,&mg)
    return nil
}
// 消费者
func comsumer(url string)error{
    defer wg.Done()
    mg := Message{}
    res,err := http.Get("http://localhost:8080/"+url)
    if err!=nil{
        fmt.Println("err :",err)
        return err
    }
    defer res.Body.Close()
    data,err := ioutil.ReadAll(res.Body)
    if err!=nil{
        fmt.Println("err:",err)
        return err
    }
    fmt.Println(string(data))
    mg.Data = string(data)
    messages = append(messages,&mg)
    return nil
}输出结果
客户端这边执行消息队列
生产者来了
消费者2
消费者3
消费者1
打印结果明确观点:本人觉得,消息队列是客户端和服务端的一个中间插件
学习资料
原文:https://www.cnblogs.com/MyUniverse/p/11626259.html