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 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='"\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. 進入官方例子文件夾
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:隊列驗證與監控