gRPC——简介与Hello World
gRPC簡(jiǎn)介
gRPC 是一個(gè)高性能、開源、通用的RPC框架,由Google推出,基于HTTP2協(xié)議標(biāo)準(zhǔn)設(shè)計(jì)開發(fā),默認(rèn)采用Protocol Buffers數(shù)據(jù)序列化協(xié)議,支持多種開發(fā)語言。gRPC提供了一種簡(jiǎn)單的方法來精確的定義服務(wù),并且為客戶端和服務(wù)端自動(dòng)生成可靠的功能庫(kù)。
在gRPC客戶端可以直接調(diào)用不同服務(wù)器上的遠(yuǎn)程程序,使用姿勢(shì)看起來就像調(diào)用本地程序一樣,很容易去構(gòu)建分布式應(yīng)用和服務(wù)。和很多RPC系統(tǒng)一樣,服務(wù)端負(fù)責(zé)實(shí)現(xiàn)定義好的接口并處理客戶端的請(qǐng)求,客戶端根據(jù)接口描述直接調(diào)用需要的服務(wù)。客戶端和服務(wù)端可以分別使用gRPC支持的不同語言實(shí)現(xiàn)。
官方文檔
https://grpc.io/docs/what-is-grpc/introduction/
主要特性
gRPC使用ProtoBuf來定義服務(wù),ProtoBuf是由Google開發(fā)的一種數(shù)據(jù)序列化協(xié)議(類似于XML、JSON、hessian)。ProtoBuf能夠?qū)?shù)據(jù)進(jìn)行序列化,并廣泛應(yīng)用在數(shù)據(jù)存儲(chǔ)、通信協(xié)議等方面。
gRPC支持多種語言,并能夠基于語言自動(dòng)生成客戶端和服務(wù)端功能庫(kù)。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它語言的版本正在積極開發(fā)中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等語言,grpc-java已經(jīng)支持Android開發(fā)。
gRPC基于HTTP2標(biāo)準(zhǔn)設(shè)計(jì),所以相對(duì)于其他RPC框架,gRPC帶來了更多強(qiáng)大功能,如雙向流、頭部壓縮、多復(fù)用請(qǐng)求等。這些功能給移動(dòng)設(shè)備帶來重大益處,如節(jié)省帶寬、降低TCP鏈接次數(shù)、節(jié)省CPU使用和延長(zhǎng)電池壽命等。同時(shí),gRPC還能夠提高了云端服務(wù)和Web應(yīng)用的性能。gRPC既能夠在客戶端應(yīng)用,也能夠在服務(wù)器端應(yīng)用,從而以透明的方式實(shí)現(xiàn)客戶端和服務(wù)器端的通信和簡(jiǎn)化通信系統(tǒng)的構(gòu)建。
gRPC與Protobuf介紹
微服務(wù)架構(gòu)中,由于每個(gè)服務(wù)對(duì)應(yīng)的代碼庫(kù)是獨(dú)立運(yùn)行的,無法直接調(diào)用,彼此間的通信就是個(gè)大問題
gRPC可以實(shí)現(xiàn)微服務(wù),將大的項(xiàng)目拆分為多個(gè)小且獨(dú)立的業(yè)務(wù)模塊,也就是服務(wù),各服務(wù)間使用高效的protobuf協(xié)議進(jìn)行RPC調(diào)用,gRPC默認(rèn)使用protocol buffers,這是google開源的一套成熟的結(jié)構(gòu)數(shù)據(jù)序列化機(jī)制(當(dāng)然也可以使用其他數(shù)據(jù)格式如JSON)
可以用proto files創(chuàng)建gRPC服務(wù),用message類型來定義方法參數(shù)和返回類型
安裝gRPC和Protobuf
- go get github.com/golang/protobuf/proto
- go get google.golang.org/grpc(無法使用,用如下命令代替)git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text go get -u github.com/golang/protobuf/{proto,protoc-gen-go} git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto cd $GOPATH/src/ go install google.golang.org/grpc
- go get github.com/golang/protobuf/protoc-gen-go
上面安裝好后,會(huì)在GOPATH/bin下生成protoc-gen-go.exe
但還需要一個(gè)protoc.exe,windows平臺(tái)編譯受限,很難自己手動(dòng)編譯,直接去網(wǎng)站下載一個(gè),地址:https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0 ,同樣放在GOPATH/bin下
流程
源代碼:https://gitee.com/shentuzhigang/mini-project/blob/master/grpc_demo/helloworld
編寫.proto描述文件
編譯生成.pb.go文件
服務(wù)端實(shí)現(xiàn)約定的接口并提供服務(wù)
客戶端按照約定調(diào)用.pb.go文件中的方法請(qǐng)求服務(wù)
Step1:編寫描述文件:hello.proto
syntax = "proto3"; // 指定proto版本 package hello; // 指定默認(rèn)包名// 指定golang包名 option go_package = "./";// 定義Hello服務(wù) service Hello {// 定義SayHello方法rpc SayHello(HelloRequest) returns (HelloResponse) {} }// HelloRequest 請(qǐng)求結(jié)構(gòu) message HelloRequest {string name = 1; }// HelloResponse 響應(yīng)結(jié)構(gòu) message HelloResponse {string message = 1; }hello.proto文件中定義了一個(gè)Hello Service,該服務(wù)包含一個(gè)SayHello方法,同時(shí)聲明了HelloRequest和HelloResponse消息結(jié)構(gòu)用于請(qǐng)求和響應(yīng)。客戶端使用HelloRequest參數(shù)調(diào)用SayHello方法請(qǐng)求服務(wù)端,服務(wù)端響應(yīng)HelloResponse消息。一個(gè)最簡(jiǎn)單的服務(wù)就定義好了。
Step2:編譯生成.pb.go文件
$ cd proto/hello# 編譯hello.proto $ protoc -I . --go_out=plugins=grpc:. ./hello.proto在當(dāng)前目錄內(nèi)生成的hello.pb.go文件,按照.proto文件中的說明,包含服務(wù)端接口HelloServer描述,客戶端接口及實(shí)現(xiàn)HelloClient,及HelloRequest、HelloResponse結(jié)構(gòu)體。
注意:不要手動(dòng)編輯該文件
Step3:實(shí)現(xiàn)服務(wù)端接口 server/main.go
package mainimport ("fmt""net""golang.org/x/net/context""google.golang.org/grpc""google.golang.org/grpc/grpclog"pb "helloworld/proto/hello" // 引入編譯生成的包 )const (// Address gRPC服務(wù)地址Address = "127.0.0.1:50052" )// 定義helloService并實(shí)現(xiàn)約定的接口 type helloService struct{}// HelloService Hello服務(wù) var HelloService = helloService{}// SayHello 實(shí)現(xiàn)Hello服務(wù)接口 func (h helloService) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {resp := new(pb.HelloResponse)resp.Message = fmt.Sprintf("Hello %s.", in.Name)return resp, nil }func main() {listen, err := net.Listen("tcp", Address)if err != nil {grpclog.Fatalf("Failed to listen: %v", err)}// 實(shí)例化grpc Servers := grpc.NewServer()// 注冊(cè)HelloServicepb.RegisterHelloServer(s, HelloService)fmt.Println("Listen on " + Address)err = s.Serve(listen)if err != nil {fmt.Println(err)} }服務(wù)端引入編譯后的proto包
定義一個(gè)空結(jié)構(gòu)用于實(shí)現(xiàn)約定的接口,接口描述可以查看hello.pb.go文件中的HelloServer接口描述。
實(shí)例化grpc Server并注冊(cè)HelloService
開始提供服務(wù)。
運(yùn)行:
$ go run main.go Listen on 127.0.0.1:50052 //服務(wù)端已開啟并監(jiān)聽50052端口Step4:實(shí)現(xiàn)客戶端調(diào)用 client/main.go
package mainimport ("fmt""golang.org/x/net/context""google.golang.org/grpc""google.golang.org/grpc/grpclog"pb "helloworld/proto/hello" // 引入proto包 )const (// Address gRPC服務(wù)地址Address = "127.0.0.1:50052" )func main() {// 連接conn, err := grpc.Dial(Address, grpc.WithInsecure())if err != nil {grpclog.Fatalln(err)}defer func() {err := conn.Close()if err != nil {}}()// 初始化客戶端c := pb.NewHelloClient(conn)// 調(diào)用方法req := &pb.HelloRequest{Name: "gRPC"}res, err := c.SayHello(context.Background(), req)if err != nil {grpclog.Fatalln(err)}fmt.Println(res.Message) }客戶端初始化連接后直接調(diào)用hello.pb.go中實(shí)現(xiàn)的SayHello方法,即可向服務(wù)端發(fā)起請(qǐng)求,使用姿勢(shì)就像調(diào)用本地方法一樣。
運(yùn)行:
$ go run main.go Hello gRPC. // 接收到服務(wù)端響應(yīng)如果你收到了"Hello gRPC"的回復(fù),恭喜你已經(jīng)會(huì)基本使用grpc了。
參考文章
- 微服務(wù)/gRPC
總結(jié)
以上是生活随笔為你收集整理的gRPC——简介与Hello World的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows10——荣耀笔记本任务栏图
- 下一篇: Windows11——Modern St