Services

要让其他账户能够通过请求-回复模式访问你共享的服务,你必须导出一个服务服务与执行回复的账户相关联,并会在导出账户的 JWT 中进行通告。

添加公共服务导出

要向你的账户添加服务:

nsc add export --name help --subject help --service
[ OK ] added public service export "help"

要查看服务导出:

nsc describe account
╭──────────────────────────────────────────────────────────────────────────────────────╮
│                                   Account Details                                    │
├───────────────────────────┬──────────────────────────────────────────────────────────┤
│ Name                      │ A                                                        │
│ Account ID                │ ADETPT36WBIBUKM3IBCVM4A5YUSDXFEJPW4M6GGVBYCBW7RRNFTV5NGE │
│ Issuer ID                 │ OAFEEYZSYYVI4FXLRXJTMM32PQEI3RGOWZJT7Y3YFM4HB7ACPE4RTJPG │
│ Issued                    │ 2019-12-04 18:20:42 UTC                                  │
│ Expires                   │                                                          │
├───────────────────────────┼──────────────────────────────────────────────────────────┤
│ Max Connections           │ Unlimited                                                │
│ Max Leaf Node Connections │ Unlimited                                                │
│ Max Data                  │ Unlimited                                                │
│ Max Exports               │ Unlimited                                                │
│ Max Imports               │ Unlimited                                                │
│ Max Msg Payload           │ Unlimited                                                │
│ Max Subscriptions         │ Unlimited                                                │
│ Exports Allows Wildcards  │ True                                                     │
├───────────────────────────┼──────────────────────────────────────────────────────────┤
│ Imports                   │ None                                                     │
╰───────────────────────────┴──────────────────────────────────────────────────────────╯

╭────────────────────────────────────────────────────────────╮
│                          Exports                           │
├──────┬─────────┬─────────┬────────┬─────────────┬──────────┤
│ Name │ Type    │ Subject │ Public │ Revocations │ Tracking │
├──────┼─────────┼─────────┼────────┼─────────────┼──────────┤
│ help │ Service │ help    │ Yes    │ 0           │ -        │
╰──────┴─────────┴─────────┴────────┴─────────────┴──────────╯

导入服务

导入服务使你能够向远程账户发送请求。要导入服务,你必须创建一个导入。创建导入时需要知道以下信息:

  • 导出账户的公钥

  • 服务监听的主题

  • 你可以将服务的主题映射到一个不同的主题

  • 不允许自我导入;你只能从其他账户导入服务。

要了解如何检查账户服务器上的 JWT,请查看这篇文章arrow-up-right

首先,我们创建第二个账户 B,用于导入服务:

添加对主题 'help' 的导入

验证我们的工作:

我们再添加一个用户,以便发送请求到该导入的服务:

将更改推送到 NATS 服务器

如果你的 NATS 服务器配置为使用内置的 NATS 解析器,请记住,你需要使用 nsc push 将使用 nsc add 所做的任何账户更改推送到服务器,这些更改才能生效。

例如:nsc push -insc push -a B -u nats://localhost

测试服务

要测试服务,我们可以安装 'nats'arrow-up-right CLI 工具:

设置一个处理请求的进程。该进程将使用账户 'A' 的用户 'U' 运行:

请记住,你也可以这样做:

发送请求:

服务收到请求:

请求者收到回复:

或者更简单的方式:

保护服务

如果你希望创建一个只能由你指定的账户访问的服务,你可以创建一个私有服务。该导出将在你的账户中可见,但订阅方的账户需要一个授权令牌,该令牌必须由你创建并专门为订阅方账户生成。授权令牌只是一个由你的账户签名的 JWT,你在其中授权客户端账户导入你的服务。

创建私有服务导出

和之前一样,我们声明了一个导出,但这次我们添加了 --private 标志。另一点需要注意的是,请求的主题包含通配符。这使得账户能够将特定主题映射到专门授权的账户。

生成激活令牌

为了让外部账户能够导入私有服务并发送请求,你必须生成一个激活令牌。激活令牌除了授予账户权限外,还允许你限定服务主题的范围:

要生成令牌,你需要知道导入服务的账户的公钥。我们可以通过以下命令轻松找到账户 B 的公钥:

该命令输入了拥有导出的账户('A')、账户 B 的公钥、账户 B 请求的主题,以及一个用于存储令牌的输出文件。刚才我们导出的主题允许服务处理所有在 private.help.* 上的请求,但这里的账户 B 只能请求特定主题。

为完整起见,JWT 文件的内容如下所示:

解码后如下所示:

该令牌可以直接与客户端账户共享。

如果你为许多账户管理许多令牌,你可能希望将激活令牌托管在 Web 服务器上,并将 URL 共享给账户。这种托管方法的好处是,只要托管的 URL 是稳定的,对令牌的任何更新都可以在导入账户更新时随时可用。当使用 JWT 账户服务器时,令牌可以直接存储在服务器上,并通过生成令牌时打印的 URL 共享。

导入私有服务

导入私有服务比导入公共服务更自然,因为激活令牌本身已存储了所有必要的详细信息。同样,令牌可以是实际的文件路径或远程 URL。

Describe account B

导入服务时,你可以指定用于发送请求的本地主题。此处的本地主题是 private.help。但是,当 NATS 转发请求时,请求是发送到 Remote 主题上的。

测试私有服务

测试私有服务与测试公共服务没有区别:

最后更新于