NATS的協議是一個簡單的、基於文本的發佈/訂閱風格的協議。客戶端連接到 gnatsd(NATS服務器),並與 gnatsd 進行通信,通信基於普通的 TCP/IP 套接字,並定義了很小的操作集,換行表示終止。與傳統的、使用了二進制消息格式的消息通信系統不同,使用了基於文本的 NATS 協議,使得客戶端實現很簡單,可以方便地選擇多種編程語言或腳本語言來實現。
NATS協議約定
- 主題名(Subject Name)
主題名包括響應主題(收件箱)名,是大小寫敏感的,必須是非空字符串,不能包含空格,可以在字符串中使用 “.” 符號,比如:
FOO、BAR、foo.bar、foo.BAR、FOO.BAR、FOO.BAR.BAZ 這些都是有效的主題名。 - 通配符
NATS支持在主題訂閱中使用 “*” 通配符, 星號 “*” 匹配主題的任意級別的任意字符。注意:(一個*只能匹配一個級別)比如 foo.* 匹配 foo.a 但不匹配 foo.a.b,foo.*.*可以匹配 foo.a.b但不匹配foo.a.b.c
大於號 “>” 匹配後面的任意字符。比如 foo.> 匹配 foo.bar 和 foo.bar.baz.1,但不匹配 foo
通配符必須被標識分隔。比如 foo.bar 和 foo.> 都是有效的,而 foo..bar、f*o.b*r 和 foo> 都是無效的。 - 域分隔符
NATS協議消息的域使用 空格符 或 \t 進行分隔。多個空格會被視爲一個空格。 - 新行
與那些基於文本的協議一樣,NATS使用 CR+LF(也即\r\n,0X0D0A)作爲協議消息的終止。新行還用於標記在 PUB 或 MSG 協議消息的實際有效負載。
NATS協議消息
下面的表格描述了NATS協議消息,要注意操作名是大小寫不敏感的,因此 SUB foo 1\r\n 和 sub foo 1\r\n 是等價的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
————————————————————————————————————————————————————————————— 操作名 | 發送端 | 描述 ————————————————————————————————————————————————————————————— INFO 服務器 初始化TCP/IP連接後發送給客戶端 CONNECT 客戶端 發送給服務器指定連接信息 PUB 客戶端 發佈消息到主題或Reply主題 SUB 客戶端 訂閱主題(或主題通配符) UNSUB 客戶端 取消訂閱主題(或自動取消訂閱) MSG 服務器 交付一條消息負載給訂閱者 PING 兩端 保持連接有效的PING活躍消息 PONG 兩端 保持連接有效的PONG活躍消息 +OK 服務器 確認詳細(Verbose)模式下協議消息的合法 -ERR 服務器 指示協議錯誤,會導致客戶端斷開連接 ————————————————————————————————————————————————————————————— |
注意:pub 操作只能針對具體的某個topic(收件箱),不能使用通配置符!
NATS協議消息的例子
下面是使用 Telnet 連接 demo.nats.io 站點的例子:
1
2
3
4
5
6
|
telnet demo.nats.io 4222 Trying 107.170.221.32... Connected to demo.nats.io. Escape character is '^]' . INFO { "server_id" : "1ec445b504f4edfb4cf7927c707dd717" , "version" : "0.6.6" , "go" : "go1.4.2" , "host" : "0.0.0.0" , "port" :4222," |
CONNECT
語法 CONNECT {[“option_name”:option_value],…} 有效的選項如下:
- verbose打開+OK協議確認
- pedantic:打開附帶的嚴格格式檢查,比如正確的主題名
- ssl_required:指示客戶端是否需要SSL連接
- auth_token:客戶端授權令牌
- user:連接的用戶名(如果設置了auth_required)
- pass:連接的密碼(如果設置了auth_required)
- name:客戶端名(可選項)
- lang:客戶端的實現語言
- version:客戶端的版本
描述:
CONNECT消息與INFO消息相似,一旦客戶端與NATS服務器建立了TCP/IP套接字連接,且服務器接收到INFO消息,客戶端還可以發送CONNECT消息到NATS服務器,以便提供關於當前連接的更詳細的信息和安全信息。
1
|
CONNECT { "verbose" :false, "pedantic" :false, "ssl_required" :false, "name" : "" , "lang" : "go" , "version" : "1.1.0" }\r\n |
大多數客戶端都設置了Verbose模式爲false(缺省設置),這意味着服務器在接收到消息後不會發送+OK消息給客戶端