創(chuàng)建 Golang gRPC 服務(wù):分步教程

言鼎科技 2023-05-20 480

本教程使您能夠了解和學(xué)習(xí) Golang gRPC 服務(wù)。使用 Go 編程語言,獲取創(chuàng)建 gRPC(Google Remote Procedure Call)的分步要點。

gRPC 簡介

讓我們首先了解什么是 gRPC。

gRPC 是一個高性能的遠程過程調(diào)用 RPC 框架,由 Google 提供。它是開源的,支持通過傳輸協(xié)議 HTTP2 進行客戶端-服務(wù)器通信。

在 Golang 中,gRPC 是通過使用協(xié)議緩沖區(qū)和代碼生成來實現(xiàn)的,它提供了一種快速高效的方式來構(gòu)建客戶端-服務(wù)器應(yīng)用程序。

總的來說,有兩種創(chuàng)建 Web 服務(wù)的方式,Rest API 和 RPC。讓我們了解一下兩者之間的區(qū)別。

gRPC 與 REST

gRPC 和 RESTful API 是構(gòu)建 Web 服務(wù)的不同方式。

gRPC 旨在比 RESTful API 更快、更高效,它使用稱為 Protocol Buffers 的二進制數(shù)據(jù)格式,而不是 JSON 等基于文本的格式。而 RESTful API 更靈活并且允許更容易的版本控制,使它們成為需要頻繁更改的 Web 應(yīng)用程序的不錯選擇。

gRPC 的規(guī)則也更加嚴格,需要開發(fā)人員提前定義接口,這有助于錯誤檢查和數(shù)據(jù)驗證。

總的來說,gRPC 非常適合兩個微服務(wù)之間的內(nèi)部通信,對于必須快速高效的高性能應(yīng)用程序來說是一個不錯的選擇。但是,RESTful API 是需要更高靈活性和頻繁更新的應(yīng)用程序的更好選擇。

當我們使用 gRPC 繼續(xù)使用 gRPC 創(chuàng)建 Web 服務(wù)時,讓我們關(guān)注最重要的好處,即使用 Protocol Buffers 序列化數(shù)據(jù)。

在 Golang 中構(gòu)建云原生 gRPC 服務(wù)可能是一項艱巨的任務(wù),
不要浪費您的時間和資源自己動手。從我們這里聘請 Golang 開發(fā)人員,以獲得滿足您需求的可靠且可擴展的解決方案。

Golang gRPC 中的協(xié)議緩沖區(qū)

protocol buffer 俗稱 protobuf,是 gRPC 使用的一種數(shù)據(jù)序列化(與編程語言無關(guān))格式。它是一種將結(jié)構(gòu)化數(shù)據(jù)序列化為二進制格式的緊湊而高效的方法,然后可以通過網(wǎng)絡(luò)發(fā)送或存儲在磁盤上。

在 Golang 中,協(xié)議緩沖區(qū)是在 .proto 文件中使用特殊語法定義的,然后將其編譯成可用于反序列化或序列化數(shù)據(jù)的 Go 代碼。從 .proto 文件生成的 Go 代碼提供了對數(shù)據(jù)的類型安全訪問,并使其易于使用。

Protocol Buffers 是 gRPC 的一個關(guān)鍵特性,因為它們提供高效的數(shù)據(jù)序列化和反序列化,這對于高性能網(wǎng)絡(luò)通信至關(guān)重要。它們還使開發(fā)人員能夠使用 IDL 為其服務(wù)定義嚴格的接口,這有助于確保系統(tǒng)的不同組件能夠正確地相互通信。

創(chuàng)建 Golang gRPC 服務(wù):分步教程

我們將看到構(gòu)建Golang gRPC服務(wù)的示例。

Golang gRPC 示例的先決條件

由于您希望使用 gRPC Golang 創(chuàng)建遠程過程調(diào)用 Web 服務(wù),因此這里列出了您必須熟悉并已安裝在系統(tǒng)中的內(nèi)容。

  • 協(xié)議編譯器

對于Ubuntu:

創(chuàng)建 Golang gRPC 服務(wù):分步教程
sudo apt-get install protobuf-compiler

對于 macOS:

創(chuàng)建 Golang gRPC 服務(wù):分步教程
釀造安裝協(xié)議

創(chuàng)建 Golang gRPC 服務(wù)器的指導(dǎo)教程

要使用 gRPC 和 Go 語言創(chuàng)建 Web 服務(wù),我們將遵循以下步驟:

  • 創(chuàng)建原型文件

  • 將 Proto 文件轉(zhuǎn)換為 Go 文件

  • 繼承g(shù)RPC接口

  • 創(chuàng)建客戶端調(diào)用服務(wù)

第 1 步:創(chuàng)建原型文件

創(chuàng)建一個原始文件名問候.proto

創(chuàng)建 Golang gRPC 服務(wù):分步教程
語法=“proto3”;選項 go_package = "/pb";服務(wù)問候服務(wù){(diào)
   rpc Greeting(GreetingServiceRequest) 返回 (GreetingServiceReply) {}}消息 GreetingServiceRequest {
   字符串名稱 = 1;}消息 GreetingServiceReply {
   字符串消息 = 2;}

第 2 步:將 Proto 文件轉(zhuǎn)換為 Go 文件

現(xiàn)在我們需要將這個 proto 文件轉(zhuǎn)換成 Go 文件

創(chuàng)建 Golang gRPC 服務(wù):分步教程
protoc <proto-file-path> --go_out=<輸出文件路徑> --go-grpc_out=<輸出文件路徑>protoc *.proto --go_out=./ --go-grpc_out=./
  • 執(zhí)行以上命令后,我們可以看到在pb目錄下生成了兩個文件

  • greeting_grpc.pb.go, 一個接口是自動生成的

創(chuàng)建 Golang gRPC 服務(wù):分步教程
類型 GreetingServiceServer 接口 {
問候語(上下文。上下文,*GreetingServiceRequest)(*GreetingServiceReply,錯誤)}

第 3 步:繼承 gRPC 接口

現(xiàn)在我們需要繼承并實現(xiàn)上面的接口。

創(chuàng)建 Golang gRPC 服務(wù):分步教程
包主進口 (
“語境”
“調(diào)頻”
“grpc-golang/pb”
“日志”
“網(wǎng)”
“google.golang.org/grpc”)輸入服務(wù)器結(jié)構(gòu){
pb.GreetingServiceServer}func (s *server) Greeting(ctx context.Context, req *pb.GreetingServiceRequest) (*pb.GreetingServiceReply, error) {
返回 &pb.GreetingServiceReply{
消息:fmt.Sprintf("Hello, %s", req.Name),
}, 無}功能主要(){
監(jiān)聽器,錯誤 := net.Listen("tcp", ":8080")
如果錯誤!=無{
恐慌(錯誤)
}
s := grpc.NewServer()
pb.RegisterGreetingServiceServer(s, &server{})
如果錯誤:= s.Serve(監(jiān)聽器);錯誤!=無{
log.Fatalf("服務(wù)失敗: %v", err)
}}
  • 我們用 server struct 實現(xiàn)了接口方法

創(chuàng)建 Golang gRPC 服務(wù):分步教程
func (s *server) Greeting(ctx context.Context, req *pb.GreetingServiceRequest) (*pb.GreetingServiceReply, error) {
返回 &pb.GreetingServiceReply{
消息:fmt.Sprintf("Hello, %s", req.Name),
}, 無}
  • 并向問候服務(wù)器注冊服務(wù)器結(jié)構(gòu)

創(chuàng)建 Golang gRPC 服務(wù):分步教程
pb.RegisterGreetingServiceServer(s, &server{})
  • 現(xiàn)在我們可以使用go run server.go啟動我們的服務(wù)器文件

第 4 步:創(chuàng)建客戶端調(diào)用服務(wù)

服務(wù)器啟動后,我們需要編寫客戶端來調(diào)用問候語方法。

創(chuàng)建 Golang gRPC 服務(wù):分步教程
包主進口 (
“語境”
“調(diào)頻”
“grpc-golang/pb”
“日志”
“google.golang.org/grpc”)功能主要(){
選擇 := grpc.WithInsecure()
cc, err := grpc.Dial("localhost:8080", 選擇)
如果錯誤!=無{
log.Fatal(錯誤)
}
推遲 cc.Close()
客戶端 := pb.NewGreetingServiceClient(cc)
請求:= &pb.GreetingServiceRequest {名稱:“地鼠”}
resp, err := client.Greeting(context.Background(), 請求)
如果錯誤!=無{
log.Fatal(錯誤)
}
fmt.Printf("接收響應(yīng) => %s ", resp.Message)}

這里我們使用相同的自動生成文件來創(chuàng)建請求和調(diào)用問候方法

創(chuàng)建 Golang gRPC 服務(wù):分步教程
客戶端 := pb.NewGreetingServiceClient(cc)請求:= &pb.GreetingServiceRequest {名稱:“地鼠”}resp, err := client.Greeting(context.Background(), 請求)如果錯誤!=無{
 log.Fatal(錯誤)}

至此,我們結(jié)束了本教程。您可以在我們的GitHub 存儲庫中找到整個教程。

結(jié)論

通過學(xué)習(xí)本教程,您現(xiàn)在對如何在 Go 中使用 gRPC 構(gòu)建高性能、可擴展和高效的微服務(wù)有了基本的了解。有了這些知識,您就可以開始構(gòu)建自己的 Golang gRPC 服務(wù),并利用這個現(xiàn)代 RPC 框架的優(yōu)勢。

查看我們的其他Golang 教程,了解有關(guān)類似查詢和其他查詢的更多信息。

言鼎科技

The End