iOS RPC GRPC使用

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)
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自:http://blog.csdn.net/kesonyk/article/details/50924489 ...
    晴天哥_王志閱讀 25,345評(píng)論 2 38
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • Android消息機(jī)制探究 Looper Handler 之間有什么關(guān)系: 首先看一個(gè)handler的使用例子: ...
    埃賽爾閱讀 579評(píng)論 2 2
  • 第一場(chǎng)雪 梨花滿天飛似雪, 一時(shí)掩盡天下春。 第二場(chǎng)雪 此景更為吉祥兆, 至冬天公送瑞雪。 ——2007年于洛陽(yáng) ...
    明燈醫(yī)學(xué)閱讀 171評(píng)論 0 0
  • 所有QQ可用@該QQ代替 所有指令自定義,多條指令用|間隔,如踢人指令:T|踢|去死 以下為全局管理可用指令: 啟...
    老王_e31a閱讀 222評(píng)論 0 0

友情鏈接更多精彩內(nèi)容