grpc是goole開源的乙個rpc框架和庫,支援多語言之間的通訊。底層通訊採用的是 http2 協議。grpc在設計上使用了 protobuf 這種介面描述語言。這種idl語言可以定義各種服務,google還提供了一種工具 protoc 來編譯這種idl語言,生成各種各樣的語言來操作服務。
grpc其實就是一種rpc,解決服務的遠端過程呼叫問題。
它使得我們遠端呼叫就像呼叫本地函式一樣,程式設計師無需關心互動的細節。
以函式為基礎的模式(rpc),如果服務端新增了乙個函式,那麼客戶端也必須新增乙個函式。
而以資源為操作基礎的restful,uri對應的服務變化了,客戶端一般是不需要關心和更新的,它對客戶端是透明的。
所以rpc的操作變更,有時比restful的複雜,因為rcp需要2邊都要新增**,也就增加了工作量。
並且json格式是可閱讀的格式,grpc編碼後是二進位制格式,對人不友好,不利於閱讀.
除錯排錯rpc也比restful難,畢竟http大家都很熟悉,而rpc協議一般是自定義協議,需要程式設計師自己去研究。
一般公司內部服務併發大,效率要求比較高的,可以用rpc。所以一般大公司內部用rpc比較多。不過大公司對外提供的api很多都是基於http的restful,為什麼?因為這個簡單、易懂,大家都熟悉,使用就方便。
而業務量比較小,併發小,可以直接用restful,json,不管是公司內部服務間通訊,還是對外提供api服務。
所以選擇:都是根據自己公司業務需求來判斷,適合使用哪種,就選擇哪種,不要盲目跟風,造成公司不必要的資源浪費。
golang中使用restful,用json傳輸資料,一般使用 , 等這是google開源的並且非常成熟的用於資料結構序列化的框架。protocol buffers在github上的位址.golang中的rpc現在一般使用g家的grpc, 畢竟大家都相信g家的技術實力 - -!
使用protocol來序列化資料,需要編寫乙個proto檔案,在proto檔案中定義你的服務,rpc操作,返回和請求資料格式。
protocol buffers的資料是乙個結構化的訊息,每個訊息都是一小的邏輯資訊的記錄,訊息中包含了一系列的鍵值對,稱之為屬性,乙個簡單的例子:
message person
定義了你傳輸的資料結構,就可以用protoc
來生成對應語言的**。這些**提供了方法,可以操作每個屬性,可以將資料序列化為元資料傳輸給對方,也可以將對方傳送過來的元資料進行解析。
例子:
// the greeter service definition.
service greeter }
// the request message containing the user's name.
message hellorequest
//the response message containing the greetings
message helloreply
grpc可以使用帶外掛程式的 protoc 命令,將你編寫的proto檔案生成**。使用grpc的外掛程式的時候,你可以生成grpc的客戶端和服務端**,和一般的protocol buffers**一樣,
可以構建,序列化,反序列化訊息。
protocol buffer 官方文件:
從這裡也可以獲取 protoc 外掛程式,從而生成你擅長語言的**。
grpc允許使用者定義四種形式的rpc方法(原文參照:
a.客戶端傳送請求到服務端,然後服務端給出乙個響應,就像乙個普通的方法定義一樣,如下所示:
rpc sayhello(hellorequest) returns (helloresponse) {};
b.服務端的流式rpc:客戶端傳送乙個請求到服務端,然後得到乙個流用於讀取服務端的的訊息,客戶端從返回的流中讀取所有的資訊,如下所示:
rpc lotsofreplies(hellorequest) returns (stream helloresponse) {};
c.客戶端流式rpc: 客戶端使用流將資訊傳送個服務端,只要客戶端傳送完所有的資訊給伺服器,就開始等待服務端的響應,如下所示:
rpc lotsofgreeting(stream hellorequest) returns (httpresponse) ;
d.雙向流式rpc:服務端與客戶端都是用讀寫流傳送資料給對方。這兩個流式相互獨立的,所以他們的讀寫可以是任意順序的,例如:服務端在接受到客戶的所有的資訊之前就已經開始響應,
也可以先讀取資料然後再寫資料,或者其他任何組合,如下所示:
rpc sayhello(stream hellorequest) returns (helloresponse) ;
01 g 編譯器常用選項
gcc gnu compiler collection gnu編譯器套件集合 gcc gcc中的c編譯器 g gcc中的c 編譯器 eg e hello.cpp o hello.i 預處理 preprocessing 生成.i檔案 sg s hello.i o hello.s 編譯 compilat...
學習進度 01
嵌入式習題部分 進度到 norflash與nandflash的區別 1 主要使用使用的函式 malloc,calloc,free,realloc。2 動態記憶體的特點 malloc與free必須成對使用 malloc分配的記憶體未初始化 calloc分配的記憶體已初始化 realloc動態對已分配的...
學習任務 01
線性回歸損失函式的極大似然推導 西瓜書公式3.4除了用最小二乘法以外,怎麼用極大似然推得?一元線性回歸的引數求解公式推導 西瓜書公式3.7和3.8怎麼推來的?多元線性回歸的引數求解公式推導 西瓜書公式3.10和3.11怎麼推來的?線性回歸損失函式的最優化演算法 什麼是批量梯度下降 隨機梯度下降 小批...