好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > golang 微服務之gRPC與Protobuf的使用

golang 微服務之gRPC與Protobuf的使用

熱門標簽:賺地圖標注的錢犯法嗎 廣東語音外呼系統供應商 福州鐵通自動外呼系統 地圖標注測試 濮陽自動外呼系統代理 烏魯木齊人工電銷機器人系統 澳門防封電銷卡 智能電銷機器人營銷 長沙ai機器人電銷

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:

安裝需要的依賴包:

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

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

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

可以修改安裝目錄通過 ./configure --prefix=命令,統一安裝在/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

定義接口和數據類型

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生成工具生成對應語言的庫函數

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 微服務之gRPC與Protobuf的使用的詳細內容,更多關于golang gRPC與Protobuf的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 在go語言中安裝與使用protobuf的方法詳解
  • golang grpc 負載均衡的方法
  • 詳解golang consul-grpc 服務注冊與發現
  • go grpc安裝使用教程

標簽:西雙版納 太原 慶陽 調研邀請 德州 貴陽 阿克蘇 廣西

巨人網絡通訊聲明:本文標題《golang 微服務之gRPC與Protobuf的使用》,本文關鍵詞  golang,微,服務,之,gRPC,與,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang 微服務之gRPC與Protobuf的使用》相關的同類信息!
  • 本頁收集關于golang 微服務之gRPC與Protobuf的使用的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 狗逻辑呼啦圈视频26分钟1080p| 女人尿尿视频| 被同学小刚征服的巨ru麻麻9| 台湾a级理论片在线观看| 少妇无套内谢太紧了A片软件| 好硬好爽| 很黄很色又很爽的视频| 杨幂和老外大战45分视频| 天天做天天做天天综合网| 美女mm视频| 18禁cos大尺度福利| www精品久久| 欧美成人第一页| 精品久久久久久中文人妻字幕电车| 黑人太粗太深了太硬受不了| 舒淇一级毛片免费看| 国产精品???国产男男| 一级全黄60分钟免费| 大尺度在线视频免费播放| 国产精品沙发午睡系列| 美女隐私无遮挡免费看| 一区二区三区高清不卡视频| 国产精品人成视频观看免费软件| 福利社影院| 国产精品网红| 欧美AV巨爆乳xoxo奶头| 亚洲精品久久国产精品37p| 91无码久久国产线观看地址| 葫芦娃黄色软件下载| 再深点灬舒服灬太大了男同| 久久精品国产亚洲AV天美18| 法国18sexxxx性xxx| 美女隐私免费观看视频大全| 亚洲IV秘?一区二区三区| 四川一级毛片免费看| 直男叫床18xvideos| 搬空侯府后揣着孕肚去逃荒| 国产精品人妻一区二区三区| 男女秘?无遮挡視頻视频在线| 动漫美女被填充屁股小说| 校花喂我乳|