Swift gRPC
此存储库包含一个实验性的Swift gRPC API和代码生成器。
它适用于与Apple的swift-protobuf对Protocol Buffers的支持。两个项目都包含代码生成插件,用于Google的Protocol Buffer编译器 protoc,并且两个项目中都包含生成代码所需的库。
提供适用于gRPC客户端和服务的API和生成代码,并且可以使用Xcode或Swift Package Manager进行构建。支持四种gRPC API样式(单向、服务器流、客户端流和双向流)以及可以使用安全(TLS)或不安全通道进行连接。
Echo示例全面展示了目前支持的功能。
Swift Package Manager的构建也可以在Linux系统上执行。有关详情,请参阅DOCKER.md和LINUX.md。
CocoaPods集成
Swift gRPC现在可从CocoaPods获取。要集成,请将以下行添加到您的Podfile
中
pod 'SwiftGRPC'
然后,从命令行运行pod install
并使用您的项目生成的.xcworkspace
文件。
手动集成
如果没有使用CocoaPods,Swift gRPC 在Swift包管理器构建过程中会自动包含对gRPC Core库和BoringSSL(gRPC Core使用的OpenSSL分支)的引包版本。这些版本是在Swift包管理器构建过程中自动构建的。
在构建项目之后,将生成的SwiftGRPC.xcodeproj
添加到您的项目中,并添加对BoringSSL、CgRPC和SwiftGRPC的构建依赖。
请注意,您的项目还需要包含来自Swift Protobuf的SwiftProtobuf.xcodeproj
以及您用protoc
/插件生成的源文件。
请参阅Echo以获取一个基于Xcode的工作示例,如果在使用过程中遇到任何问题,请不要犹豫,及时提交问题。
用法
使用Swift gRPC的推荐方式是首先使用Protocol Buffer语言定义API,然后使用Protocol Buffer Compiler和Swift Protobuf以及Swift gRPC插件生成必要的支持代码。
获取插件
Protocol Buffer Compiler(protoc)的二进制发布版可在GitHub上找到。
要构建插件,请在主目录中运行make plugin
。这将使用Swift包管理器构建两个必要的插件:生成Protocol Buffer支持代码的protoc-gen-swift
,以及生成gRPC接口代码的protoc-gen-swiftgrpc
。
要安装这些插件,只需将主目录中出现的两个可执行文件(protoc-gen-swift
和protoc-gen-swiftgrpc
)复制到您的PATH
环境变量所在的目录中。
使用插件
要使用插件,确保protoc
和两个插件都在您的搜索路径中(见上文)。使用以下类似命令调用它们:
protoc <your proto files> \
--swift_out=. \
--swiftgrpc_out=.
按照惯例,使用--swift_out
选项调用protoc-gen-swift
插件,使用--swiftgrpc_out
调用protoc-gen-swiftgrpc
插件。
参数
要将额外参数传递给插件,请使用以逗号分隔的参数列表,并用冒号与输出目录隔开。
标志 | 值 | 默认值 | 描述 |
---|---|---|---|
可见性 |
内部 /公共 |
内部 |
生成代码的ACL |
服务器 |
true /false |
true |
是否生成服务器代码 |
客户端 |
true /false |
true |
是否生成客户端代码 |
异步 |
true /false |
true |
是否生成异步代码 |
同步 |
true /false |
true |
是否生成同步代码 |
实现 |
true /false |
true |
是否生成协议和非测试服务代码。将此选项切换为 false 主要在结合 TestStubs=true 时有用,用于生成仅包含测试存根代码的文件 |
TestStubs |
true /false |
false |
是否生成测试存根代码 |
文件命名 |
FullName /PathToUnderscores /DropPath |
FullName |
如何处理生成源文件的命名 |
ExtraModuleImports |
字符串 |
`` | 要在生成代码中导入的额外模块。此参数可以多次包含以导入多个模块 |
示例
$ protoc <your proto> --swiftgrpc_out=Client=true,Server=false:.
构建你的项目
大多数 grpc-swift
开发是在 Swift Package Manager 中完成的。对于在 Xcode 项目中的使用,我们依靠 swift package generate-xcodeproj
命令来为 grpc-swift
核心库生成 Xcode 项目。
顶层 Makefile 使用 Swift Package Manager 为 SwiftGRPC 包生成 Xcode 项目
$ make && make project
这将会创建 SwiftGRPC.xcodeproj
,你应该将其添加到你的项目中,并设置上述提到的必要构建依赖项。
低级gRPC
虽然建议使用 Protocol Buffers 和生成代码来使用 gRPC,但 gRPC 本质上是一个强大的基于 HTTP/2 的通信系统,可以支持任意有效负载。因此,每个 gRPC 库都包括低级接口,可以用来直接使用无生成代码构建 API 客户端和服务器。在 Swift 中关于此的示例,请参考 Simple 示例。
已知问题
基于 gRPC-Core(而非SwiftNIO)实现的SwiftGRPC在iOS客户端上存在一些连接问题——即在切换Wi-Fi与蜂窝网络或在不同蜂窝技术(3G与LTE之间)之间时,会默默断开连接(使调用/连接看起来像是挂起)。这些问题的根本原因是支持的gRPC-Core无法在发生此类变化时获得iOS网络堆栈的优化,也无法自行处理这些变化。
在 此gRPC-Core的readme中也有关于此行为的文档。
为了解决这个问题,有一个 ClientNetworkMonitor
用于监控设备上的事件,这些事件可能导致gRPC默默断开连接。我们建议使用此组件来调用 shutdown()
(或销毁)任何活动的 Channel
实例,并在网络可访问时启动新实例。
在频道上设置 keepAliveTimeout
参数也是推荐的。
详细信息
- 在Wi-Fi与蜂窝网络之间切换:频道默默断开连接
- 在3G与LTE(等等)之间切换:频道默默断开连接
- 网络变得不可访问:大多数时候,频道在几秒钟后会超时,但
ClientNetworkMonitor
会更快地通知这些变化 - 在后台与前台之间切换:没有已知问题
原始的SwiftGRPC问题: https://github.com/grpc/grpc-swift/issues/337.
遇到构建问题吗?
grpc-swift依赖于Swift、Xcode和swift-protobuf。我们目前正在使用以下版本进行测试:
- Xcode 10.2
- Swift 4.2 / 5.0
- swift-protobuf 1.5.0
SwiftGRPCNIO
软件包
SwiftGRPCNIO
是在SwiftNIO
库之上的gRPC协议的干净室实现。由于缺少用于生产使用的几项推荐功能,因此该实现尚未准备好投入生产:
- 更好的测试覆盖率
- 完整的错误处理
- SSL支持
- 客户端支持
- 示例项目
- 支持iOS
- 从
SwiftNIOHTTP2
中移除对libnghttp2
的依赖
但是,如果您打算基于 SwiftNIO
或Vapor框架实现gRPC服务,则可能会发现此软件包很有用。此外,一旦准备就绪,此软件包应提供更可预测和可靠的行为,结合改进的API和更好的开发人员体验。
您还可以查看 此演示文稿 以获得更多关于此软件包动机的详细信息。
许可证
grpc-swift 使用与 gRPC 相同的许可证,详细说明见 LICENSE 文件。
贡献
请加入我们!查看我们关于贡献指南。
发布
发布新版本时,应遵循以下步骤:
-
运行 CocoaPods 检查器以确保没有新的警告/错误
$ pod spec lint SwiftGRPC.podspec
-
更新 Carthage Xcode 项目(需要将版本增量提交到仓库)
$ make project-carthage
-
在
SwiftGRPC.podspec
文件中增加版本号 -
合并这些更改,然后创建一个新的
Release
,并添加相应的Tag
。确保在信息中包含更改列表 -
将更新推送到 CocoaPods 规范仓库
$ pod trunk push