最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang 微服務(wù)之gRPC與Protobuf的使用

 更新時間:2020年02月27日 10:27:25   作者:UpWuzzzz  
這篇文章主要介紹了golang 微服務(wù)之gRPC與Protobuf的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

RPC是什么?

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

gRPC是什么?

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

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

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

gRPC vs. Restful API

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

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

使用場景

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

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

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

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

protobuf的安裝

mac:brew install protobuf

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

linux:

安裝需要的依賴包:

[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í)行這步,以下操作將通不過

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

可以修改安裝目錄通過 ./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ù)類型

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生成工具生成對應(yīng)語言的庫函數(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的使用的詳細內(nèi)容,更多關(guān)于golang gRPC與Protobuf的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言select語句用法示例

    Go語言select語句用法示例

    這篇文章主要為大家介紹了Go語言select語句用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go Java算法最大單詞長度乘積示例詳解

    Go Java算法最大單詞長度乘積示例詳解

    這篇文章主要為大家介紹了Go Java算法最大單詞長度乘積示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • go項目實現(xiàn)mysql接入及web?api的操作方法

    go項目實現(xiàn)mysql接入及web?api的操作方法

    這篇文章主要介紹了go項目實現(xiàn)mysql接入以及web api,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • golang中range在slice和map遍歷中的注意事項

    golang中range在slice和map遍歷中的注意事項

    今天小編就為大家分享一篇關(guān)于golang中range在slice和map遍歷中的注意事項,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Go語言中iota的具體使用

    Go語言中iota的具體使用

    Go語言中,iota是一個用于生成一系列相關(guān)常量值的常量生成器,常應(yīng)用于枚舉、位操作等場景,廣泛用于定義HTTP狀態(tài)碼、權(quán)限控制等,本文就來介紹一下iota的具體使用,感興趣的可以了解一下
    2024-11-11
  • golang如何去除字符串的換行符

    golang如何去除字符串的換行符

    這篇文章主要介紹了golang如何去除字符串的換行符問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • golang 函數(shù)返回chan類型的操作

    golang 函數(shù)返回chan類型的操作

    這篇文章主要介紹了golang 函數(shù)返回chan類型的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 淺析Go語言中的同步與異步處理

    淺析Go語言中的同步與異步處理

    在開發(fā)過程中,當(dāng)需要同時處理多個操作時,開發(fā)者經(jīng)常面臨同步和異步兩種處理方式的選擇,下面小編就來和大家詳細介紹一下Go語言中的同步與異步處理吧
    2023-11-11
  • 淺析golang如何處理json中的null

    淺析golang如何處理json中的null

    json?是一種常用的數(shù)據(jù)格式,在?go?使用?json?序列化和反序列化時比較方便的,但在使用過程中,會遇到一些問題,比如?null,所以下面我們就來看看golang如何處理json中的null吧
    2023-09-09
  • 基于go手動寫個轉(zhuǎn)發(fā)代理服務(wù)的代碼實現(xiàn)

    基于go手動寫個轉(zhuǎn)發(fā)代理服務(wù)的代碼實現(xiàn)

    這篇文章主要介紹了基于go手動寫個轉(zhuǎn)發(fā)代理服務(wù)的代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02

最新評論

镇雄县| 延边| 平和县| 通海县| 德昌县| 西乌珠穆沁旗| 金寨县| 重庆市| 铜鼓县| 丰原市| 海淀区| 宜昌市| 彭阳县| 勃利县| 梅州市| 清新县| 观塘区| 沂源县| 新化县| 东城区| 宁蒗| 梅州市| 新河县| 高邑县| 南开区| 故城县| 庆阳市| 尼勒克县| 岢岚县| 兴安县| 菏泽市| 盱眙县| 城市| 祁门县| 合川市| 临高县| 灵石县| 福安市| 德令哈市| 通许县| 安乡县|