Golang Go语言 [natsio] 使用入门问题

docker pull bitnami/nats:2.10.11
docker run -ti -p 4222:4222 -p 8222:8222 --name nats bitnami/nats:2.10.11

依赖

go get github.com/nats-io/nats.go/@v1.33.1

推送消息

func Test_natsio_request(t *testing.T) {
	url := nats.DefaultURL
nc, _ := nats.Connect(url)
defer nc.Drain()

// Matches all of the above
nc.Publish("foo", []byte("Hello World")) // Use the response

println("====================  request request request")

}

接收消息


func Test_natsio_resp(t *testing.T) {
	url := nats.DefaultURL
nc, _ := nats.Connect(url)
defer nc.Drain()

nc.Subscribe("foo", func(m *nats.Msg) {
	fmt.Printf("Msg received on [%s] : %s\n", m.Subject, string(m.Data))
})
println("====================  resp ")

}

相关代码配置如上所示,最终我失败了,没有打印 Msg received on 这个打印。

我查看了官方的相关文档,b 站的使用视频,我进行了一些尝试,但是仍然没有成功。

·············································

请问我如何才能正确的接收消息呢。。。


Golang Go语言 [natsio] 使用入门问题

更多关于Golang Go语言 [natsio] 使用入门问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

求大佬解答一个新手问题额,我不知道我哪里错误了。

如有冒犯,非常抱歉。。

更多关于Golang Go语言 [natsio] 使用入门问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


官方示例有说:
https://natsbyexample.com/examples/messaging/pub-sub/go

There are two circumstances when a published message won’t be delivered to a subscriber:
The subscriber does not have an active connection to the server



func TestNats(t *testing.T) {
url := nats.DefaultURL

nc, _ := nats.Connect(url)
defer nc.Drain()

var wg sync.WaitGroup
wg.Add(1)
nc.Subscribe(“foo”, func(m *nats.Msg) {
defer wg.Done()
fmt.Printf(“Msg received on [%s] : %s\n”, m.Subject, string(m.Data))
})

nc.Publish(“foo”, []byte(“Hello World”))

wg.Wait()
}

我平常主要写 node.js ,为了回复你这个问题特意装了 go 的环境。

你的问题是接受程序(Test_natsio_resp) 从上到下走完直接完事儿了,没有等待下一条消息这个程序就退出了。

你需要想办法让程序等待消息进来,具体代码请参考:
https://github.com/nats-io/go-nats-examples/blob/main/api-examples/subscribe_async/main.go

除了添加 WaitGroup 用于等待消息,你还得在发布端使用 defer nc.Close() 而不是 defer nc.Drain(),Drain 状态下是不能发布消息的。




感谢,确实是可以了。。。。

单个文件内解决的代码如 kumoocat 所示
多个文件如下,主题先要启动接收端,再启动发送端。(注意:先启动发送端再启动接收端,消息会丢失。)


go<br>发送端<br><br>func Test_natsio_request(t *testing.T) {<br> url := nats.DefaultURL<br><br> nc, err := nats.Connect(url)<br> if err != nil {<br> log.Fatal(err)<br> return<br> }<br> defer nc.Close()<br><br> // Matches all of the above<br> nc.Publish("foo", []byte("Hello World")) // Use the response<br><br> println("==================== request request request")<br>}<br>


go<br>接收端<br><br>func Test_natsio_resp(t *testing.T) {<br> url := nats.DefaultURL<br><br> nc, err := nats.Connect(url)<br> if err != nil {<br> log.Fatal(err)<br> return<br> }<br> defer nc.Drain()<br><br> var wg sync.WaitGroup<br> wg.Add(1)<br> _, err2 := nc.Subscribe("foo", func(m *nats.Msg) {<br> defer wg.Done()<br> fmt.Printf(time.Now().String(), "Msg received on [%s] : %s\n", m.Subject, string(m.Data))<br> })<br> if err2 != nil {<br> log.Fatal(err2)<br> return<br> }<br> wg.Wait()<br> println("==================== resp ")<br>}<br><br>

但是我不太明白,为什么先启动发送端,再启动接收端,消息就丢了呢。。

容我有空了,去翻一下源码。。。。

因为 nats 的消息是发送时没有接收者的话就会被丢弃,不会保存。如果有需求应该用 nats jetstream 。

喔!!!原来如此!!

感谢大佬的回复!我现在去试试,jetstream !!!

针对您提出的Golang中NATS.io使用入门问题,以下是一些专业解答:

NATS.io是一个轻量级的消息传递系统,专注于提供高性能、可靠的分布式系统间通讯解决方案。在Golang中,使用NATS.io的官方客户端库可以方便地在Go应用程序中集成NATS服务。

要快速开始使用NATS Go客户端,请确保您的Go环境已正确设置,并通过以下命令添加NATS为依赖项:

go get -u github.com/nats-io/nats.go

然后,您可以创建一个新的Go文件,并加入示例代码来连接到NATS服务器并发送/接收消息。示例代码如下:

package main

import (
	"fmt"
	"github.com/nats-io/nats.go"
)

func main() {
	// 连接到NATS服务器
	opts := nats.GetDefaultOptions()
	opts.Servers = []string{"nats://localhost:4222"}
	conn, err := opts.Connect()
	if err != nil {
		fmt.Println("Error connecting to NATS:", err)
		return
	}
	defer conn.Close()

	// 订阅与发布消息的示例代码(略)
}

NATS常用于微服务架构中的服务间通信、事件驱动模型及分布式任务调度等场景。此外,NATS还提供了队列组、持久化、安全性、NATS Streaming、JetStream及NATS CLI等组件和周边工具,共同构建了一个强大而灵活的消息传递平台。

如需更多信息,建议访问NATS.io的官方文档或相关社区论坛,以获取更详细的教程和示例代码。

回到顶部