NATS 2.0是自代码发布以来最大的特性发布。NATS 2.0允许将NATS看作为一种共享实用工具,通过分布式安全、多租户、更大的网络和数据的安全共享大规模地解决问题。
基本原理
创建NATS 2.0是为了解决大规模分布式计算中的问题。
在坚持政策和遵从性的同时,将端到端(或端到端边缘)的身份管理与数据共享结合起来是非常困难的。当前的分布式系统随着规模的扩大,操作复杂性显著增加。围绕服务发现、连接、容量扩展以及应用程序的加载和更新出现了一些问题。灾难恢复很困难,尤其是当系统已经发展到由技术而非业务需求定义的孤岛中运营时。随着复杂性的增加,系统在时间和金钱方面的运行成本变得昂贵。它们变得脆弱,难以部署服务和应用程序,阻碍创新,增加了实现价值的时间和总拥有成本。
我们决定:
- 降低总体拥有成本:用户希望降低其分布式系统的TCO(total cost of ownership,总体拥有成本)。这是通过一种易于使用的技术来解决,该技术可以在全球范围内运行,配置简单,具有弹性和云原生架构。
- 减少实现价值的时间:随着系统规模的扩大,实现价值的时间会增加。由于接触复杂而脆弱的系统时存在风险,操作会抵制更改。提供隔离上下文可以帮助缓解这种情况。
- 支持可管理的大规模部署:没有由软件定义的数据孤岛,而是通过软件轻松管理,以提供准确的业务需求。我们希望提供易于配置的灾难恢复。
- 分散化安全性:提供支持一种端到端技术的安全性,在这种技术中,组织可以进行自我管理,从而更容易支持大量端点。
为了实现这一点,我们添加了一些对现有客户端透明的新特性,并且具有100%的向后客户端兼容性。
账户
帐户(Account)是安全隔离的通信上下文,允许NATS部署多租户。帐户允许用户将技术从业务驱动用例中分离出来,数据孤岛是设计出来而不是来自软件限制。当客户端连接时,它指定一个帐户,或者默认使用全局帐户进行身份验证。
会有一些服务需要共享帐户外的数据。数据可以在具有安全服务和流的帐户之间安全地共享。只有帐户所有者之间的相互协议才允许数据流,导入帐户对自己的主题空间具有完全的控制。
这意味着在帐户中可以设置限制,并且可以使用主题而不用担心与其他组或组织发生冲突。开发团队在不影响系统其他部分的情况下选择任何主题,并打开帐户,只导出或导入他们需要的服务和流。
帐户是简单、安全、和成本有效的。只需要管理一个NATS部署,但是组织和开发团队有更大的自治权进行自我管理,通过更快、更敏捷的开发实践,从而减少价值实现的时间。
服务和流
服务和流是在帐户之间共享消息的机制。
将服务看作帐户中的RPC端点。在该帐户后面可能有许多协同工作的微服务来处理请求,但是从帐户外部只公开了一个主题。
共享端点的服务定义:
- 导出服务以允许其他帐户导入
- 导入一个服务以允许将请求安全地无缝地发送到另一个帐户
用例包括大多数应用程序 - 任何接受请求并返回响应的应用程序。
流定义允许账户之间的连续数据流:
- 导出一条流以允许出口
- 导入一个流以允许进入
用例包括可观察性、度量和数据分析。读取数据流的任何应用程序或端点。
请注意,服务和流在零客户端配置或API更改的情况下运行。服务甚至可以在账户之间移动,对终端客户完全透明。
系统账户
系统帐户在已建立的主题模式下发布系统消息。这些是可能对操作员有用的内部NATS系统消息。
服务器发起的事件和数据包括:
- 客户端连接事件
- 账户连接状态
- 身份验证错误
- 叶节点连接事件
- 服务器数据总结
具适当权限的工具及客户端可要求:
- 服务统计数据
- 服务器发现和度量
帐户服务器还将在帐户更改时发布消息。
使用这些信息和系统元数据,你可以构建有用的监视和异常检测工具。
全球部署
NATS 2.0支持全局部署,允许全局拓扑对广域网进行优化,同时扩展到边缘或设备。
自愈
自愈功能是NATS 1.X版本的一部分,我们确保它们继续在全球部署中工作。这些包括:
- 客户端和服务器自动重新连接
- 自动发现服务器交换彼此和客户端拓扑结构的变化,实时进行零配置更改和零停机,同时对客户端完全透明。客户端可以故障转移到它们最初没有配置的服务器。
- NATS服务器集群可以动态调整到新的或已删除的服务器,从而实现无缝滚动升级和向上或向下伸缩。
超集群
从概念上讲,超集群是NATS集群的集群。创建超集群来部署一个真正的全球NATS网络。超集群使用一种新颖的基于样条(spline)的技术,采用独特的拓扑方法,保持单跳语义,并通过带兴趣的图剪枝的乐观发送优化广域网流量。超集群为地理分布的队列订阅者提供透明、智能的支持。
灾难恢复
超集群天生支持灾难恢复。对于地理分布的队列订阅者,首选本地客户端,然后使用RTT查找超集群中包含匹配队列订阅者的最低延迟的NATS集群。
这是什么意思?
假设你在美国东海岸(US-EAST)有一组负载平衡服务,在欧洲(EU-WEST)有另一组负载平衡服务,以及由US-EAST的NATS集群与EU-WEST的NATS集群连接而成的超集群。美国的客户端将连接到US-EAST,而连接到该集群的服务将为这些客户端提供服务。欧洲的客户将自动使用连接到EU-WEST的服务。如果US-EAST的服务断开连接,US-EAST中的客户端将开始使用EU-WEST的服务。
一旦美国东部的服务重新连接到US-EAST,这些服务将立即开始为美国东部的客户提供服务,因为它们是NATS集群的本地客户。这是自动的,对客户端完全透明。在NATS服务器中没有额外的配置。
这是零配置灾难恢复。
叶节点
叶子节点是运行在特殊配置中的NATS服务器,允许hub和spoke拓扑扩展超集群。
叶节点还可以桥接单独的安全域,像物联网、移动、网络。它们是边缘计算、物联网中心或需要连接到全球NATS部署的数据中心的理想选择。使用环回接口与物理VM或容器安全性进行通信的本地应用程序也可以利用叶节点。
叶节点:
- 透明且安全地绑定到远程NATS帐户
- 安全地将特定的本地数据连接到更广泛的NATS部署
- 对于客户端是100%透明,保持简单、轻量级和易于开发
- 在全局使用新的NATS安全特性时,允许使用本地安全方案
- 可以在本地NATS部署和外部NATS集群或超集群之间创建DMZ
分散化安全性
操作员、帐户和用户
NATS 2.0安全性包括在NATS部署中定义操作员(Operator)、帐户(Account)和用户(用户)。
- 操作员为系统提供信任的根,可以代表公司或企业
- 为帐户管理员创建帐户。帐户在NATS部署中表示具有安全上下文的组织、业务单元或服务,例如IT系统监视组、一组微服务或一个区域物联网部署。帐户创建可能由一个中央组管理。
- 帐户定义限制并可以安全地公开服务和流。
- 帐户管理员创建具有权限的用户
- 用户具有特定的凭证和权限。
信任链
PKI(NKeys编码Ed25519)和已签名的JWT创建了操作员、帐户和用户的层次结构,创建了可伸缩和灵活的分布式安全机制。
- 操作员由自签名JWT表示,这是服务器中唯一需要配置的东西。这个JWT通常由一个保持离线的主键签名。JWT将包含有效的签名密钥,可以通过主服务器更新该JWT来撤销这些密钥。
- 操作员将使用各种签名密钥签署帐户的JWT。
- 帐户使用各种签名密钥为用户的JWT签名。
- 客户端或叶节点在连接时提供用户凭证和已签名的nonce。
- 服务器使用解析器获取JWT并验证客户端信任链。
这允许对安全的多租户NATS系统快速更改权限、身份验证和限制。