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/

posted on 2018-06-11 14:38  荣锋亮  阅读(3787)  评论(0编辑  收藏  举报

导航