簡介
gRPC,google的遠程過程調用框架,傳輸協議使用 HTTP2, 序列化協議使用 protobuf。
gRPC 使用 HTTP2 傳輸協議傳輸 protobuf 序列化的二進制數據,有極高的效率、極低的資源占用率。
github倉庫地址:https://github.com/grpc/grpc,該倉庫包含在共享C核心庫src / core之上編寫的多種語言(C++, Python, Ruby, Objective-C, PHP, C#)實現的gRPC庫的源代碼。
gRPC的一些特性:
- 簡單的服務定義
- 跨語言和平台工作
- 快速啟動並擴展
- 雙向流媒體以及身份驗證集成
使用GRPC幾大核心步驟
1)Defining a service 定義服務(在.proto文件中這個是和后台交互的主要協議)
2)Generating grpc code 生成grpc代碼
3)Writing a server 服務端編寫一定的服務提供給客戶端使用(類似接口)
4)Server implementation 服務的實現
5)Writing a client 編寫客戶端代碼(集成grpc)
6)Calling an rpc 根據RPC協議(.proto文件約定的協議)進行代碼(接口)調用
優點:客戶端充分利用高級流和鏈接功能,從而有助於節省帶寬、降低的TCP鏈接次數、節省CPU使用、和電池壽命。
Objective-C Quick Start
系統需求
- 最小iOS版本為7.0,即iOS version >=7.0
- OS X 10.11及以上,即OS X 10.11 >= 10.11
前提條件
1、CocoaPods >= 1.0 檢查Cocoapods版本:pod –version
$ sudo gem install cocoapods
$ pod setup
PS:CocoaPods是iOS開發、macOS開發中的包依賴管理工具,效果如Java中的Maven,nodejs的npm。
2、Xcode >=7.2
3、Homebrew
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
PS:Homebrew是一款自由及開放源代碼的軟件包管理系統,用以簡化macOS系統上的軟件安裝過程
4、autoconf, automake, libtool, pkg-config
$ brew install autoconf automake libtool pkg-config
安裝gRPC插件以及二進制庫文件
從https://github.com/grpc/grpc下載gRPC源碼,解壓后進入grpc目錄:
$ make
遇到錯誤:報錯很簡單,提示系統缺少cares包
從https://github.com/c-ares/c-ares下載cares包后,解壓放在/grpc/third_party/cares/cares目錄下,重新make,又報錯了~,提示缺少OpenSSL,我勒個去,安裝一個缺一個,何時是個頭啊!grpc的third_party中只是給出了庫的倉庫地址,但是實際編譯時需要的時third_party的全部源碼文件。
有效解決方法:Git源碼編譯(需要網絡良好):
$ git clone --recursive -b v1.23.0 https://github.com/grpc/grpc.git
$ cd grpc
$ git submodule update --init
$ make
$ [sudo] make install
完成后會把gRPC的頭文件安裝在/usr/local/include,在程序中可直接包含使用,鏈接庫則安裝在/usr/local/lib中,供程序編譯成功后鏈接使用。
安裝protoc編譯器
$ brew tap grpc/grpc
$ brew install protobuf
運行Server
對於此示例應用程序,我們需要在本地計算機上運行的gRPC服務器。gRPC Objective-C API支持創建gRPC客戶端,但不支持創建gRPC服務器。因此,我們在同一個存儲庫中構建並運行C ++服務器:
$ cd examples/cpp/helloworld
$ make
$ ./greeter_server &
C++服務端進程greeter_server運行起來了~
運行Client
1)生成客戶端庫和依賴項
$ cd ../../objective-c/helloworld
$ pod install
2)運行客戶端app
$ open HelloWorld.xcworkspace
這將使用Xcode打開應用程序項目。通過按Xcode窗口左上角的“運行”按鈕,在iOS模擬器中運行應用程序。你可以檢查main.m中的調用代碼,並在Xcode的控制台中查看結果。代碼將包含字符串“Objective-C”的HLWHelloRequest發送到本地服務器。服務器響應HLWHelloResponse,其中包含一個字符串“Hello Objective-C”,然后輸出到控制台。
恭喜!您剛剛使用gRPC成功運行了iOS模擬器客戶端-C++服務器應用程序。
iOS真機測試
插入iphone,Xcode識別iphone,並選擇為當前設備,配置工程簽名信息,構建運行即可!
由於我的Mac OS是在實體機的虛擬機中運行,而實體機使用的是有線光纖網絡,和iphone手機所使用的無線網絡不在同一個局域網內,所以無法網絡聯通。
我的筆記本(Windows7 x64)使用的是無線網絡,ip地址192.168.2.15,iphone手機ip地址192.168.2.231,是在同一個無線局域網內,可以在筆記本192.168.2.15上運行該gRPC C++ HelloWorld Server程序,但是需要Windows版本的gRPC程序,編譯Windows版本的gRPC並使用其HelloWorld Demo程序可參考文章《grpc1.18.0 c++ windows visual studio 2017(vs2017)版本編譯(入門)》以及《grpc1.18.0 c++ windows visual studio 2017(vs2017)版本Helloworld示例與解析》。
我這里直接展示最終的結果:
1) gRPC C++ HelloWorld Server
注意:由於該服務端程序是使用VS2017 x64編譯出來的,運行時需要zlib.dll以及VS2017的一些運行時庫,所以需要安裝VS2017才能確保運行(只安裝C++開發部分組件即可)。
一點小知識:服務器端的監聽地址為"0.0.0.0:50051",0.0.0.0在服務器端它表示本機上的所有IPV4地址,如果一個服務有多個IP地址(192.168.1.2和10.1.1.12),那么我們如果設置的監聽地址是0.0.0.0那么我們無論是通過IP192.168.1.2還是10.1.1.12都是可以訪問該服務的。
2) gRPC Object-C HelloWorld Client
在Xcode中將連接的服務器地址由@"localhost.15:50051"修改為@"192.168.2.15:50051",之后選擇所連接的iOS真機,運行!
測試所使用的iOS真機,借來用的:
恭喜!您剛剛使用gRPC成功運行了iOS真機客戶端-C++服務器應用程序。
參考