nats 學習 request/reply 模式基本使用


nats 一個雲原生的消息系統,使用簡單,客戶端豐富,支持的模式是pub/sub 但是集成比較靈活,可以支持loadblance, request/reply
pub/sub

代碼演示的是request (類似rabbitmq 的rpc)

基本代碼

需要首先安裝並啟動nats(比較簡單)

  • request 端代碼
package main

import (
    "log"

    "runtime"

    "encoding/json"
    "time"

    "github.com/nats-io/go-nats"
)

func main() {
    var url = "nats://127.0.0.1:4222"
    nc, err := nats.Connect(url, nats.Name("dalongdemo"))
    if err != nil {
        log.Fatal("connect error")
    }
    nc.Subscribe("dalong", func(mess *nats.Msg) {
        log.Println(string(mess.Data), "from nats")
        result, _ := json.Marshal(mess)
        log.Println("the reply info is ", string(result))
    })
    message, err := nc.Request("dalong", []byte("dalong"), 1*time.Second)
    if err != nil {
        log.Println("get error, timeout", err)
    }
    log.Println("get data", string(message.Data))
    runtime.Goexit()
}

reply 端代碼

package main

import (
    "log"

    "runtime"

    "encoding/json"

    "github.com/nats-io/go-nats"
)

func main() {
    var url = "nats://127.0.0.1:4222"
    nc, err := nats.Connect(url, nats.Name("dalongdemo"))
    if err != nil {
        log.Fatal("connect error")
    }
    nc.Subscribe("dalong", func(mess *nats.Msg) {
        log.Println(string(mess.Data), "from nats")
        result, _ := json.Marshal(mess)
        log.Println("the reply info is ", string(result))
        nc.Publish(mess.Reply, []byte("dalong can help you"))
    })
    runtime.Goexit()
}

運行效果

首先啟動respone,然后是request

  • request 效果
  • response 效果

細節說明

  • 一張參考圖
  • 說明
這種模式我們可以啟動多個response 類似負載均衡的效果,和Queue 模式類似,還是比較方便的

參考資料

https://github.com/nats-io/go-nats
https://www.nats.io/documentation/concepts/nats-req-rep/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM