作者 | 陌无崖
转载请联系授权
连接NATS
NATS系统通常由具有nats或tls协议的标准URL标识,例如, NATS://demo.nats.io。NATS系统可以是单个服务器,小型集群或全局超级集群。在这些示例中,我们将依赖nats.io提供的单个测试服务器,位于nats://demo.nats.io,其中4222是NATS的默认端口。
NATS还通过tls协议使用TLS支持安全连接。大多数客户端支持使用URL协议自动检测安全连接。还有一个运行TLS的演示服务器在tls://demo.nats.io:4443。对于许多客户端库,协议要求是可选的,因此您可以使用demo.nats.io:4222作为URL,让客户端和服务器解析是否需要TLS。
NATS连接有多种选择,从超时到重新连接设置。
连接到默认服务器
一些库还提供了一种连接到默认URL的特殊方法,通常是nats:// localhost:4222:
代码语言:javascript复制nc, err := nats.Connect(nats.DefaultURL)
if err != nil {
log.Fatal(err)
}
defer nc.Close()
// Do something with the connection
连接到特定服务器
NATS客户端库可以使用完整的URL nats://demo.nats.io:4222来指定要连接的特定服务器主机和端口
库正在删除对显式协议的要求,并且可能允许nat://demo.nats.io:4222或者只是demo.nats.io:4222。请查看您的特定客户端库文档,以查看支持的URL格式。
例如,要使用URL连接到演示服务器,您可以使用:
代码语言:javascript复制//如果连接到默认端口,则可以简化URL
//仅限主机名/ IP。
//也就是说,下面的连接相当于:
// nats.Connect(“nats://demo.nats.io:4222”)
nc, err := nats.Connect("demo.nats.io")
if err != nil {
log.Fatal(err)
}
defer nc.Close()
连接到集群
这里需要注意的是如果是连接到群集时,需要考虑一些事项。
- 传递每个集群成员的URL(半可选)
- 连接算法
- 重新连接算法
- 服务器提供URLS
当客户端库首次尝试连接时,它将使用提供给连接选项或功能的URL列表。通常按顺序检查这些URL,并使用第一个成功的连接。
在客户端连接到服务器之后,服务器可以提供其他已知服务器的URL列表。这允许客户端连接到一个服务器,并且在重新连接期间仍然可以使用其他服务器。
为确保初始连接,您的代码应包含合理的一线服务器列表。这些服务器可能知道群集的其他成员,并可能告诉客户有关这些成员的信息。但您不必将客户端配置为在connect方法中传递集群的每个有效成员。
通过提供传递多个连接选项的能力,NATS可以处理机器关闭或客户端不可用的可能性。通过添加服务器向客户端提供已知服务器列表作为客户端 - 服务器协议的一部分的能力,群集创建的网格可以在客户端运行时有机地增长和更改。
注意,失败行为取决于库,请查看客户端库的文档,了解有关连接失败时会发生什么的信息。
代码语言:javascript复制servers := []string{"nats://127.0.0.1:1222", "nats://127.0.0.1:1223", "nats://127.0.0.1:1224"}
nc, err := nats.Connect(strings.Join(servers, ","))
if err != nil {
log.Fatal(err)
}
defer nc.Close()
设置连接超时
每个库都有自己的语言首选方式来传递连接选项。最常见的选项之一是连接超时。要将连接服务器的最长时间设置为10秒:
代码语言:javascript复制nc, err := nats.Connect("demo.nats.io", nats.Name("API Options Example"), nats.Timeout(10*time.Second))
if err != nil {
log.Fatal(err)
}
defer nc.Close()
Ping/Pong 协议
客户端和服务器使用简单的PING / PONG协议来检查它们是否仍然连接。客户端将按照常规的配置间隔对服务器执行ping操作,以便服务器通常不必启动PING / PONG交互。
设置Ping间隔时间
如果您的连接将在很长时间内打开,并且几乎没有消息在其上传输,则设置此PING间隔可以控制客户端通知问题的速度。但是,在有大量流量的连接上,客户端通常会发现PINGS之间存在问题,因此默认的PING间隔通常为几分钟。要将间隔设置为20秒:
代码语言:javascript复制// Set Ping Interval to 20 seconds
nc, err := nats.Connect("demo.nats.io", nats.Name("API Ping Example"), nats.PingInterval(20*time.Second))
if err != nil {
log.Fatal(err)
}
defer nc.Close()
// Do something with the connection
限制Ping输出
大多数客户端也使用PING / PONG交互作为刷新与服务器的连接的方法。缓存传出消息的客户端提供将运行PING / PONG的刷新调用。flush将等待PONG返回,告诉它已经处理了所有缓存的消息,包括PING。大多数客户端可以限制缓存的PING请求数,以确保尽早发现流量问题。对于最大传出ping或类似配置的此配置通常默认为较小的数量,并且只有在您担心快速刷新流量(可能在多个线程中)时才应增加此配置。
例如,要将最大输出ping数设置为5:
代码语言:javascript复制 // Set maximum number of PINGs out without getting a PONG back
// before the connection will be disconnected as a stale connection.
nc, err := nats.Connect("demo.nats.io", nats.Name("API MaxPing Example"), nats.MaxPingsOutstanding(5))
if err != nil {
log.Fatal(err)
}
defer nc.Close()
控制客户端/服务器协议
客户端和服务器之间的协议非常简单,依赖于控制线,有时还依赖于主体。控制线包含正在发送的操作,如PING或PONG,后跟回车符和换行符,CRLF或“ r n”。服务器的设置可以限制控制线的最大大小。对于PING和PONG,这不起作用,但对于包含主题名称的消息,控制线长度可能很重要。服务器还配置了最大有效负载大小,这限制了消息正文的大小。服务器在连接时向客户端发送最大有效负载大小,但当前不会告知客户端最大控制线大小。
获取最大有效负载大小
虽然客户端无法控制最大有效负载大小,但客户端可以为应用程序提供一种在建立连接后获取大小的方法。这将允许应用程序根据需要对数据进行分块或限制以通过服务器。
代码语言:javascript复制nc, err := nats.Connect("demo.nats.io")
if err != nil {
log.Fatal(err)
}
defer nc.Close()
mp := nc.MaxPayload()
log.Printf("Maximum payload is %v bytes", mp)
// Do something with the max payload
以上文章参考翻译自NATS官方文档 https://nats-io.github.io/docs