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