A. 用thrift 或 gRPC 之類的框架做 app 和伺服器的通信合適嗎
完全可以的。
thrift是Facebook開源出來的項目,現在交給了Apache來管理。thrift是用來針對不同語言系統之間數據調用的。thrift支持c,c++,Erlang,java,python,ruby,php等語言。thrift允許定義一個簡單的定義文件中的數據類型和服務介面,這個文件就是IDL(Interface Definition Language),以作為輸入文件,編譯器生成代碼。簡單的說就是thrift定義了統一的文件(對象或者結構體,服務介面),使用thrift的編譯器能夠生成對應語言的代碼文件。thrft之所以是跨語言的原意就是他通過語言無關的自定義語言來生成語言相關的代碼。
B. android集成Grpc,使用grpc進行數據交互網路通信
集成
1、首先在project的gradle文件中的dependencies里進行如下配置
2、在app的gradle文件中操作
在最頂部添加
添加protobuf編譯器
添加grpc的相關引用
ok好了至此已經集成完畢了,接下來就是使用了
proto生成Java文件
(1) 把自己的proto文件復制粘貼到main/proto目錄下,點擊Android Studio中的Build菜單下的Rebuild Project即可
(2) Java文件生成位置:app/build/generated/source/proto/……
(3) 將Java文件復制出來即可使用
C. 在Ubuntu的環境下怎麼交叉編譯grpc到cortex-a9架構
1、 解壓工具鏈壓縮包
$ cd ~
$ mkdir toolchain
$ cd toolchain
gcc-4.6.4.tar.xz拷貝到toolchain目錄下並解壓
$ tar xvf gcc-4.6.4.tar.xz
2、 環境變數的添加
修改文件/etc/bash.bashrc添加如下內容
export PATH=$PATH:/home/linux/toolchain/gcc-4.6.4/bin
重啟配置文件
$ source /etc/bash.bashrc
D. gRPC入坑記
概要
由於gRPC主要是谷歌開發的,由於一些已知的原因,gRPC跑demo還是不那麼順利的。單獨寫這一篇,主要是gRPC安裝過程中的坑太多了,記錄下來讓大家少走彎路。
主要的坑:
本文講解gRPC demo的同時,會介紹如何解決這些坑。本文對應的Github地址:https://github.com/52fhy/grpc-sample 。該倉庫存儲了demo示例,以及部分系統編譯好的二進制包,大家覺得有些步驟里耗時實在太長了,可以直接clone該倉庫,復制二進制包到對應目錄(僅限測試開發,生產環境還是老老實實自己編譯吧)。
升級GCC
gRPC命令行工具編譯需要使用 GCC4.8及以上版本。CentOS6系列的內置版本是GCC4.7。
如果你的系統GCC版本>=4.8,可以忽略本節。如果僅使用golang、java,請忽略本節。
如果需要升級gcc至4.8或更高版本,建議直接採用安裝SCL源之後安裝devtoolset-6(devtoolset-6目前gcc版本為6.3),因為devtoolset-4及之前的版本都已經結束支持,只能通過其他方法安裝。
升級到gcc 6.3:
需要注意的是scl命令啟用只是 臨時 的,退出shell或重啟就會恢復原系統gcc版本。如果要長期使用gcc 6.3的話:
這樣退出shell重新打開就是新版的gcc了。其它版本同理。
升級到gcc 7.3:
已經停止支持的devtoolset4(gcc 5.2)及之前版本的安裝方法,可能比較慢,大家感興趣的話可以嘗試。
編譯gRPC命令行工具
gRPC分C、JAVA、GO、NodeJS版本,C版本包括C++, Python, Ruby, Objective-C, PHP, C#,這些語言都是基於C版本開發的,共用代碼庫一個代碼庫。
如果使用C版本的gRPC,最終要從源碼里編譯出下列工具:
這些工具作為插件供proto編譯器使用。需要先下載 grpc/grpc github上的源碼。
這里有2個坑:
1、grpc/grpc倉庫比較大,鑒於國內訪問的網速,建議使用國內鏡像。碼雲(https://gitee.com)提供了同步更新的鏡像地址:
這樣下載速度提高了不少。
2、git submole update這個命令實際就是在下載.gitmoles文件里定義的第三方依賴項到third_party目錄,這個依賴項有很多,大家可以打開.gitmoles文件查看下詳情。依賴的倉庫都在github上,下載沒幾個小時是下載不下來的,就等著慢慢下載吧。
回頭想想,我們花費了很多時間,結果只是為了得到grpc的proto編譯插件。
PHP相關支持
PHP暫時不支持作為grpc的服務端。作為客戶端是可以的,需要機器安裝:
其中protoc和protobuf c擴展已經在 Protobuf 小試牛刀 介紹過了,這里不再贅述。上一小節里如果安裝成功,那麼grpc_php_plugin也是有了的。下面介紹如何安裝PHP版的gRPC庫。
安裝grpc c擴展:
要求:GCC編譯器需要4.8及以上版本。可以使用pecl安裝:
也可以指定版本:
或者下載源碼(http://pecl.php.net/package/grpc)安裝:
grpc/grpc代碼庫里也有PHP擴展的C源碼,在grpc/src/php/ext/grpc目錄,進去也可以直接編譯。
編譯完成後在php.ini里添加,使用php --ri grpc可以查看信息。
安裝完C擴展後,還需要使用composer安裝grpc的庫:
gRPC示例
編寫gRPC proto
一共定義了三個文件:
其中 User 作為 Model定義,Response 用於 RPC統一返回定義,GreeterService 則是服務介面定義。
限於篇幅,proto文件詳見 https://github.com/52fhy/grpc-sample 倉庫的proto目錄。
GreeterService.proto文件內容如下:
這裡面定義了一個service,相當於定義了一個服務介面,我們把方法名、參數定義好了,後面需要去實現它。由於gRPC不支持PHP作為服務端,這里我們使用Golang作為服務端。
首先需要使用proto工具編譯出golang的代碼:
執行成功,會在 Pb_Go目錄里生成Go代碼:
如果需要生成PHP客戶端的代碼,則需要使用grpc php的命令行工具grpc_php_plugin,前面小結如果執行成功,這個工具已經有了。然後:
最終生成的文件:
注意:編譯那裡如果我們不加--grpc_out=../$out --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin,生成的PHP類是沒有GreeterClient的。這個文件是gRPC編譯工具自動生成的,用於連接gRPC服務端。
go編寫服務
我們用Golang寫服務端。上面雖然生成了Golang的部分代碼,但真正的服務還沒有寫呢。
main.go
首先我們新建個main.go,代碼不多,我直接貼出來:
然後就可以編譯了。
有個大坑:go build main.go的時候會先下載go.mod里定義的依賴(依賴比較多,詳情查看:https://github.com/52fhy/grpc-sample/blob/master/go.mod),其中下面這條非常慢,倉庫太大了,雖然重定向到github:
為了快速下載,我在碼雲上做了鏡像,地址:gitee.com/52fhy/google-api-go-client 。改了之後下載快多了。
編譯成功後,生成了二進制文件main。我們可以直接運行:
go test
為了測試我們寫的服務是否正常,可以寫測試用例:
test_client.go
運行:
運行有點慢,感覺依賴的庫多了。
php客戶端
使用gRPC PHP客戶端,確保你已經安裝了:
示例:
client_test.php
運行後輸出:
常見問題
1、CentOS6使用 go mod獲取第三方依賴包unknown revision xxx錯誤
解決:其實go mod調用鏈中會用到一些git指令,當git版本比較舊時,調用失敗產生錯誤,並給出歧義的提示信息。方法就是升級git版本,CentOS6自帶的git是1.7版本。升級完畢後,再嘗試go mod。
快速升級方法:
centos6:
2、PHP報錯:Fatal error: Class ' not found
解決:請安裝PHP的protobuf c擴展。
3、PHP報錯:Fatal error: Class 'GrpcBaseStub' not found
解決:使用composer require grpc/grpc安裝grpc。另外對應的grpc C擴展也要安裝。
4、下載 github release包很慢怎麼辦?
解決:下載Mac版 Free Download Manager 下載工具可以解決Github 下載緩慢或失敗問題。速度嗖嗖的。
參考
1、為CentOS 6、7升級gcc至4.8、4.9、5.2、6.3、7.3等高版本
http://www.vpser.net/manage/centos-6-upgrade-gcc.html
2、centos 6.x/7.x使用yum升級git版本 - 夜空
https://blog.slogra.com/post-721.html
3、Protobuf 小試牛刀 - 飛鴻影
https://www.cnblogs.com/52fhy/p/11106670.html
(本文完)
E. 用thrift 或 gRPC 之類的框架做 app 和伺服器的通信合適嗎
完全可以的。
thrift是Facebook開源出來的項目,現在交給了Apache來管理。thrift是用來針對不同語言系統之間數據調用的。thrift支持c,c++,Erlang,java,python,ruby,php等語言。thrift允許定義一個簡單的定義文件中的數據類型和服務介面,這個文件就是IDL(Interface Definition Language),以作為輸入文件,編譯器生成代碼。簡單的說就是thrift定義了統一的文件(對象或者結構體,服務介面),使用thrift的編譯器能夠生成對應語言的代碼文件。thrft之所以是跨語言的原意就是他通過語言無關的自定義語言來生成語言相關的代碼。
F. electron(electron-vue)環境下配置gRPC
1.package.json添加以下依賴
2.安裝依賴
3.編譯gRPC
G. docker構建與運行grpc-gateway項目
趁著實習摸魚(啊不是)之際,簡單學習一下曾經很想入門的 docker 。
在上一篇有關 DevOps 的博客中,曾提到:docker 容器的出現,推動了 DevOps 的發展。而 docker 的功勞不僅如此,它的出現可以說是:具有劃時代的意義。
很早之前,我就想學習 docker 。但,那時 docker 還未完全支持 Windows 平台,奈何電腦又太差,不敢給 Linux 虛擬機分配太高配置,導致 docker 學習一直被擱置。
如今,docker 已經推出了完美的 Windows 桌面版,而公司電腦配置也完全足夠。天時地利人和,此時不學,更待何時。
同時,作為實踐,我將用 docker 構建和運行 grpc-gateway 項目。
環境如下:
常用的命令示例:
docker 中很多命令是有相同效果的,比如: docker images == docker image ls 、 docker rmi == docker image rm 、 docker ps -a == docker container ls -a 等,可自行嘗試。
Dockerfile 用於構建鏡像。鏡像既可以通過容器 commit 構建,也可以通過 Dockerfile 構建,但更推薦後者(前者黑盒)。
Dockerfile 常用命令如下:
Dockerfile 編寫指南: 一般性的指南和建議
項目地址: https://gitee.com/dounineli/grpcDemo.git
Dockerfile 如下:
利用 Dockerfile 的多階段構建,減少鏡像體積(編譯型語言,運行環境不需要復雜的編譯環境)。
總共分為三個階段:
生成鏡像時,我們只需構建 server 和 gateway 兩個運行階段即可,兩個階段依賴的 builder 階段鏡像會自動構建,並在構建完成後自動刪除。分別得到 grpc 服務端和 grpc-gateway 網關鏡像:
由於 grpc-gateway 網關需要訪問 grpc 服務端,因此:
用 postman 進行介面測試:
不得不說,docker 的出現,讓很多事情變得輕而易舉。舉一個很簡單的例子:如果你想在電腦上安裝 MySQL ,直接運行 docker 的 MySQL 鏡像即可,幾行命令搞定,再也不用麻煩地配置環境了。
H. Centos6.8編譯grpc總結
由於歷史遺留問題,需要在Centos6.8這個過時的系統版本上編譯grpc,總結一下幾個遇到的問題。
來源於 Install SkyWalking PHP Agent
然後參考 https://gcc.gnu.org/wiki/InstallingGCC ,安裝:
並且,stdlibc++的版本也不夠新,那麼在objdir目錄下,安裝:
然後export一下環境變數:
原因是bintuils版本過低,一樣編譯安裝一個更加新的。
只要在cmake之前加上下面的環境變數即可
I. 在windows環境下 編譯pb (protobuf) 文件
protoc --plugin=protoc-gen-go.exe --go_out= . xx.proto
protoc --plugin=protoc-gen-go.exe --go-grpc_out= . xx.proto
若提示: --go-grpc_out: protoc-gen-go-grpc: 系統找不到指定的文件。
需在 grpc-go-1.31.0\cmd\protoc-gen-go-grpc 進行編譯, go build即可。 把生成的protoc-gen-go-grpc.exe放到你的 GOPATH/bin 目錄下
J. 對GRPC的通用封裝
通過封裝將grpc的技術使用難度降低到普通Java程序的開發。
cn.com.yd.commons.grpc提供了4種形式的服務介面定義以適應不同的應用場景。
cn.com.yd.commons.grpc將請求參數和響應參數定義為bytes以統一因業務不同而導致的差異性;使用cglib進行動態代理,在grpc的方法中執行具體的業務處理。
在具體應用中應將此工程使用Maven打包後作為依賴引入目標工程中。
JDK:1.8
GRPC:1.6.1
Protobuf:3.3.0
cglib:3.2.5
IDE:開發工具IDEA
IDEA自帶插件支持grpc開發,所以開發工具選擇IDEA。在正式開始之前需要先安裝Protobuf Support插件。
依次點擊Intellij中的「File」-->"Settings"-->"Plugins"-->"Browse repositories",如圖
輸入Protobuf,如下所示
在main目錄下新建一個名為proto的文件夾,請確保文件夾的所處位置以及名稱都正確,否則將不能進行編譯,而且不報任何錯誤。
proto文件編寫完成後進行編譯以生成對應的class文件,編譯後的效果大致如圖
其中包含了Request、Response與JSONObject之間的轉換等,主要是對應用的輔助。
暫不公開。