NATS系统通常由一个带有nats或tls协议的标准URL标识,例如nats://demo.nats.io。NATS系统可以是单个服务器、小型集群或全局超级集群。在这些示例中,我们将依赖nats.io提供的单个测试服务器,位于nats://demo.nats.io,使用4222作为默认端口。
NATS还支持通过TLS协议使用安全连接。大多数客户端支持使用URL协议tls自动检测安全连接。在tls://demo.nats.io:4443还有一个运行TLS的演示服务器。协议要求对于多个客户端库是可选的,因此您可以使用demo.nats.io:4222作为URL,并让客户端和服务器决定是否需要TLS。
NATS连接有很多选项,从超时到重新连接设置。
一些库还提供了一种连接到默认url的特殊方式,通常是nats://localhost:4222:
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来指定要连接到的特定服务器主机和端口。
库正在删除显式协议的要求,并可能允许demo.nats.io:4222或仅允许demo.nats.io。在后面的示例中,将使用默认端口4222。请查看特定客户机库的文档,以查看支持哪些URL格式。
例如,要使用URL连接到演示服务器,可以使用:
// If connecting to the default port, the URL can be simplified
// to just the hostname/IP.
// That is, the connect below is equivalent to:
// nats.Connect("nats://demo.nats.io:4222")
nc, err := nats.Connect("demo.nats.io")
if err != nil {
log.Fatal(err)
}
defer nc.Close()
// Do something with the connection nc = Nats.connect("nats://demo.nats.io:4222");
当连接到集群时,有一些事情需要考虑。
当客户端库首次尝试连接时,它将使用由连接选项或函数提供的url列表。这些url通常是按随机顺序检查的,这样就不会让每个客户端连接到同一个服务器。使用第一个成功的连接。可以显式禁用随机化。
客户端连接到服务器后,服务器可以为其提供已知服务器的URL列表。这允许客户端连接到一台服务器后,在重连期间仍有其他服务器可用。
为了确保初始连接,您的代码应该包含一个合理的前端服务器或种子服务器列表。这些服务器可能知道集群的其他成员,并可能告诉客户机这些成员。但您不必配置客户端来传递集群中每个有效成员到connect方法中。
通过(在连接时)提供传递多个连接选项的能力,NATS可以处理机器故障或客户端不可用的情况。通过添加服务器向客户机提供已知服务器列表的功能,作为客户机-服务器协议的一部分,集群创建的网格可以在客户机运行时有机地增长和更改。
注意,失败行为依赖于库,请查看客户端库的文档,了解如果连接失败会发生什么情况。
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()
// Do something with the connection
可以为连接分配一个名称,该名称将出现在某些服务器监视数据中。此名称不是必需的,但强烈建议使用此名称,因为友好的连接名称将有助于监视、错误报告、调试和测试。
nc, err := nats.Connect("demo.nats.io", nats.Name("API Name Option Example"))
if err != nil {
log.Fatal(err)
}
defer nc.Close()
// Do something with the connection
每个库都有自己的语言首选方式来传递连接选项。最常见的选项之一是连接超时。它限制了建立到服务器的连接所需的时间。如果提供多个URL,则此超时将分别应用于每个群集成员。要将连接服务器的最长时间设置为10秒,请执行以下操作:
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()
// Do something with the connection
客户机和服务器使用一个简单的PING/PONG协议来检查它们中的任何一个仍然连接到另一个。客户端将定期对服务器执行ping操作,服务器将以pong响应。
一旦达到未完成ping的可配置最大值(没有单个pong回复),连接将作为陈旧连接被关闭。这两个值一起定义了连接的超时,该超时指定了客户机收到问题通知的速度。当远程网络分区存在操作系统未检测到套接字错误时,这也会有帮助。连接关闭后,客户端将尝试重新连接。当它知道其他服务器时,下一步将尝试连接这些服务器。
在存在拥塞(如消息或客户端PING)时,服务器不会启动PING/PONG交互。
对于流量很大的连接,客户机通常会发现PING之间存在问题,因此默认PING间隔通常为几分钟。要将间隔设置为20秒并将未完成的ping限制为5次,从而在100秒不活动后强制关闭连接:
// Set Ping Interval to 20 seconds
nc, err := nats.Connect("demo.nats.io", nats.Name("API Ping Example"), nats.PingInterval(20*time.Second), nats.MaxPingsOutstanding(5))
if err != nil {
log.Fatal(err)
}
defer nc.Close()
// Do something with the connection
默认情况下,如果连接对已发布的主题也感兴趣,则NATS连接将回显消息。这意味着,如果连接上的发布者向某个主题发送消息,则同一连接上的任何订阅服务器都将收到该消息。客户机可以选择关闭此行为,这样无论是否感兴趣,消息都不会传递到同一连接上的订阅服务器。
NoEcho选项在所有应用程序订阅并发布到同一主题的总线模式中非常有用。通常,发布表示应用程序已经知道状态更改,因此在应用程序发布更新的情况下,不需要处理更新本身。
请记住,每个连接都必须关闭echo,并且是每个连接,而不是每个应用程序。此外,打开和关闭echo可能会导致应用程序通信协议的重大更改,因为消息将根据此设置流动或停止流动,而订阅代码不会显示任何原因。
// Turn off echo
nc, err := nats.Connect("demo.nats.io", nats.Name("API NoEcho Example"), nats.NoEcho())
if err != nil {
log.Fatal(err)
}
defer nc.Close()
// Do something with the connection
本节包含各种连接功能和选项。
虽然客户端无法控制最大负载大小,但客户端可以为应用程序提供一种在建立连接后获取配置的最大负载的方法。这将允许应用程序根据需要对通过服务器的数据进行分块或限制。
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服务器提供了一种迂腐的模式,可以对协议执行额外的检查。
这种检查的一个例子是用于发布的主题是否包含通配符。服务器不会将其用作通配符,因此会忽略此检查。
默认情况下,此设置处于禁用状态,但您可以将其打开以测试应用程序:
opts := nats.GetDefaultOptions()
opts.Url = "demo.nats.io"
// Turn on Pedantic
opts.Pedantic = true
nc, err := opts.Connect()
if err != nil {
log.Fatal(err)
}
defer nc.Close()
// Do something with the connection
客户机和服务器之间的协议相当简单,依赖于控制线,有时还依赖于主体。控制行包含正在发送的操作,如PING或PONG,后跟回车和换行、CRLF或“\r\n”。服务器有一个最大控制线选项,可以限制控制线的最大大小。对于PING和PONG,这并不起作用,但是对于包含主题名和可能的队列组名的消息,控制行长度可能很重要,因为它有效地限制了可能的组合长度。一些客户端将尝试在内部限制控制行大小,以防止服务器出错。这些客户端可能允许也可能不允许您设置正在使用的大小,但如果允许,则应将大小设置为与服务器配置匹配。
不建议将此值设置为高于其他客户端或nats服务器的值。
例如,要将最大控制线大小设置为2k:
// This does not apply to the NATS Go Client
客户端可以从NATS服务器请求详细模式。当客户机请求时,服务器将用+OK或ERR or-ERR回复来自该客户机的每条消息。但是,客户端不会阻塞并等待响应。错误也将在没有详细模式的情况下发送,客户端库将按文档处理这些错误。
此功能仅用于调试客户端库或nats服务器本身。默认情况下,服务器将其设置为打开,但每个客户端都将其关闭。
要打开详细模式:
opts := nats.GetDefaultOptions()
opts.Url = "demo.nats.io"
// Turn on Verbose
opts.Verbose = true
nc, err := opts.Connect()
if err != nil {
log.Fatal(err)
}
defer nc.Close()
// Do something with the connection