gRPC for Swift (iOS/macOS):库和示例
gRPC 是一个由 Google 开发的高性能远程过程调用 (RPC) 框架。它使用 Protocol Buffers (protobuf) 进行数据序列化,并使用 HTTP/2 进行传输。对于 Apple 平台(iOS、macOS),存在一个官方的 Swift gRPC 生态系统,它允许创建客户端和服务器应用程序,并完全支持 Swift 的现代特性,包括 async/await。
主要库和工具
在 Swift 中使用 gRPC 需要以下组件:
- gRPC-Swift — Google 的官方包。包括运行时、代码生成器以及对客户端-服务器交互的支持。
- Swift Protobuf — 用于处理 protobuf 消息的库。需要从 .proto 文件生成 Swift 结构。
- protoc — Protocol Buffers 编译器。要生成 Swift 代码,需要
protoc-gen-grpc-swift和protoc-gen-swift插件。 - Swift Package Manager (SPM) — 集成依赖项的主要方式。
安装和配置
首先,将依赖项添加到 Package.swift:
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "GRPCExample", dependencies: [ .package(url: "https://github.com/grpc/grpc-swift.git", from: "1.21.0"), .package(url: "https://github.com/apple/swift-protobuf.git", from: "1.26.0") ], targets: [ .executableTarget( name: "GRPCExample", dependencies: [ .product(name: "GRPC", package: "grpc-swift"), .product(name: "SwiftProtobuf", package: "swift-protobuf") ] ) ])还需要通过 Homebrew 安装 protoc 和插件:
brew install protobufbrew install grpc-swiftbrew install swift-protobuf.proto 文件示例
创建一个简单的问候服务。文件 hello.proto:
syntax = "proto3";
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}使用以下命令生成 Swift 代码:
protoc --swift_out=. --grpc-swift_out=. hello.proto结果将生成 hello.pb.swift 和 hello.grpc.swift 文件。
Swift 服务器端
创建一个处理 SayHello 请求的 gRPC 服务器:
import GRPCimport NIOimport NIOPosix
class GreeterProvider: GreeterProvider { func sayHello(request: HelloRequest, context: StatusOnlyCallContext) -> EventLoopFuture<HelloReply> { var reply = HelloReply() reply.message = "你好,\\(request.name)!" return context.eventLoop.makeSucceededFuture(reply) }}
let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)defer { try! group.syncShutdownGracefully() }
let server = try Server.insecure(group: group) .withServiceProviders([GreeterProvider()]) .bind(host: "localhost", port: 50051) .wait()
print("服务器已启动在 localhost:50051")try server.onClose.wait()Swift 客户端(使用 async/await)
对于 iOS/macOS 客户端,使用 async/await 实现很方便。请确保使用 Swift 5.5+ 以及最低部署目标 iOS 13.0 / macOS 10.15。
import GRPCimport NIOimport NIOPosiximport SwiftProtobuf
func greet(name: String) async throws -> String { let group = PlatformSupport.makeEventLoopGroup(loopCount: 1) defer { try? group.syncShutdownGracefully() }\