您好,登錄后才能下訂單哦!
RPC是什么?
所謂RPC(remote procedure call 遠(yuǎn)程過(guò)程調(diào)用)框架實(shí)際是提供了一套機(jī)制,使得應(yīng)用程序之間可以進(jìn)行通信,而且也遵從server/client模型。使用的時(shí)候客戶(hù)端調(diào)用server端提供的接口就像是調(diào)用本地的函數(shù)一樣。
gRPC是什么?
與許多RPC系統(tǒng)一樣,gRPC基于定義服務(wù)的思想,指定可以使用其參數(shù)和返回類(lèi)型遠(yuǎn)程調(diào)用的方法。默認(rèn)情況下,gRPC使用協(xié)議緩沖區(qū)作為接口定義語(yǔ)言(IDL)來(lái)描述服務(wù)接口和有效負(fù)載消息的結(jié)構(gòu)。
gRPC有什么好處以及在什么場(chǎng)景下需要用gRPC
既然是server/client模型,那么我們直接用restful api不是也可以滿(mǎn)足嗎,為什么還需要RPC呢?下面我們就來(lái)看看RPC到底有哪些優(yōu)勢(shì)
gRPC vs. Restful API
gRPC和restful API都提供了一套通信機(jī)制,用于server/client模型通信,而且它們都使用http作為底層的傳輸協(xié)議(嚴(yán)格地說(shuō), gRPC使用的http2.0,而restful api則不一定)。不過(guò)gRPC還是有些特有的優(yōu)勢(shì),如下:
使用場(chǎng)景
但是,通常我們不會(huì)去單獨(dú)使用gRPC,而是將gRPC作為一個(gè)部件進(jìn)行使用,這是因?yàn)樵谏a(chǎn)環(huán)境,我們面對(duì)大并發(fā)的情況下,需要使用分布式系統(tǒng)來(lái)去處理,而gRPC并沒(méi)有提供分布式系統(tǒng)相關(guān)的一些必要組件。而且,真正的線(xiàn)上服務(wù)還需要提供包括負(fù)載均衡,限流熔斷,監(jiān)控報(bào)警,服務(wù)注冊(cè)和發(fā)現(xiàn)等等必要的組件。不過(guò),這就不屬于本篇文章討論的主題了,我們還是先繼續(xù)看下如何使用gRPC。
gRPC的使用通常包括如下幾個(gè)步驟
protobuf的安裝
mac:brew install protobuf
windows:protoc 下載:官方地址,然后將 bin 路徑添加到 path 環(huán)境變量下去
linux:
安裝需要的依賴(lài)包:
[root@localhost ~]# yum -y install autoconf automake libtool curl make g++ unzip [root@localhost ~]# unzip protobuf-master.zip [root@localhost ~]# cd protobuf-master
生成configure文件的腳本文件,如果不執(zhí)行這步,以下操作將通不過(guò)
[root@localhost protobuf-master]# ./autogen.sh [root@localhost protobuf-master]# ./configure
可以修改安裝目錄通過(guò) ./configure --prefix=命令,統(tǒng)一安裝在/usr/local/protobuf下
[root@localhost protobuf-master]# ./configure --prefix=/usr/local/protobuf [root@localhost protobuf-master]# make [root@localhost protobuf-master]# make check [root@localhost protobuf-master]# make install [root@localhost protobuf-master]# ldconfig # refresh shared library cache.
安裝成功
[root@localhost protobuf-master]# protoc -I=./ --cpp_out=./ test.proto
安裝grpc包
go get -u github.com/golang/protobuf/{proto,protoc-gen-go} go get -u google.golang.org/grpc protoc --go_out=plugins=grpc:. *.proto
定義接口和數(shù)據(jù)類(lèi)型
syntax = "proto3"; package rpc_package; // define a service service HelloWorldService { // define the interface and data type rpc SayHello (HelloRequest) returns (HelloReply) {} } // define the data type of request message HelloRequest { string name = 1; } // define the data type of response message HelloReply { string message = 1; }
使用protobuf生成工具生成對(duì)應(yīng)語(yǔ)言的庫(kù)函數(shù)
protoc --go_out=plugins=grpc:. helloworld.proto
server.go
// server.go import ( "log" "net" "golang.org/x/net/context" "google.golang.org/grpc" pb "helloworld/helloworld" ) const ( port = ":50051" ) type server struct {} func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{Message: "Hello " + in.Name}, nil } func main() { lis, err := net.Listen("tcp", port) if err != nil { log.Fatal("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) s.Serve(lis) }
client.go
package main //client.go import ( "log" "os" "golang.org/x/net/context" "google.golang.org/grpc" pb "helloworld/helloworld" ) const ( address = "localhost:50051" defaultName = "world" ) func main() { conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { log.Fatal("did not connect: %v", err) } defer conn.Close() c := pb.NewGreeterClient(conn) name := defaultName if len(os.Args) >1 { name = os.Args[1] } r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name}) if err != nil { log.Fatal("could not greet: %v", err) } log.Printf("Greeting: %s", r.Message) }
以上就是golang 微服務(wù)之gRPC與Protobuf的使用的詳細(xì)內(nèi)容,更多關(guān)于golang gRPC與Protobuf的資料請(qǐng)關(guān)注億速云其它相關(guān)文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。