Grpc介紹php
GitHub: https://github.com/grpc/grpc前端
gRPC是一個高性能、通用的開源RPC框架,其由Google主要面向移動應用開發並基於HTTP/2協議標準而設計,基於ProtoBuf(Protocol Buffers)序列化協議開發,且支持衆多開發語言。gRPC提供了一種簡單的方法來精確地定義服務和爲iOS、Android和後臺支持服務自動生成可靠性很強的客戶端功能庫。客戶端充分利用高級流和連接功能,從而有助於節省帶寬、下降的TCP連接次數、節省CPU使用、和電池壽命。java
gRPC支持多種語言,並可以基於語言自動生成客戶端和服務端功能庫。目前,在GitHub上已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它語言的版本正在積極開發中,其中 grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等語言,grpc-java已經支持Android開發。python
gRPC已經應用在Google的雲服務和對外提供的API中,其主要應用場景以下:git
低延遲、高擴展性、分佈式的系統
同雲服務器進行通訊的移動應用客戶端
設計語言獨立、高效、精確的新協議
便於各方面擴展的分層設計,如認證、負載均衡、日誌記錄、監控等github
上邊是官方腔調介紹,總結下來就幾點,跨平臺,可靠,通訊快,擴展性強,web
貌似如今還出了個前端的grcp-web,.proto 來定義客戶端 Web 應用程序和後端 gRPC 服務器之間的服務「契約」,並自動生成客戶端 JavaScript 與服務端同行docker
畢竟google出品,很少說,🐮🍺。windows
是騾子是馬拉出來溜溜後端
.NET core
編寫跨語言服務文件(.proto)
具體語法能夠谷歌或者百度一下,主要方法的定義有點不同,可是基本就是我下面這樣定義,數據類型都是同樣的。大差不差
syntax ="proto3"; option java_multiple_files = true; option java_package = "md.logservice"; option java_outer_classname = "Logger"; option objc_class_prefix = "LLL"; package gRPCTest; service gRPC { /* *方法 */ rpc SayHello (TestRequest) returns(TestReply) {} } /* *請求對象 */ message TestRequest { string name = 1; } /* *返回對象 */ message TestReply { string message = 1; }
編寫成功後,接下來我們就要把proto文件生成爲C#代碼了
先建立一個控制檯項目
經過NuGet應用以下文件
這時開始用到了tools, 這個tools就是個解析grpc proto文件的工具,在nuget下載類庫時會自動下載帶目錄下
建議新建一個文件夾專門用了處理proto文件。這裏只說windows下怎麼解析proto文件。解析proto會自動生成Markdown接口文檔,很方便有木有
這裏說一下generate.bat批處理文件怎麼寫
setlocal @rem enter this directory cd /d %~dp0 set TOOLS_PATH=D:\grpcTest\Tools\Grpc.Tools.1.2.0\tools\windows_x64 set DOC_TOOL_PATH=D:\grpcTest\Tools\doc %TOOLS_PATH%\protoc.exe -I./protos --csharp_out build ./protos/test.proto --grpc_out build --plugin=protoc-gen-grpc=%TOOLS_PATH%\grpc_csharp_plugin.exe %TOOLS_PATH%\protoc.exe -I./protos --plugin=protoc-gen-doc=%DOC_TOOL_PATH%\protoc-gen-doc.exe --doc_out=markdown,test.md:./doc protos/test.proto endlocal PAUSE
其實這就是一個批處理命令,可是網上不少資料複製都是報錯,運行時候各類報錯,神特麼煩,也不跟你細說選項做用,注意事項。
下面我們就詳細說說
A、set TOOLS_PATH=D:\grpcTest\Tools\Grpc.Tools.1.2.0\tools\windows_x64 就是設置tools解析工具所在目錄,下面一個set時設置接口文檔生成目錄,若是不須要生成grpc文檔,可不寫
B、 -I 指定一個或者多個目錄,用來搜索.proto文件的。注意:若是不指定,那就是當前目錄,沒毛病。
C、--csharp_out 生成C#代碼,固然了還能cpp_out、java_out、javanano_out、js_out、objc_out、php_out、python_out、ruby_out 這時候你就應該知道,這玩意就是支持多語言的,才用的,生成一些文件,而後給各個語言平臺調用。參數1是輸出路徑,參數2是proto的文件名或者路徑。
D、--grpc_out 到這裏可能有人會懵逼,咋回事?C#不是有一個本身的輸出目錄麼?怎麼又一個輸出?
csharp_out是輸出相似於我們平時寫的實體類,接口,定義之類的。生成的文件叫,額,就叫xxx.cs吧.
grpc_out是跟服務相關,建立,調用,綁定,實現相關。生成的玩意叫xxxGrpc.cs。 對比上個選項生成的文件名,大概能瞭解個十之八九吧。
E、--plugin=protoc-gen-grpc=grpc_csharp_plugin.exe 這個就是csharp的插件,python有python的,java有java的。你不指定它,你毛都生成不了。
接下來我們直接上代碼了
代碼挺簡單的,簡單到我很差意思貼代碼,直接上圖吧
說下須要注意的兩個點,就是客戶端和服務端都須要引用生成的grpc文件
服務端代
客戶端代碼
先啓動服務端,而後啓動客戶端
運行成功後以下圖
服務端
客戶端
能夠看到,已經調用成功了。
結束
對了,我司基本上都是用.net core 微服務了,和其餘部門都是經過微發rpc形式合做,後面視狀況,一步一步介紹.net 微服務的其方面, 好比 微服務docker部署 本地運行k8s,服務治理,kafka日誌收集等都分享給你們, 我們的.net core 氛圍愈來愈好了。
感謝各位老鐵能看到最後,謝謝
拜拜~~~(無彩蛋)