NATS的协议是一个简单的、基于文本的发布/订阅风格的协议。客户端连接到 gnatsd(NATS服务器),并与 gnatsd 进行通信,通信基于普通的 TCP/IP 套接字,并定义了很小的操作集,换行表示终止。与传统的、使用了二进制消息格式的消息通信系统不同,使用了基于文本的 NATS 协议,使得客户端实现很简单,可以方便地选择多种编程语言或脚本语言来实现。

 NATS协议约定

  • 主题名(Subject Name) 
    主题名包括响应主题(收件箱)名,是大小写敏感的,必须是非空字符串,不能包含空格,可以在字符串中使用 “.” 符号,比如: 
    FOO、BAR、foo.bar、foo.BAR、FOO.BAR、FOO.BAR.BAZ 这些都是有效的主题名。
  • 通配符 
    NATS支持在主题订阅中使用 “*” 通配符, 星号 “*” 匹配主题的任意级别的任意字符。 
    大于号 “>” 匹配后面的任意字符。比如 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 是等价的。

—————————————————————————————————————————————————————————————
操作名 | 发送端 | 描述
—————————————————————————————————————————————————————————————
INFO 服务器 初始化TCP/IP连接后发送给客户端
CONNECT 客户端 发送给服务器指定连接信息
PUB 客户端 发布消息到主题或Reply主题
SUB 客户端 订阅主题(或主题通配符)
UNSUB 客户端 取消订阅主题(或自动取消订阅)
MSG 服务器 交付一条消息负载给订阅者
PING 两端 保持连接有效的PING活跃消息
PONG 两端 保持连接有效的PONG活跃消息
+OK 服务器 确认详细(Verbose)模式下协议消息的合法
-ERR 服务器 指示协议错误,会导致客户端断开连接
—————————————————————————————————————————————————————————————

 NATS协议消息的例子

  下面是使用 Telnet 连接 demo.nats.io 站点的例子:

telnet demo.nats.io 

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":,"

 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服务器,以便提供关于当前连接的更详细的信息和安全信息。

例子:下面是来自Golang客户端的一个例子:

CONNECT {"verbose":false,"pedantic":false,"ssl_required":false,"name":"","lang":"go","version":"1.1.0"}\r\n

  大多数客户端都设置了Verbose模式为false(缺省设置),这意味着服务器在接收到消息后不会发送+OK消息给客户端。

NATS_04:NATS协议详解的更多相关文章

  1. NATS—协议详解(nats-protocol)

    NATS的协议是一个简单的.基于文本的发布/订阅风格的协议.客户端连接到 gnatsd(NATS服务器),并与 gnatsd 进行通信,通信基于普通的 TCP/IP 套接字,并定义了很小的操作集,换行 ...

  2. HTTP协议详解(转)

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  3. HTTP协议详解

    Author :Jeffrey 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展. ...

  4. 动态选路、RIP协议&&OSPF协议详解

    动态选路.RIP协议&&OSPF协议详解 概念 当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路.路由器之间必须采用选路协议进行通信,这样的选路协议 ...

  5. ASP.NET知识总结(3.HTTP协议详解)

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  6. 接口测试之HTTP协议详解

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  7. 计算机网络(12)-----HTTP协议详解

    HTTP协议详解 http请求 http请求由三部分组成,分别是:请求行.消息报头.请求正文 (1)请求行 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Metho ...

  8. OSPF协议详解

    CCNP OSPF协议详解 2010-02-24 20:30:22 标签:CCNP 职场 OSPF 休闲 OSPF(Open Shortest Path Fitst,ospf)开放最短路径优先协议,是 ...

  9. HTTP协议详解(真的很经典)

    HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展.目前在WWW中使用的是HTTP/1.0 ...

随机推荐

  1. 超级迷宫之NABCD

    模式之一:双人模式 N:基于双人之间的竞争与协作,朋友之间可以有一个竞争比赛,一决高下,男女朋友之间适合双人协作模式,共同完成游戏. A:双人竞争模式为双人同起点或不同起点来进行游戏,在竞争的紧张压力 ...

  2. Ubuntu登录界面添加root用户登录选项

    1.普通用户登录系统并打开终端 配置root密码 $sudo passwd 切换至root用户 $su root 输入密码 修改以下配置文件 $nano /usr/share/lightdm/ligh ...

  3. C++作业 一

    计算圆面积 Github:https://github.com/tinghaishuo/object-oriented/tree/master/circle

  4. charles抓取移动端app数据

    pc端为mac 移动端为android pc端 1.下载charles并安装 安利一个超好的良心网站(好多好用的软件都可以在上面找到,并且免费): http://xclient.info/search ...

  5. 蜗牛慢慢爬 LeetCode 20. Valid Parentheses [Difficulty: Easy]

    题目 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the i ...

  6. mysql数据优化--数据库结构的优化

    1,比如存时间类型的就使用int类型   其中mysql的两个函数可以拿来使用 unix_timestamp 将时间日期转化为时间戳

  7. 移动端 H5 弹出层 fixed 内容可滚动

    <div class="alert_wapper"> <div class="wapper"> <!--内容 --> < ...

  8. 关于MyEclipse,JDK使用的几点收获

    [1]MyEclipse如何修改JDK编译版本信息 首先打开MyEclipse——>windows——>preference(也就是 窗口——>首选项:可以在搜索框中输入JDK,查找 ...

  9. poj 3311(状态压缩DP)

    poj  3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...

  10. Task的运行原理和工作窃取

    在net4.0以前,当调用ThreadPool.QueueUserWorkItem方法往线程池中插入作业时,会把作业内容(其实就是一个委托)放到线程池中的一个全局队列中,然后线程池中的线程按照先进先出 ...