一.什么是GRPC?作用是什么?優(yōu)點在哪里?
定義:(Google Remote Procedure Call Protocol)谷歌遠程過程調(diào)用,根據(jù)官方文檔對grpc的介紹,grpc可以讓客戶端程序直接調(diào)用服務端不同主機上應用的方法,就像調(diào)用本地方法一樣,?方便我們創(chuàng)建分布式應用和服務
在 gRPC 里客戶端應用可以像調(diào)用本地對象一樣直接調(diào)用另一臺不同的機器上服務端應用的方法,使得您能夠更容易地創(chuàng)建分布式應用和服務。與許多 RPC 系統(tǒng)類似,gRPC 也是基于以下理念:定義一個服務,指定其能夠被遠程調(diào)用的方法(包含參數(shù)和返回類型)。在服務端實現(xiàn)這個接口,并運行一個 gRPC 服務器來處理客戶端調(diào)用。在客戶端擁有一個存根能夠像服務端一樣的方法。
gRPC 客戶端和服務端可以在多種環(huán)境中運行和交互 - 從 google 內(nèi)部的服務器到你自己的筆記本,并且可以用任何 gRPC 支持的語言來編寫。所以,你可以很容易地用 Java 創(chuàng)建一個 gRPC 服務端,用 Go、Python、Ruby 來創(chuàng)建客戶端。此外,Google 最新 API 將有 gRPC 版本的接口,使你很容易地將 Google 的功能集成到你的應用里。
gRPC 默認使用 protocol buffers,這是 Google 開源的一套成熟的結(jié)構數(shù)據(jù)序列化機制(當然也可以使用其他數(shù)據(jù)格式如 JSON)。正如你將在下方例子里所看到的,你用 proto files 創(chuàng)建 gRPC 服務,用 protocol buffers 消息類型來定義方法參數(shù)和返回類型。
總結(jié):gRPC是一個高性能、通用的開源RPC框架,其由Google主要面向移動應用開發(fā)并基于HTTP/2協(xié)議標準而設計,基于ProtoBuf(Protocol Buffers)序列化協(xié)議開發(fā),且支持眾多開發(fā)語言。gRPC提供了一種簡單的方法來精確地定義服務和為iOS、Android和后臺支持服務自動生成可靠性很強的客戶端功能庫??蛻舳顺浞掷酶呒壛骱玩溄庸δ埽瑥亩兄诠?jié)省帶寬、降低的TCP鏈接次數(shù)、節(jié)省CPU使用、和電池壽命。
基于HTTP/2標準設計
由于gRPC基于HTTP/2標準設計,所以相對于其他RPC框架,gRPC帶來了更多強大功能,如雙向流、頭部壓縮、多復用請求等。這些功能給移動設備帶來重大益處,如節(jié)省帶寬、降低TCP鏈接次數(shù)、節(jié)省CPU使用和延長電池壽命等。同時,gRPC還能夠提高了云端服務和Web應用的性能。gRPC既能夠在客戶端應用,也能夠在服務器端應用,從而以透明的方式實現(xiàn)客戶端和服務器端的通信和簡化通信系統(tǒng)的構建。
gRPC已經(jīng)應用在Google的云服務和對外提供的API中,其主要應用場景如下:
低延遲、高擴展性、分布式的系統(tǒng);同云服務器進行通信的移動應用客戶端;設計語言獨立、高效、精確的新協(xié)議;便于各方面擴展的分層設計,如認證、負載均衡、日志記錄、監(jiān)控等
使用GRPC幾大核心步驟
(1)Defining a service ?定義服務(在.proto文件中這個是和后臺交互的主要協(xié)議)
(2)Generating grpc code ?生成grpc代碼
(3)writing a server ? 編寫服務主要是服務端需要編寫一定的服務提供給客戶端使用(類似接口)
(4)server implementation ?服務的實現(xiàn)
? (5)? writing a client ? ? 編寫客戶端代碼(集成grpc)
? (6)calling an rpc ? ?根據(jù)遠程調(diào)用協(xié)議(.proto文件約定的協(xié)議)進行代碼(接口)調(diào)用
優(yōu)點:客戶端充分利用高級流和鏈接功能,從而有助于節(jié)省帶寬、降低的TCP鏈接次數(shù)、節(jié)省CPU使用、和電池壽命。
二.如何集成?
①GRPC環(huán)境搭建:
1.Install protoc with the gRPC plugin(使用GRPC插件安裝protoc)
安裝homebrew (該命令會安裝protoc和gRPC插件)
curl -fsSL https://goo.gl/getgrpc | bash -
2.安裝Cocoapods
如何安裝cocoapods詳細參見本博客cocoaPods安裝
3.為proto文件創(chuàng)建一個 文件名.podspec文件(主要是通過這個文件來關聯(lián)定義的proto協(xié)議文件并且通過cocoapods編譯生成grpc依賴庫)
Pod::Spec.new do |s|? ? s.name? ? = ''
s.version? = '0.0.1'
s.license? = '...'
s.ios.deployment_target = '7.1'
s.osx.deployment_target = '10.9'
# Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients.
# You can run this command manually if you later change your protos and need to regenerate.
s.prepare_command = "protoc --objc_out=. --objcgrpc_out=. *.proto"
# The --objc_out plugin generates a pair of .pbobjc.h/.pbobjc.m files for each .proto file.
s.subspec "Messages" do |ms|
ms.source_files = "*.pbobjc.{h,m}"
ms.header_mappings_dir = "."
ms.requires_arc = false
ms.dependency "Protobuf", "~> 3.0.0-alpha-4"
end
# The --objcgrpc_out plugin generates a pair of .pbrpc.h/.pbrpc.m files for each .proto file with
# a service defined.
s.subspec "Services" do |ss|
ss.source_files = "*.pbrpc.{h,m}"
ss.header_mappings_dir = "."
ss.requires_arc = true
ss.dependency "gRPC", "~> 0.12"
ss.dependency "#{s.name}/Messages"
end
end
注意:該文件必須要名為.podspec
4.創(chuàng)建好podspec后,Cocopods可以將它安裝到你的項目中
pod init
5.在Podfile中添加:
pod '<Podspec file name>', :path => 'path/to/the/directory/of/your/podspec'
6.最后通過腳本編譯生成代碼到你的項目里
pod install
這時cocoapods通過編譯Profile文件找到(文件名).podspec文件,編譯生成一些客戶端調(diào)用服務端的代碼依賴庫
注:如果出現(xiàn)protoc-gen-objcgrpc: program not found or is not executable
要將podspec文件中
protoc -I #{src} --objc_out=#{dir} --objcgrpc_out=#{dir} #{src}/(相關的).proto
修改為
protoc -I #{src} --objc_out=#{dir} --grpc_out=#{dir} --plugin=protoc-gen-grpc=/usr/local/bin/grpc_objective_c_plugin #{src}/(相關的).proto
參考文檔:gRPC官方中文文檔? ? ??gRPC官方英文文檔? ?gRPC OC版demo
接下來既可以根據(jù)在客戶端生成的代碼依賴庫來調(diào)用服務端的協(xié)議接口獲取你所需要的數(shù)據(jù)