nats自行安装
消费端
package main
import (
"fmt"
"github.com/nats-io/nats.go"
)
////nats-server 在管理 subject 的时候是通过’.’ 进行分割的,server 底层是使用 tree module 分层管理 subject. 此处有两个通配符*和>。
////*可以匹配以.分割的一切。如:
////nc.Subscribe("aa.*.cc", func(m *Msg) {}) 可以匹配 aa.11.cc、aa.zngw.cc,但不能匹配aa.11.zngw.cc
////> 需要放在通配符最后,匹配后面所有长度。如:
////nc.Subscribe("aa.>", func(m *Msg) {}),这个匹配所有 aa.开头的subject
func main() {
// 连接Nats服务器
nc, _ := nats.Connect("nats://127.0.0.1:4222")
// 发布-订阅 模式,异步订阅 test1
_, _ = nc.Subscribe("test1", func(m *nats.Msg) {
fmt.Printf("订阅收到消息: %s\n", string(m.Data))
})
// 队列 模式,订阅 test2, 队列为queue, test2 发向所有队列,同一队列只有一个能收到消息
_, _ = nc.QueueSubscribe("test2", "queue", func(msg *nats.Msg) {
fmt.Printf("队列消息: %s\n", string(msg.Data))
})
// 请求-响应, 响应 test3 消息。
_, _ = nc.Subscribe("test3", func(m *nats.Msg) {
fmt.Printf(string(m.Data))
_ = nc.Publish(m.Reply, []byte("fuck you tony!!!"))
})
// 持续发送不需要关闭
//_ = nc.Drain()
// 关闭连接
defer nc.Close()
// 阻止进程结束而收不到消息
select {}
}
生产端
package main
import (
"fmt"
"github.com/nats-io/nats.go"
"time"
)
//nats-server 在管理 subject 的时候是通过’.’ 进行分割的,server 底层是使用 tree module 分层管理 subject. 此处有两个通配符*和>。
//*可以匹配以.分割的一切。如:
//nc.Subscribe("aa.*.cc", func(m *Msg) {}) 可以匹配 aa.11.cc、aa.zngw.cc,但不能匹配aa.11.zngw.cc
//> 需要放在通配符最后,匹配后面所有长度。如:
//nc.Subscribe("aa.>", func(m *Msg) {}),这个匹配所有 aa.开头的subject
func main() {
// 连接Nats服务器
nc, _ := nats.Connect("nats://127.0.0.1:4222")
// 发布-订阅 模式,向 test1 发布一个 `Hello World` 数据
_ = nc.Publish("test1", []byte("Hello World"))
// 队列 模式,发布是一样的,只是订阅不同,向 test2 发布一个 `Hello World` 数据
_ = nc.Publish("test2", []byte("Hello World"))
// 请求-响应, 向 test3 发布一个 `Hello World` 请求数据,设置超时间3秒,如果有多个响应,只接收第一个收到的消息
msg, err := nc.Request("test3", []byte("Hello World"), 3*time.Second)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf(string(msg.Data))
}
// 关闭连接
defer nc.Close()
select {}
}