NATS Swift Client

License Apache 2

NATS Swift 客户端

欢迎使用 SwiftNATS 客户端,这是您在 Swift 应用程序中实现异步消息传递的入口。 这个客户端库旨在为 Swift 开发者提供一个与 NATS 消息传递的无缝接口,从而在分布式系统中实现快速高效的通信。

特性

目前,该客户端支持 Core NATS,具有身份验证、TLS、跛脚鸭模式等功能。

JetStream、KV、对象存储、Service API 都在规划中。

支持

加入 nats.io Slack 上的 #swift 频道。 我们将尽最大努力快速提供帮助。 您也可以随时过来打个招呼。 我们期待发展这个社区。

通过 Swift Package Manager 安装

将此软件包作为依赖项包含在项目的 Package.swift 文件中,并将包名称添加到目标,如下例所示

// swift-tools-version:5.7

import PackageDescription

let package = Package(
    name: "YourApp",
    products: [
        .executable(name: "YourApp", targets: ["YourApp"]),
    ],
    dependencies: [
        .package(name: "Nats", url: "https://github.com/nats-io/nats.swift.git", from: "0.1")
    ],
    targets: [
        .target(name: "YourApp", dependencies: ["Nats"]),
    ]
)

Xcode 包依赖项

在 Xcode 中打开项目检查器,然后选择您的项目。 重要的是选择**项目**,而不是目标! 单击第三个选项卡 Package Dependencies,然后通过选择包列表末尾的小 + 符号来添加 git url https://github.com/nats-io/nats.swift.git

基本用法

这是一个快速入门示例,可以一览所有内容

import Nats

// create the client
let nats = NatsClientOptions().url(URL(string: "nats://:4222")!).build()

// connect to the server
try await nats.connect()

// subscribe to a subject
let subscription = try await nats.subscribe(subject: "events.>")

// publish a message
try await nats.publish("my event".data(using: .utf8)!, subject: "events.example")

// receive published messages
for await msg in subscriptions {
    print( "Received: \(String(data:msg.payload!, encoding: .utf8)!)")
}

连接到 NATS 服务器

第一步是建立与 NATS 服务器的连接。 此示例演示如何使用默认设置连接到 NATS 服务器,默认设置假定服务器在默认端口 (4222) 上本地运行。 您还可以通过指定其他选项来自定义您的连接

let nats = NatsClientOptions()
    .url(URL(string: "nats://:4222")!)
    .build()

try await nats.connect()

发布消息

建立与 NATS 服务器的连接后,下一步是发布消息。 将消息发布到主题允许任何已订阅的客户端异步接收这些消息。 此示例演示如何将简单的文本消息发布到特定主题。

let data = "message text".data(using: .utf8)!
try await nats.publish(data, subject: "foo.msg")

在更复杂的场景中,您可能希望以标头的形式在消息中包含其他元数据。 标头允许您将键值对与消息一起传递,为订阅者提供额外的上下文或指令。 此示例演示如何发布带有标头的消息

let data = "message text".data(using: .utf8)!

var headers = NatsHeaderMap()
headers.append(try! NatsHeaderName("X-Example"), NatsHeaderValue("example value"))

try await nats.publish(data, subject: "foo.msg.1", headers: headers)

订阅主题

在建立连接并将消息发布到 NATS 服务器之后,下一个关键步骤是订阅主题。 订阅使您的客户端能够侦听发布到特定主题的消息,从而促进异步通信模式。 此示例将指导您创建对主题的订阅,使您的应用程序能够处理接收到的传入消息。

let subscription = try await nats.subscribe(subject: "foo.>")

for try await msg in subscription {

    if msg.subject == "foo.done" {
        break
    }

    if let payload = msg.payload {
        print("received \(msg.subject): \(String(data: payload, encoding: .utf8) ?? "")")
    }

    if let headers = msg.headers {
        if let headerValue = headers.get(try! NatsHeaderName("X-Example")) {
            print("  header: X-Example: \(headerValue.description)")
        }
    }
}

请注意,主题 foo.> 使用特殊的通配符语法,允许订阅主题的层次结构。 有关更多详细信息,请参阅 NATS 文档中关于基于主题的消息传递

设置日志级别

默认日志级别为 .info。 您可以对其进行设置以查看更多或更少的详细消息。 可能的值为 .debug.info.error.critical

// TODO

事件

您还可以使用事件来监控您的应用程序何时连接、断开连接或遇到错误

let nats = NatsClientOptions()
    .url(URL(string: "nats://:4222")!)
    .build()

nats.on(.connected) { event in
    print("event: connected")
}

AppDelegate 或 SceneDelegate 集成

为了确保在您的 AppDelegate.swift 或 SceneDelegate.swift 中正确管理连接,请按如下方式集成 NatsClient 连接管理

func sceneDidBecomeActive(_ scene: UIScene) {
    Task {
        try await self.natsClient.resume()
    }
}

func sceneWillResignActive(_ scene: UIScene) {
    Task {
        try await self.natsClient.suspend()
    }
}

致谢

此库基于 https://github.com/aus-der-Technik/SwiftyNats 中的出色工作