RPC
远程过程调用 可以区别于IPC
A想要调用B服务器上的提供的函数/方法
单一 RPC 无法实现 push,即推送服务。
理由是,RPC 是client 调用 server获取数据,是一个完整的过程,实现不了server调用client。
解决方案:让client 既可以调用server上的RPC服务,反之client本身也成为一个RPC服务让Server来调用。
在RPC中,所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,必须附上这个ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <--> Call ID} 的对应表。两者的表不一定需要完全相同,但相同的函数对应的Call ID必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(比如服务端用C++,客户端用Java或者Python)。这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。这个过程叫序列化和反序列化。同理,从服务端返回的值也需要序列化反序列化的过程。
GRPC
github地址:https://github.com/grpc/
gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。不过,当前gRPC仅支持 Protobuf ,且不支持在浏览器中使用。
Swift 使用 GRPC
podfile,注意swift要加use_frameworks!
# Uncomment this line if you're using Swift
use_frameworks!
platform :ios, '9.0'
target 'GRPC proto' do
pod 'SwiftGRPC'
end
BoringSSL需要给终端挂代理才行
还要安装swift-protobuf(用来将proto文件解析为.swift文件)
地址:https://github.com/apple/swift-protobuf
建议使用homebrew安装
$ brew install swift-protobuf
安装后把protoc-gen-swift和protoc-gen-swiftgrpc两个文件放到PATH里
就可以直接$ protoc --swift_out=. my.proto 这样只使用了protoc-gen-swift生成了一个pb.swift文件
使用protoc --swift_out=. --swiftgrpc_out=Client=true,Server=false:. xxx.proto 这样还会多生成一个grpc.swift
然后把这两个文件引入到项目文件夹中
然后获取service 一般是ServiceClient结尾,然后创建请求,一般是Request结尾,然后service.XX(request)并获取结果
let _ = try! service.sayHello ( request ) { reply,result in
if let reply = reply {
print("RESPONSE: \(reply)")
}
print(result)
}