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 命令進行登錄:

1
$ telnet 192.168.113.129 4222   #其中 ip 需要輸入你當前的服務器的 ip 地址

   臉上 telnet 后終端會打印以下信息:

1
2
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='"\r"...'

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. 進入官方例子文件夾

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

  2. 運行訂閱者B 程序訂閱

1
go run nats-sub. go foo.bar

  3. 運行發布者A 發布消息

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

  4. 訂閱者B 屏幕會顯示接收到的消息

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

  5. 中斷訂閱者B 的終端,使用正則匹配重新進行訂閱

1
go run nats-sub. go foo.*

  6. 運行發布者A 發布多個主題的消息

1
2
3
4
5
6
7
8
9
10
$ 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條信息並按序號顯示出來

1
2
3
4
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:隊列驗證與監控


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM