• NATS_05:NATS服务器部署


    1、NATS安装前的普及

      NATS 的服务器是使用 GoLang 语言开发的,其可执行文件的名字为:gnatsd,表示:Go NATS Daemon。NATS服务器是一个开源软件,基于 MIT 许可证发布。

      NATS Server有 Linux版、Mac版、Windows版。下面以Linux版为例,详述其部署过程。

      NATS Server当前的最新版本为0.9.6版,有三种二进制发布包,详见:https://github.com/nats-io/gnatsd/releases/

    • gnatsd-v0.9.6-darwin-amd64.tar.gz  for Mac的版本
    • gnatsd-v0.9.6-linux-amd64.tar.gz   for Linux x64的版本
    • gnatsd-v0.9.6-linux-arm.tar.gz for        Linux ARM的版本

      虽然NATS Server是用Go语言开发的,但运行gnatsd无需安装Golang环境。gnatsd非常的轻量级,发布包只有2MB多,启动时可以无需任何参数,直接运行即可。

    2、NATS Server的服务器配置

      gnatsd接受命令行参数作为控制手段。主要的服务器参数如下。

      1)服务器选项

        -a, --addr HOST     绑定主机IP地址(默认是0.0.0.0)

        -p, --port PORT      客户端连接NATS服务器使用的端口(默认是4222

        -P(大写), --pid FILE     存储PID的文

        -m, --http_port PORT  使用HTTP端口作为监听端口

        -ms, --https_port PORT 使用HTTPS端口作为监听端口

        -c, --config FILE     指定配置文件

      2)日志选项

        -l,  --log FILE       指定日志输出的文件

        -T, --logtime      是否开启日志的时间戳(默认为true)

        -s, --syslog       启用syslog作为日志方法

         -r, --remote_syslog    远程日志服务器的地址(默认为udp://localhost:514)

        -D, --debug       开启调试输出

        -V, --trace      跟踪原始的协议

        -DV             调试并跟踪

        gnatsd -DV -m 8222 -l nats.log  其中如果设置 -T false  那么日志文件中就不打印时间戳了,默认是true。

      3)授权认证选项

        --user     user 连接需要的用户名

        --pass    password 连接需要的密码

      4)TLS安全选项

        --tls     启用TLS,不验证客户端(默认为false)

        --tlscert     FILE 服务器证书文件

        --tlskey     FILE 服务器证书私钥

        --tlsverify     启用TLS,每一个客户端都要认证

        --tlscacert    FILE 客户端证书CA用于认证

      5)集群选项

        --routes [rurl-1, rurl-2]   路线征求并连接

        --cluster [cluster url]    请求的路由集群地址

      6)常规选项

        -h, --help   显示帮助消息

        -v, --version    显示版本信息

        --help_tls  TLS相关帮助文档

    3、NATS Server部署

      我们知道,NATS 底层是由 GoLang 语言开发的,故我们安装的时候也是采用 go 命令进行快速安装,具体在 Linux CentOS 如何安装 Go 可以参看我的另外一篇博客:

    GO_01:Linux-CentOS之Go语言环境配置, 这里我就不重复写了。
     
    1. 安装和运行
    go get github.com/nats-io/gnatsd
    gnatsd

      注意,如果有 Go 语言基础的或者是看了我的有关 Go 语言基础知识,就明白,通过 go get 获取到的源码都是存放到了 $GOPATH/src 路径下了,故一定要知道你的 GOPATH 配置的是什么。我们直接通过 gnatsd 启动后打印以下内容:

    [26658] 2017/03/30 11:45:17.795313 [INF] Starting nats-server version 0.9.6
    [26658] 2017/03/30 11:45:17.795384 [INF] Listening for client connections on 0.0.0.0:4222
    [26658] 2017/03/30 11:45:17.795462 [INF] Server is ready

      如果看到以上结果,则证明我们的服务成功启动了。

    2. 模拟远程登录

      在我自己笔记本(我的环境是mac pro),执行 telnet 命令进行登录:

    $ telnet 192.168.113.129 4222   #其中 ip 需要输入你当前的服务器的 ip 地址

       脸上 telnet 后终端会打印以下信息:

    INFO {"server_id":"lojv3evBKJzf6Qc7NXecI0","version":"0.9.6","go":"go1.8","host":"0.0.0.0","port":4222,
    "auth_required":false,"ssl_required":false,"tls_required":false,"tls_verify":false,"max_payload":1048576}
    

       以上信息打印的就是你当前环境的有关配置,例如 gnats 的版本,go 使用的版本,当前ip地址以及 端口号等等。按一下回车键后,telnet 就会断开链接,显示如下信息:

    -ERR 'Unknown Protocol Operation'
    -ERR 'Parser Error'
    Connection closed by foreign host.

      同理,gnatsd 服务端也会输出以下这样的信息:

    [2940] 2017/03/30 16:12:52.258761 [ERR] ::1:55374 - cid:1 - Error reading from client: Client Parser ERROR, state=0, i=0: proto='"
    "...'

    3. 发布/订阅模式的验证

      使用两个客户端进行验证。在远程(自己的笔记本) 主机上开两个终端命令行环境,均使用命令 “$ 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 消息。

     4. 使用官方自带例子验证

     1. 进入官方例子文件夹

    cd $GOPATH/src/github.com/nats-io/nats-io/go-nats/examples
    

      2. 运行订阅者B 程序订阅

    go run nats-sub.go foo.bar
    

      3. 运行发布者A 发布消息

    go run nats-pub.go foo.bar hello
    go run nats-pub.go foo.bar "my name is liangyongxing"
    

      4. 订阅者B 屏幕会显示接收到的消息

    [#1] Received on [foo.bar]: 'hello'
    [#2] Received on [foo.bar]: 'Hello World'
    

      5. 中断订阅者B 的终端,使用正则匹配重新进行订阅

    go run nats-sub.go foo.*
    

      6. 运行发布者A 发布多个主题的消息

    $ go run nats-pub.go foo.bar "hello world"
    Published [foo.bar] : 'hello world'
    $ go run nats-pub.go foo.message "hello"
    Published [foo.message] : 'hello'
    $ go run nats-pub.go foo.message.2 "hello"
    Published [foo.message.2] : 'hello'
    $ go run nats-pub.go foo.message.test "hello 2"
    Published [foo.message.test] : 'hello 2'
    $ go run nats-pub.go foo.messages2 "hello 2"
    Published [foo.messages2] : 'hello 2'
    

      7. 订阅者B 只接受到了3条信息并按序号显示出来

    Listening on [foo.*]
    [#1] Received on [foo.bar]: 'hello world'
    [#2] Received on [foo.message]: 'hello'
    [#3] Received on [foo.messages2]: 'hello 2'
    

      由以上结果可以看出,nats在识别主题最多为两级,第6步注册的主题:foo.message、foo.message.2 和 foo.message.test 在发送消息后后两个根本发送不到接收端,认为你注册的主题已经注册了,不能重复注册了,故接收端着两条数据是接收不到的。

      以上这些案例可以使用官方提供的一副图可以形象的说明:

      

     下一章节主要针对队列模式使用总结 + 相关监控内容,情猛戳:NATS_06:队列验证与监控

  • 相关阅读:
    初始面向对象
    python之路——迭代器和生成器
    函数进阶
    python之路——初识函数
    实现css两端对齐
    http
    background-size
    call和apply的区别
    js兼容性
    面试题
  • 原文地址:https://www.cnblogs.com/liang1101/p/6642467.html
Copyright © 2020-2023  润新知