一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Golang - golang 微服務之gRPC與Protobuf的使用

golang 微服務之gRPC與Protobuf的使用

2020-06-06 12:11UpWuzzzz Golang

這篇文章主要介紹了golang 微服務之gRPC與Protobuf的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

RPC是什么?

所謂RPC(remote procedure call 遠程過程調用)框架實際是提供了一套機制,使得應用程序之間可以進行通信,而且也遵從server/client模型。使用的時候客戶端調用server端提供的接口就像是調用本地的函數一樣。

gRPC是什么?

與許多RPC系統一樣,gRPC基于定義服務的思想,指定可以使用其參數和返回類型遠程調用的方法。默認情況下,gRPC使用協議緩沖區作為接口定義語言(IDL)來描述服務接口和有效負載消息的結構。

gRPC有什么好處以及在什么場景下需要用gRPC

既然是server/client模型,那么我們直接用restful api不是也可以滿足嗎,為什么還需要RPC呢?下面我們就來看看RPC到底有哪些優勢

gRPC vs. Restful API

gRPC和restful API都提供了一套通信機制,用于server/client模型通信,而且它們都使用http作為底層的傳輸協議(嚴格地說, gRPC使用的http2.0,而restful api則不一定)。不過gRPC還是有些特有的優勢,如下:

  • gRPC可以通過protobuf來定義接口,從而可以有更加嚴格的接口約束條件。關于protobuf可以參見筆者之前的小文Google Protobuf簡明教程
  • 另外,通過protobuf可以將數據序列化為二進制編碼,這會大幅減少需要傳輸的數據量,從而大幅提高性能。
  • gRPC可以方便地支持流式通信(理論上通過http2.0就可以使用streaming模式, 但是通常web服務的restful api似乎很少這么用,通常的流式數據應用如視頻流,一般都會使用專門的協議如HLS,RTMP等,這些就不是我們通常web服務了,而是有專門的服務器應用。)

使用場景

  • 需要對接口進行嚴格約束的情況,比如我們提供了一個公共的服務,很多人,甚至公司外部的人也可以訪問這個服務,這時對于接口我們希望有更加嚴格的約束,我們不希望客戶端給我們傳遞任意的數據,尤其是考慮到安全性的因素,我們通常需要對接口進行更加嚴格的約束。這時gRPC就可以通過protobuf來提供嚴格的接口約束。
  • 對于性能有更高的要求時。有時我們的服務需要傳遞大量的數據,而又希望不影響我們的性能,這個時候也可以考慮gRPC服務,因為通過protobuf我們可以將數據壓縮編碼轉化為二進制格式,通常傳遞的數據量要小得多,而且通過http2我們可以實現異步的請求,從而大大提高了通信效率。

但是,通常我們不會去單獨使用gRPC,而是將gRPC作為一個部件進行使用,這是因為在生產環境,我們面對大并發的情況下,需要使用分布式系統來去處理,而gRPC并沒有提供分布式系統相關的一些必要組件。而且,真正的線上服務還需要提供包括負載均衡,限流熔斷,監控報警,服務注冊和發現等等必要的組件。不過,這就不屬于本篇文章討論的主題了,我們還是先繼續看下如何使用gRPC。

gRPC的使用通常包括如下幾個步驟

  • 通過protobuf來定義接口和數據類型
  • 編寫gRPC server端代碼
  • 編寫gRPC client端代碼

protobuf的安裝

mac:brew install protobuf

windows:protoc 下載:官方地址,然后將 bin 路徑添加到 path 環境變量下去

linux:

安裝需要的依賴包:

?
1
2
3
[root@localhost ~]# yum -y install autoconf automake libtool curl make g++ unzip
[root@localhost ~]# unzip protobuf-master.zip
[root@localhost ~]# cd protobuf-master

生成configure文件的腳本文件,如果不執行這步,以下操作將通不過

?
1
2
[root@localhost protobuf-master]# ./autogen.sh
[root@localhost protobuf-master]# ./configure

可以修改安裝目錄通過 ./configure --prefix=命令,統一安裝在/usr/local/protobuf下

?
1
2
3
4
5
[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.

安裝成功

?
1
[root@localhost protobuf-master]# protoc -I=./ --cpp_out=./ test.proto

安裝grpc包

?
1
2
3
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u google.golang.org/grpc
protoc --go_out=plugins=grpc:. *.proto

定義接口和數據類型

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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生成工具生成對應語言的庫函數

?
1
protoc --go_out=plugins=grpc:. helloworld.proto

server.go

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 微服務之gRPC與Protobuf的使用的詳細內容,更多關于golang gRPC與Protobuf的資料請關注服務器之家其它相關文章!

原文鏈接:https://segmentfault.com/a/1190000021851189

延伸 · 閱讀

精彩推薦
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
主站蜘蛛池模板: 亚洲国产精品线在线观看 | 高清国语自产拍免费视频国产 | 亚洲香蕉伊在人在线观看9 亚洲系列国产系列 | 四虎永久在线精品波多野结衣 | 国产高清路线一路线二2022 | 桥本有菜作品在线 | bdsm酷刑折磨死美女 | 爆操俄罗斯美女 | 69欧美性猛交| 精品一区二区三区自拍图片区 | 国产图片一区 | 四虎影视在线观看永久地址 | 亚洲成在人网站天堂一区二区 | 66j8影院xxxx深夜 | 国产成人精品综合在线观看 | 草草视频免费看 | 青青青国产在线观看 | 禁漫H天堂免费A漫 | futa百合高肉全h | 精品美女国产互换人妻 | 日本妇人成熟免费观看18 | 人成午夜免费大片在线观看 | 国产成人精品实拍在线 | 日本全黄三级在线观看 | 日本高清视频网站 | 日本黄色高清视频网站 | 三级理论在线观看 | 504神宫寺奈绪大战黑人 | 国内精品久久久久久久久久久久 | 村上里沙40分钟在线观看 | 91婷婷射 | 五月天在线视频观看 | 亚洲欧美日韩国产精品影院 | 办公室的秘密在线观看 | 欧美伊人影院 | 天天爱综合 | 亚洲精品第一国产综合 | 国产va免费精品高清在线观看 | 丝瓜视频在线观看污 | 天天做天天爱天天综合网 | 白丝校花掀起短裙呻吟小说 |