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

本文分享自微信公众号 - golang技术杂文(gh_ebbdb61f463e),作者:无崖子天下无敌

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NATS多种连接Golang实践

    如果因为任何原因断开连接,大多数(如果不是全部)客户端库将重新连接到NATS系统。重新连接逻辑可能因库而异,因此请检查客户端库的文档。

    陌无崖
  • RabbitMQ系列笔记入门篇

    在了解本篇文章之前,先复习以下知识点,如果你对RabbitMQ还不了解,请先查看RabbitMQ系列笔记介绍篇这篇文章。

    陌无崖
  • Micro如何接收web端的发布实现后台订阅?

    在web开发中有一种情况,我们或许希望在发送http请求的同时,后台服务订阅了该http请求,并对消息作出相应的处理,该怎么做呢?我们之前学过broker模式,...

    陌无崖
  • NATS多种连接Golang实践

    如果因为任何原因断开连接,大多数(如果不是全部)客户端库将重新连接到NATS系统。重新连接逻辑可能因库而异,因此请检查客户端库的文档。

    陌无崖
  • socket编程【2】TCP编程

    大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。 下面是一个客户端的例子:

    用户2936342
  • TCP之三次握手四次挥手

    TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

    程序猿DD
  • TCP概述\三次握手四次挥手\报文首部,常用熟知端口号

    TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地...

    小小咸鱼YwY
  • 本机向windows服务器传输文件的三种方法

      闲来无事,在腾讯云上申请了一个免费的服务器,想将自己写的网页发布到服务器上,服务器的申请很简单,百度搜索 腾讯云 ,然后新人第一次注册能申请到免费一个月的云...

    IT可乐
  • windows+安卓调试Hybrid混合应用的实践

    本文作者:IMWeb helinjiang 原文出处:IMWeb社区 未经同意,禁止转载 开发Hybrid混合应用时,很多人都觉得调试是一件比较麻烦的...

    IMWeb前端团队
  • windows+安卓调试Hybrid混合应用的实践

    开发Hybrid混合应用时,很多人都觉得调试是一件比较麻烦的事情,因为它可能会依赖于app环境,绝不是普通的h5页面那么简单。

    IMWeb前端团队

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动