目录
Nats简介
一、安装下载
二、启动服务器
三、发布/订阅模式的验证
四、请求-回复go测试代码
Nats简介
NATS是由CloudFoundry的架构师Derek开发的一个开源的、轻量级、高性能的,支持发布、订阅机制的分布式消息队列系统。
nats三种工作模式
- pub/sub (1对多)
- request/reply(1对多 设置超时,只要有一个回复就结束)
- queue(1对1)
优缺点:
优点:
- 使用简单,配置简单。
- 速度极快,性能良好。
- 多语言支持,不依赖于网络位置,client端只需知道nats的节点和约定好的subject名称即可。
缺点:
- 对服务器稳定性要求较高,机房出现故障,导致nats server端需要重连。可能需要重启nats-server。
- 在消息timeout后,需要在reconnection里要重新初始化连接,不方便。
关于nats streaming
nats streaming已被弃用。关键错误修复和安全修复将应用到 2023 年 6 月。需要持久性的支持 NATS 的应用程序应使用JetStream。来自:https://hub.docker.com/_/nats-streaming/
一、安装下载
官网 https://nats.io/download/
nats java https://github.com/nats-io/nats.java
nats go https://github.com/nats-io/nats.go
1、linux服务器上下载nats服务端
wget https://github.com/nats-io/nats-server/releases/download/v2.7.2/nats-server-v2.7.2-linux-amd64.zip --no-check-certificate
#直接解压即可
2、windows下载nats客户端
#1、安装go环境,直接下载安装
安装包下载地址为:https://golang.org/dl/。
如果打不开可以使用这个地址:https://golang.google.cn/dl/。
#2、go设置代理(用来下载github.com里的组件)
$ go env -w GOPROXY=https://goproxy.cn
#3、安装nats
$ go get github.com/nats-io/nats.go/
go: downloading github.com/nats-io/nats.go v1.13.0
go: downloading github.com/nats-io/nkeys v0.3.0
go: downloading github.com/nats-io/nuid v1.0.1
go: downloading golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b
二、启动服务器
1、单个运行方式
nats-server -D -p 4222
2、集群运行模式
#A:
nats-server -D -p 4222 -cluster nats://localhost:6222
#B:
nats-server -D -p 4333 -cluster nats://localhost:6333 -routes nats://localhost:6222
#C:
nats-server -D -p 4444 -cluster nats://localhost:6444 -routes nats://localhost:6222
#D:
nats-server -D -p 4555 -cluster nats://localhost:6555 -routes nats://localhost:6222,nats://localhost:6333
### -cluster nats://localhost:6222 表示开启集群,其它nats-server可以通过6222端口与之建立集群
### -routes nats://localhost:6222 连接到开启6222端口的nats-server与其建立集群
三、发布/订阅模式的验证
使用两个客户端进行验证。在远程(自己的笔记本) 主机上开两个终端命令行环境,均使用命令 “$ telnet xxx.xxx.xxx.xxx 4222” 连上 gnatsd 服务器。为了以示区别,这里命名为客户端A 和 客户端B,A表示发布者,B表示订阅者。
1.首先运行订阅者B(先有订阅的发布才会有意义)
订阅者B使用通配符 foot.* 注册主题 ID 为 90 的主题,订阅成功,gnatsd 服务器返回 +OK 消息。
sub foo.* 90
+OK
2.发布者A 运行
发布者A发布一条消息到主题 foo.bar,消息有效负载的长度为 5,按下回车,输入长度在5范围内的内容。消息发布成功,gnatsd 服务器返回 +OK 消息。
pub foo.bar 5
hello
+OK
3.订阅者B 显示反馈
sub foo.* 90
+OK
MSG foo.bar 90 5
hello
前两行是之前的内容,后两行是新获得的推送消息。可见,发布/订阅的消息通信成功。
4.发布者A 继续发布
发布者A继续执行以下命令,消息发布成功,gnatsd服务器返回+OK消息。
pub foo.bar optional.reply.subject 5
hello
+OK
5.订阅者B 继续接收显示
MSG foo.bar 90 5
hello
PING
MSG foo.bar 90 optional.replay.subject 5
hello
后面三行都是新增的消息内容,其中PING是维持连接的消息。
6.订阅者B 执行
订阅者B 执行取消订阅命令,命令消息发送成功,gnatsd 服务器返回 +OK 消息。
unsub 90
+OK
7.发布者A 执行
发布者A再次发布一条消息到主题foo.bar,消息有效负载的长度为5,按下回车。消息发布成功,gnatsd服务器返回+OK消息。
pub foo.bar 5
hell2
+OK
此时接收者B收不到消息,因为订阅已经取消了。
客户端发出心跳命令消息PING(用小写ping也是同样的),gnatsd 服务器返回 PONG 消息。
四、请求-回复go测试代码
1、request.go
package main
import (
"log"
"runtime"
"encoding/json"
"time"
"github.com/nats-io/nats.go"
)
func main() {
nc, err := nats.Connect("192.168.2.246:4222")
if err != nil {
log.Fatal("connect error")
}
nc.Subscribe("tydf", func(m *nats.Msg) {
log.Println(string(m.Data), "from nats")
result, _ := json.Marshal(m)
log.Println("<<<=== ", string(result))
})
message, err := nc.Request("tydf", []byte("tydf"), 1*time.Second)
if err != nil {
log.Fatal("Request timeout error", err)
}
log.Println("<<<=== ", string(message.Data))
runtime.Goexit()
}
2、reply.go
package main
import (
"log"
"runtime"
"encoding/json"
"github.com/nats-io/nats.go"
)
func main() {
nc, err := nats.Connect("192.168.2.246:4222")
if err != nil {
log.Fatal("connect error")
}
nc.Subscribe("tydf", func(m *nats.Msg) {
log.Println(string(m.Data), "from nats")
result, _ := json.Marshal(m)
log.Println("<<<=== ", string(result))
nc.Publish(m.Reply, []byte("Publish test info from reply."))
})
runtime.Goexit()
}
3、运行测试
#先运行reply.go
go run reply.go
#后运行request.go
go run request.go