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
求大佬解答一个新手问题额,我不知道我哪里错误了。
如有冒犯,非常抱歉。。
更多关于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的官方文档或相关社区论坛,以获取更详细的教程和示例代码。