Golang使用nats

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 {}
}

posted @ 2023-11-10 14:21  朝阳1  阅读(258)  评论(0编辑  收藏  举报