RPC
遠(yuǎn)程過(guò)程調(diào)用 可以區(qū)別于IPC
A想要調(diào)用B服務(wù)器上的提供的函數(shù)/方法
單一 RPC 無(wú)法實(shí)現(xiàn) push,即推送服務(wù)。
理由是,RPC 是client 調(diào)用 server獲取數(shù)據(jù),是一個(gè)完整的過(guò)程,實(shí)現(xiàn)不了server調(diào)用client。
解決方案:讓client 既可以調(diào)用server上的RPC服務(wù),反之client本身也成為一個(gè)RPC服務(wù)讓Server來(lái)調(diào)用。
在RPC中,所有的函數(shù)都必須有自己的一個(gè)ID。這個(gè)ID在所有進(jìn)程中都是唯一確定的??蛻舳嗽谧鲞h(yuǎn)程過(guò)程調(diào)用時(shí),必須附上這個(gè)ID。然后我們還需要在客戶端和服務(wù)端分別維護(hù)一個(gè) {函數(shù) <--> Call ID} 的對(duì)應(yīng)表。兩者的表不一定需要完全相同,但相同的函數(shù)對(duì)應(yīng)的Call ID必須相同。當(dāng)客戶端需要進(jìn)行遠(yuǎn)程調(diào)用時(shí),它就查一下這個(gè)表,找出相應(yīng)的Call ID,然后把它傳給服務(wù)端,服務(wù)端也通過(guò)查表,來(lái)確定客戶端需要調(diào)用的函數(shù),然后執(zhí)行相應(yīng)函數(shù)的代碼。
在遠(yuǎn)程過(guò)程調(diào)用時(shí),客戶端跟服務(wù)端是不同的進(jìn)程,不能通過(guò)內(nèi)存來(lái)傳遞參數(shù)。甚至有時(shí)候客戶端和服務(wù)端使用的都不是同一種語(yǔ)言(比如服務(wù)端用C++,客戶端用Java或者Python)。這時(shí)候就需要客戶端把參數(shù)先轉(zhuǎn)成一個(gè)字節(jié)流,傳給服務(wù)端后,再把字節(jié)流轉(zhuǎn)成自己能讀取的格式。這個(gè)過(guò)程叫序列化和反序列化。同理,從服務(wù)端返回的值也需要序列化反序列化的過(guò)程。
GRPC
github地址:https://github.com/grpc/
gRPC使用ProtoBuf來(lái)定義服務(wù),ProtoBuf是由Google開(kāi)發(fā)的一種數(shù)據(jù)序列化協(xié)議(類似于XML、JSON、hessian)。ProtoBuf能夠?qū)?shù)據(jù)進(jìn)行序列化,并廣泛應(yīng)用在數(shù)據(jù)存儲(chǔ)、通信協(xié)議等方面。不過(guò),當(dāng)前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(用來(lái)將proto文件解析為.swift文件)
地址:https://github.com/apple/swift-protobuf
建議使用homebrew安裝
$ brew install swift-protobuf
安裝后把protoc-gen-swift和protoc-gen-swiftgrpc兩個(gè)文件放到PATH里
就可以直接$ protoc --swift_out=. my.proto 這樣只使用了protoc-gen-swift生成了一個(gè)pb.swift文件
使用protoc --swift_out=. --swiftgrpc_out=Client=true,Server=false:. xxx.proto 這樣還會(huì)多生成一個(gè)grpc.swift
然后把這兩個(gè)文件引入到項(xiàng)目文件夾中
然后獲取service 一般是ServiceClient結(jié)尾,然后創(chuàng)建請(qǐng)求,一般是Request結(jié)尾,然后service.XX(request)并獲取結(jié)果
let _ = try! service.sayHello ( request ) { reply,result in
if let reply = reply {
print("RESPONSE: \(reply)")
}
print(result)
}