導航:首頁 > 源碼編譯 > grpc編譯安裝指定目錄

grpc編譯安裝指定目錄

發布時間:2023-02-23 03:37:29

『壹』 在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 目錄下

『貳』 Spring Cloud集成grpc

spring cloud集成grpc(Eureka版本)
這個demo的本質是先搭建一套簡單的微服務,然後在注冊的服務中引入grpc。
說明:使用的Spring Cloud版本不新,是Eureka支持的版本。

目錄結果如下圖:

在 resources 目錄下創建application.yml文件,配置內容如下:

創建SpringBoot的啟動類,並使用 @EnableEurekaServer :

運行該類的main方法,在啟動成功後,用瀏覽器防偽 localhost:8761 。

在 resources 目錄下創建application.yml文件,用於配置服務注冊,配置內容如下:

在 src/main/java/ ,創建grpc服務,並使用 @GrpcService 注冊:

在 src/main/java/ 下創建SpringBoot啟動的Application,並使用Eureka相關的註解:

運行該類的main方法,然後刷新localhost:8761的網頁,檢查是否有服務出現。

在 resources 目錄下創建application.yml文件,配置服務注冊,內容如下:

創建調用grpc的客戶端,使用 @GrpcClient 聲明服務的地址:

創建控制器,方便測試:

創建SpringBoot的啟動類,並注冊為服務:

啟動該類的main方法,然後刷新瀏覽器檢查 localhost:8761 上是否有新增服務。

『叄』 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文件復制出來即可使用

『肆』 Flutter中使用gRPC

gRPC是谷歌開發的一款遠程過程調用系統,可以讓客戶端像調用本地對象一樣使用服務端應用的方法,使用protocol buffers介面定義語言來定義服務方法,protocol buffer定義參數和返回類型。

protobuf類似json,是一種數據結構協議,在android studio中安裝Protobuf Support,方便查看編寫的proto文件
dart使用proto插件將proto文件生成對應的dart文件,使用如下步驟
https://blog.csdn.net/qq_30903139/article/details/88558414

1、安裝flutter之後,再flutter的下面路徑中有pub命令,需要將命令加入到path中。
可以vi ~/.zshrc,在文件中加入source ~/.bash_profile,然後在vi ~/.bash_profile文件中加入下面路徑(:分割不同的路徑)
export PATH=/Users/webull/app/flutter/bin:/Users/webull/app/flutter/bin/cache/dart-sdk/bin:/Users/webull/.pub-cache/bin:$PATH
其中fluter/bin是flutter的命令路徑,dart-sdk/bin中包含了pub和其他dart命令,.pub-cache/bin是之後運行pub之後建立的路徑,裡麵包含了proto-gen-dart命令,用來將proto文件轉換為dart的命令

2、使用下面的命令安裝proto插件
$ pub global activate protoc_plugin
安裝完成後,上面的用戶目錄中的.pub-cache目錄才會有proto-gen-dart文件。

1、其中/Users/webull是我的用戶目錄 app/flutter是flutter的安裝目錄

參考:
1、gRPC介紹
2、gRPC配置

『伍』 gRPC服務開發和介面測試初探「Go」

之前寫過了Grpc服務開發和介面測試初探【Java】,中間耽擱了一些時間,Go版本的gRPC測試開發實踐才有時間學習使用。其中也是由於自己Go語言不夠熟悉導致的。之前有段時間想暫時放棄Go語言的學習,導致了Go的生疏,原因是從Groovy到Java性能。

回歸正題,Go語言版本的gRPC實踐相對Java來說是比較簡單的,但是總體的工具鏈是比較復雜的,可能是因為Go生態目前相比Java還是比較匱乏吧。下面我先簡述一下大致的步驟:

以上步驟親自操作可能會遇到一些小問題,我本人搜到的教程什麼的也是亂七八糟,踩了一些坑。我沒有整理出一個親自實踐之後的可行的教程,原因有二:

Go語言的gRPC的 proto 編寫跟Java大致一致,只有一個報名的參數不太一樣。下面是我的 Hello.proto 內容:

這里主要 go_package 網上搜到的配置方式有些不一樣,我沒有全都嘗試,大家在搜索的資料時候,盡量先看看 syntax 這個參數的值,以及文章教程寫作的時間,如果距離現在太久了,我建議直接關掉。搜索引擎有過濾功能,可以過濾掉過時的教程。

這里Go語言gRPC的一點優勢,就是在一個項目中即可實現,Java需要先弄一個SDK這樣。Go語言的gRPC的代碼可以通過生成代碼命令中的參數實現指定路徑。我是放在了和 proto 文件的同級目錄。

服務端代碼也是比較格式化的內容,如下:

其中 pb.RegisterHelloServiceServer(s, &Ser{}) 如果報錯,請檢查自己安裝的工具 protoc-gen-go 或者 protoc-gen-gofast 版本,一般提取報錯 message 搜索也能得到解決辦法。

下面是客戶端的代碼,由於學藝不精,其中大部分參數的含義目前我也不是很清楚,特別是基於 stream 的請求響應的方式使用。後面我先把Java的學完,再回過頭來看Go的,按照這個順序學習和分享。

服務端輸出:

忘記打日誌了。沒有輸出

客戶端輸出:

Go語言的gRPC測試開發實踐已經完事兒,大概率上我不會在工作中使用Go作為主力gRPC測試語言,後面測試實踐內容還是會以Java為主。

『陸』 在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

『柒』 使用 Rust 構建 gRPC 伺服器



弗洛里安·克魯姆 ( Florian Krumm ) 在Unsplash上拍攝的照片

一旦我了解了gRPC和Thrift,就很難再回到使用更具過渡性的基於 JSON 的 REST API 或SOAP API 了。

兩個著名的RPC框架 gRPC 和 Thrift 有很多相似之處。前者源自谷歌,後者源自Facebook。它們都易於使用,對多種編程語言都有很好的支持,並且都具有高性能。

最有價值的功能是多種語言的代碼生成以及伺服器端反射。這些使 API 本質上是類型安全的。使用伺服器端反射,可以更輕松地 探索 API 的模式定義,而無需閱讀和理解實現。

Apache Thrift在 歷史 上一直是一個流行的選擇。然而近年來,由於缺乏來自 Facebook 的持續支持,以及與fbthrift的分叉分叉,慢慢失去了人氣。

與此同時,gRPC 已經趕上了越來越多的功能,擁有更 健康 的生態系統。

GRPC(藍色)與 Apache Thrift(紅色)的比較。谷歌趨勢

gRPC、fbThrift 和 Apache Thrift 之間的 GitHub 明星 歷史 。https://star-history.com

到今天為止,除非您的應用程序以某種方式隸屬於 Facebook,否則沒有充分的理由考慮 Thrift。

GraphQL是另一個由 Facebook 發起的框架。它與上面的兩個 RPC 框架有很多相似之處。

移動 API 開發的最大痛點之一是一些用戶從不升級他們的應用程序。因為我們想保持向後兼容性,我們要麼必須在 API 中保留舊的未使用欄位,要麼創建 API 的多個版本。GraphQL 的一個動機就是解決這個問題。它被設計成一種「查詢語言」,允許客戶端指定它需要的數據欄位。這使得處理向後兼容性變得更容易。

GraphQL 在開發移動 API 以及面向公眾的 API(例如GitHub)方面具有巨大價值。因為,在這兩種情況下,我們都無法輕易控制客戶端的行為。

但是,如果我們正在為 Web 前端構建 API 或為內部後端服務構建 API,那麼選擇 GraphQL 而不是 gRPC 幾乎沒有什麼好處。

以上是迄今為止網路框架的一個小概述。除了網路,我們還需要決定應用伺服器的語言。

基於Stack Overflow 調查:「六年來,Rust 是最受歡迎的語言。」 盡管學習曲線相對陡峭,但它的類型安全、優雅的內存管理、廣泛的社區支持和性能,都使 Rust 成為一種非常有吸引力和有前途的後端服務開發編程語言。

Rust 是最受歡迎的語言。2021 年 Stackoverflow 調查

我們也開始看到 Rust 在行業中得到越來越廣泛的採用:Facebook、Dropbox、Yelp、AWS、Google等。很明顯,Rust 將繼續增長並繼續存在。

這就是我們將在今天的教程中看到的內容——在 Rust 中使用 gRPC 構建一個小型伺服器。

使用以下命令安裝 Rust:

如果您以前安裝過 Rust,我們可以通過以下方式對其進行更新:

讓我們仔細檢查rustc(Rust 編譯器)和cargo(Rust 包管理器)的安裝版本:

有關安裝的更多信息,請查看https://www.rust-lang.org/tools/install。

運行以下命令創建一個新的「Hello World」項目:

讓我們編譯並運行程序:

這顯示了我們到目前為止的文件結構:

gRPC 使用協議緩沖區來序列化和反序列化數據。.proto讓我們在一個文件中定義伺服器 API 。

我們定義了一個書店服務,只有一個方法:提供一個書本 id,並返回有關該書的一些詳細信息。

我們將使用tonic創建我們的 gRPC 服務。將以下依賴項添加到Cargo.toml文件中:

為了從 生成 Rust 代碼bookstore.proto,我們tonic-build在 crate 的build.rs構建腳本中使用。

將以下內容添加到build.rs文件中:

需要特別指出的一件事是,我們添加它.out_dir(「./src」)是為了將默認輸出目錄更改為該src目錄,以便我們可以更輕松地查看生成的文件,以達到本文的目的。

在我們准備編譯之前還有一件事。tonic-build依賴於Protocol Buffers 編譯器將文件解析.proto為可以轉換為 Rust 的表示。讓我們安裝protobuf:

並仔細檢查 protobuf 編譯器是否安裝正確:

准備編譯:

有了這個,我們應該src/bookstore.rs生成一個文件。此時,我們的文件結構應該如下所示:

最後,是時候將服務放在一起了。替換為main.rs以下內容:

正如我們所見,為了簡單起見,我們並沒有真正的圖書設置資料庫。在這個端點中,我們只是返回一本假書。

運行伺服器的時間:

很好,我們在 Rust 中啟動並運行了 gRPC 伺服器!

正如開頭所說,gRPC 最初給我留下了深刻的印象,因為它具有做伺服器反射的能力。它不僅在服務開發過程中很方便,而且還使與前端工程師的溝通變得更加容易。因此,如果不解釋如何為 Rust 伺服器添加它,那麼結束本教程是不完整的。

將以下內容添加到依賴項中:

更新build.rs。需要更改的行用// Add this注釋標記。

最後,將其更新main.rs為以下內容。

有許多 GUI 客戶端可以使用 gRPC Server,例如Postman、Kreya、bloomrpc、grpcox等。為了簡單起見,我們將使用命令行工具grpc_cli。

安裝:

並測試我們的第一個 gRPC 端點:

看起來它有效!我的朋友,這就是我們在 Rust 中構建 gRPC 伺服器的方式。

這就是今天的內容。感謝閱讀和快樂的編碼!與往常一樣,源代碼可在GitHub 上獲得。

『捌』 對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之間的轉換等,主要是對應用的輔助。

暫不公開。

『玖』 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

(本文完)

『拾』 Centos6.8編譯grpc總結

由於歷史遺留問題,需要在Centos6.8這個過時的系統版本上編譯grpc,總結一下幾個遇到的問題。

來源於 Install SkyWalking PHP Agent

然後參考 https://gcc.gnu.org/wiki/InstallingGCC ,安裝:

並且,stdlibc++的版本也不夠新,那麼在objdir目錄下,安裝:

然後export一下環境變數:

原因是bintuils版本過低,一樣編譯安裝一個更加新的。

只要在cmake之前加上下面的環境變數即可

閱讀全文

與grpc編譯安裝指定目錄相關的資料

熱點內容
顧家九爺在哪個app 瀏覽:816
我的世界怎麼在聯機大廳做伺服器 瀏覽:290
分手程序員 瀏覽:446
php將html導出為word 瀏覽:800
騰訊加密視頻能破解嗎 瀏覽:1007
反編譯後導入eclipse 瀏覽:948
買阿里雲伺服器有郵箱嗎 瀏覽:825
pdf卡片2004 瀏覽:309
e算量加密鎖檢測不到 瀏覽:776
python串口讀取數據類型 瀏覽:760
17年新款寶來壓縮機不跳 瀏覽:107
王者打著為什麼伺服器升級 瀏覽:847
aliyunlinux安裝 瀏覽:981
jdk8分層編譯 瀏覽:453
單片機脈沖計數程序 瀏覽:825
原相機文件夾名 瀏覽:330
淘寶雲伺服器靠什麼賺錢 瀏覽:136
單片機同步通信 瀏覽:259
游戲伺服器如何選 瀏覽:746
和平精英蘋果轉安卓怎麼轉不了 瀏覽:52