# NATS 2.0

NATS 2.0 是自服务器原始代码库发布以来最大的功能发布。 NATS 2.0 的创建允许一种将 NATS 视为共享实用程序的新方式，通过分布式安全性、多租户、更大的网络和安全的数据共享来大规模解决问题。

## 理由

NATS 2.0 旨在解决大规模分布式计算中的问题。

在遵守政策和合规性的同时，将端到端\（或端到端\）身份管理与数据共享相结合是很困难的。当前的分布式系统随着规模的扩大而显着增加了操作复杂性。围绕服务发现、连接性、容量扩展以及应用程序载入和更新会出现问题。灾难恢复很困难，尤其是当系统已经发展为在由技术而非业务需求定义的孤岛中运行时。随着复杂性的增加，系统的运行在时间和金钱方面变得昂贵。它们变得脆弱，难以部署阻碍创新、增加价值实现时间和总拥有成本的服务和应用程序。

我们决定：

* **降低总拥有成本**：用户希望降低其 TCO

  分布式系统。这是通过一种易于使用的技术解决的，该技术

  可以通过简单的配置和弹性在全球范围内运行

  和云原生架构。
* **减少价值实现时间**：随着系统的扩展，\_价值实现时间\_增加。

  由于接触复杂和脆弱的风险，运营抵制变革

  系统。提供隔离上下文可以帮助缓解这种情况。
* **支持可管理的大规模部署**：没有定义的数据孤岛

  软件，而不是通过软件轻松管理，以提供确切的内容

  业务需求。我们希望提供易于配置的灾难恢复。
* **去中心化安全**：提供安全支持之一

  组织可以自我管理的端到端技术

  更容易支持大量端点。

为了实现这一点，我们添加了许多对现有客户端透明的新功能，具有 100% 的向后客户端兼容性。

## 帐户

帐户是安全隔离的通信上下文，允许跨 NATS 部署的多租户。帐户允许用户将技术与业务驱动的用例分开，其中数据孤岛是由设计创建的，而不是软件限制。当客户端连接时，它会指定一个帐户或默认使用全局帐户进行身份验证。

至少有些服务需要在其帐户之外共享数据。数据可以在具有安全服务和流的帐户之间安全地共享。只有帐户所有者之间的相互协议才允许数据流动，并且导入帐户可以完全控制自己的主题空间。

这意味着在一个帐户中，可以设置限制并且可以使用主题，而不必担心与其他团体或组织发生冲突。开发组在不影响系统其余部分的情况下选择任何主题，并开设帐户以仅导出或导入他们需要的服务和流。

帐户简单、安全且具有成本效益。有一个 NATS 部署需要管理，但组织和开发团队可以通过更快、更敏捷的开发实践以更多的自主权来自我管理，从而缩短实现价值的时间。

### 服务和流

服务和流是在帐户之间共享消息的机制。

将服务视为帐户中的 RPC 端点。在该帐户后面可能有许多微服务协同工作以处理请求，但从帐户外部只暴露了一个主题。

**Service** 定义共享一个端点：

* 导出服务以允许其他帐户导入
* 导入服务以允许将请求安全无缝地发送到另一个帐户

用例包括大多数应用程序——任何接受请求并返回响应的应用程序。

**流**定义允许帐户之间的连续数据流：

* 导出流以允许出口
* 导入流以允许入口

用例包括可观察性、度量和数据分析。读取数据流的任何应用程序或端点。

请注意，服务和流在**零**客户端配置或 API 更改的情况下运行。服务甚至可以在账户之间移动，对最终客户完全透明。

### 系统帐户

系统帐户在已建立的主题模式下发布系统消息。这些是可能对操作员有用的内部 NATS 系统消息。

服务器发起的事件和数据包括：

* 客户端连接事件
* 账户连接状态
* 身份验证错误
* 叶节点连接事件
* 服务器统计摘要

具有适当权限的工具和客户端可以请求：

* 服务统计
* 服务器发现和指标

帐户服务器也会在帐户更改时发布消息。

使用这些信息和系统元数据，您可以构建有用的监控和异常检测工具。

## 全球部署

NATS 2.0 支持全球部署，允许在扩展到边缘或设备的同时优化 WAN 的全球拓扑。

\###自我修复

虽然自我修复功能已成为 NATS 1.X 版本的一部分，但我们确保它们继续在全球部署中工作。这些包括：

* 客户端和服务器连接自动重新连接 \*自动发现服务器交换服务器拓扑更改的每个

  其他和客户端，实时零配置更改和

  零停机时间，同时对客户完全透明。客户可以

  故障转移到最初未配置的服务器。
* NATS 服务器集群动态调整到新的或删除的服务器允许

  用于无缝滚动升级和扩大或缩小规模。

### 超星系团

从概念上讲，超集群是 NATS 集群的集群。创建超级集群以部署真正的全球 NATS 网络。超级集群使用一种新颖的基于样条的技术，采用独特的拓扑方法，保持单跳语义，并通过带有兴趣图修剪的乐观发送来优化 WAN 流量。超级集群为地理分布的队列订阅者提供透明、智能的支持。

＃＃＃ 灾难恢复

超级集群本质上支持灾难恢复。对于地理分布式队列订阅者，首选本地客户端，然后使用 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 服务器，允许中心辐射型拓扑扩展超级集群。

叶节点还可以桥接单独的安全域。例如物联网、移动、网络。它们非常适合需要连接到全球 NATS 部署的边缘计算、物联网中心或数据中心。使用环回接口与物理 VM 或容器安全通信的本地应用程序也可以利用叶节点。

叶节点：

* 透明且安全地绑定到远程 NATS 帐户
* 将特定本地数据安全地桥接到更广泛的 NATS 部署
* 100% 对客户透明，保持简单、轻量级和易于开发
* 在全局使用新的 NATS 安全功能时允许本地安全方案
* 可以在本地 NATS 部署和外部 NATS 集群或超级集群之间创建 DMZ。

## 去中心化安全

### 操作员、帐户和用户

NATS 2.0 安全性包括在 NATS 部署中定义操作员、帐户和用户。

* **Operator** 为系统提供信任根，可能代表

  公司或企业

  * 为帐户管理员创建**帐户**。一个账户代表

    具有安全上下文的组织、业务单位或服务产品

    在 NATS 部署中，例如 IT 系统监控组、

    一组微服务，或区域物联网部署。帐户创建

    很可能由一个中央集团管理。
* **Accounts** 定义限制并且可以安全地公开服务和流。
  * 客户经理创建具有权限的**用户**
* **用户**具有特定的凭据和权限。

### 信任链

PKI (NKeys 编码 [Ed25519](https://ed25519.cr.yp.to/)) 和签名的 JWT 创建了操作员、帐户和用户的层次结构，从而创建了可扩展且灵活的分布式安全机制。

* **运营商**由自签名的 JWT 表示，并且是唯一的

  需要在服务器中配置。 此 JWT 通常由

  保持离线状态的主密钥。 JWT 将包含有效的签名密钥

  可以通过更新此 JWT 的 master 撤销。

  * 运营商将使用各种签名密钥签署 **Account** JWT。
  * **Accounts** 签署 **User** JWT，同样使用各种签名密钥。
* 客户端或叶节点在连接时提供 **User** 凭据和已签名的 nonce。
  * 服务器使用解析器获取 JWT 并验证客户端信任链。

这允许将权限、身份验证和限制快速更改为安全的多租户 NATS 系统。
