NATS 用 Go 入门实践

连接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:

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连接到演示服务器,您可以使用:

//如果连接到默认端口,则可以简化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可以处理机器关闭或客户端不可用的可能性。通过添加服务器向客户端提供已知服务器列表作为客户端 – 服务器协议的一部分的能力,群集创建的网格可以在客户端运行时有机地增长和更改。

注意,失败行为取决于库,请查看客户端库的文档,了解有关连接失败时会发生什么的信息。

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秒:

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秒:

// 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:

    // 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,这不起作用,但对于包含主题名称的消息,控制线长度可能很重要。服务器还配置了最大有效负载大小,这限制了消息正文的大小。服务器在连接时向客户端发送最大有效负载大小,但当前不会告知客户端最大控制线大小。

获取最大有效负载大小

虽然客户端无法控制最大有效负载大小,但客户端可以为应用程序提供一种在建立连接后获取大小的方法。这将允许应用程序根据需要对数据进行分块或限制以通过服务器。

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

打开微信扫一扫,关注微信公众号