go nats安装使用

目录
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

你可能感兴趣的:(go nats安装使用)