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/