viSwiftGRPC 0.9.1

viSwiftGRPC 0.9.1

vudang维护。



 
依赖
gRPC-Core~> 1.21.0
SwiftProtobuf~> 1.5.0
 

  • gRPC贡献者

Build Status

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.mdLINUX.md

CocoaPods集成

Swift gRPC现在可从CocoaPods获取。要集成,请将以下行添加到您的Podfile

pod 'SwiftGRPC'

然后,从命令行运行pod install并使用您的项目生成的.xcworkspace文件。

手动集成

如果没有使用CocoaPods,Swift gRPC 在Swift包管理器构建过程中会自动包含对gRPC Core库和BoringSSL(gRPC Core使用的OpenSSL分支)的引包版本。这些版本是在Swift包管理器构建过程中自动构建的。

构建项目之后,将生成的SwiftGRPC.xcodeproj添加到您的项目中,并添加对BoringSSLCgRPCSwiftGRPC的构建依赖。

请注意,您的项目还需要包含来自Swift ProtobufSwiftProtobuf.xcodeproj以及您用protoc/插件生成的源文件。

请参阅Echo以获取一个基于Xcode的工作示例,如果在使用过程中遇到任何问题,请不要犹豫,及时提交问题。

用法

使用Swift gRPC的推荐方式是首先使用Protocol Buffer语言定义API,然后使用Protocol Buffer CompilerSwift Protobuf以及Swift gRPC插件生成必要的支持代码。

获取插件

Protocol Buffer Compiler(protoc)的二进制发布版可在GitHub上找到。

要构建插件,请在主目录中运行make plugin。这将使用Swift包管理器构建两个必要的插件:生成Protocol Buffer支持代码的protoc-gen-swift,以及生成gRPC接口代码的protoc-gen-swiftgrpc

要安装这些插件,只需将主目录中出现的两个可执行文件(protoc-gen-swiftprotoc-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 文件。

贡献

请加入我们!查看我们关于贡献指南

发布

发布新版本时,应遵循以下步骤:

  1. 运行 CocoaPods 检查器以确保没有新的警告/错误

    $ pod spec lint SwiftGRPC.podspec

  2. 更新 Carthage Xcode 项目(需要将版本增量提交到仓库)

    $ make project-carthage

  3. SwiftGRPC.podspec 文件中增加版本号

  4. 合并这些更改,然后创建一个新的 Release,并添加相应的 Tag。确保在信息中包含更改列表

  5. 将更新推送到 CocoaPods 规范仓库

    $ pod trunk push