所謂rpc(remote procedure call 遠端過程呼叫)框架實際是提供了一套機制,使得應用程式之間可以進行通訊,而且也遵從server/client模型。使用的時候客戶端呼叫server端提供的介面就像是呼叫本地的函式一樣。
grpc原理:
比如 a (client) 呼叫 b (server) 提供的remoteadd方法:
首先,a與b之間建立乙個tcp連線;
然後,a把需要呼叫的方法名(這裡是remoteadd)以及方法引數(10, 20)序列化成位元組流傳送出去;
接著,b接受a傳送過來的位元組流,然後反序列化得到目標方法名,方法引數,接著執行相應的方法呼叫(可能是localadd)並把結果30返回;
最後,a接受遠端呼叫結果,輸出30。
rpc框架就是把我剛才說的這幾點些細節給封裝起來,給使用者暴露簡單友好的api使用。
grpc的優勢,如下:
1.grpc可以通過protobuf來定義介面,從而可以有更加嚴格的介面約束條件。
2.通過protobuf可以將資料序列化為二進位制編碼,這會大幅減少需要傳輸的資料量,從而大幅提高效能。
3.grpc可以方便地支援流式通訊。
流程:
1.建立介面檔案---- .proto檔案
將proto檔案編譯成go檔案,生成golang的服務**syntax = "proto3"; //語法宣告
package helloworld; //包名
// greeter 微服務,定義乙個rpc服務並具有乙個方法,該方法接收hellorequest,並返回乙個helloreply,此時可以在.proto檔案中進行如下定義:
service greeter
}//生成的介面**作為客戶端與服務端的約定,服務端必須實現定義的所有介面方法,客戶端直接呼叫同名方法向服務端發起請求。
// hellorequest 請求資料格式,message對應golang中的struct
message hellorequest
// helloreply 響應資料格式
message helloreply
protoc -i helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld
2.服務端**
3.客戶端**package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
"google.golang.org/grpc/reflection"
)const (
port = ":50051"
)type server struct{} //服務物件
// sayhello 實現服務的介面 在proto中定義的所有服務都是介面
func (s *server) sayhello(ctx context.context, in *pb.hellorequest) (*pb.helloreply, error) , nil
}func main()
s := grpc.newserver() //起乙個服務
pb.registergreeterserver(s, &server{})
// 註冊反射服務 這個服務是cli使用的 跟服務本身沒有關係
reflection.register(s)
if err := s.serve(lis); err != nil
}
4.欄位規則package main
import (
"context"
"log"
"os"
"time"
"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
)const (
address = "localhost:50051"
defaultname = "world"
)func main()
defer conn.close()
c := pb.newgreeterclient(conn)
// contact the server and print out its response.
name := defaultname
if len(os.args) > 1
// 1秒的上下文
ctx, cancel := context.withtimeout(context.background(), time.second)
defer cancel()
r, err := c.sayhello(ctx, &pb.hellorequest)
if err != nil
log.printf("greeting: %s", r.message)
}
repeated: 標識字段可以重複任意次,類似陣列。
5.預設值:
字串型別預設為空字串
位元組型別預設為空位元組
布林型別預設false
數值型別預設為0值
enums型別預設為第乙個定義的列舉值,必須是0
GRPC基礎入門
專案中要使用rpc協議框架來實現兩個系統之間的介面呼叫。a系統呼叫b系統的相應介面,因為考慮到http請求會包含更多冗餘資訊,造成請求過大,因此選用了rpc眾多框架中的grpc。grpc是google開源的rpc框架,目前版本1.0.0,看jar包引入包括netty與okhttp,同時序列化中使用的...
gRPC入門小結
首先要知道rpc是什麼 remote procedure call的簡稱,翻譯成中文就是遠端過程呼叫。rpc主要是為了解決以下倆個問題 grpc 一開始由 google 開發,是一款語言中立 平台中立 開源的遠端過程呼叫 rpc 系統,g有global的意思 在grpc裡客戶端應用可以像呼叫本地物件...
golang 網路框架之 grpc
grpc 是 google 開源的一款網路框架,具有極好的效能,可能是目前效能最好的網路框架,支援流式 rpc,可以很方便地構建訊息訂閱發布系統,支援幾乎所有主流的語言,使用上面也很簡單,公司很多服務基於 grpc 框架構建,執行非常穩定 開始之前首先你要知道網路框架為你做了哪些事情 網路協議序列化...