遠程過程調用協議gRPC及在go環境下的使用

1. 遠程過程調用協議

1.1 定義

??遠程過程調用(Remote Procedure Call,PRC是一種進程間通信技術,它使得程序可以像調用本地函數一樣調用遠程服務器上的函數。RPC 屏蔽了底層的通信細節,讓開發者能夠更專注于業務邏輯,而無需關心網絡編程的復雜性。其流程如下:
在這里插入圖片描述

1.2 grpc

??gRPC是由 Google 開發的一個高性能、開源的 RPC 框架,基于 HTTP/2 協議并使用Protocol Buffers(protobuf)作為接口描述語言。

2. Protocol Buffers

??Protocol Buffers(Protobuf)是由Google開發的一種語言中立、平臺中立、可擴展的序列化數據格式。它用于在不同的程序和系統之間進行高效的數據交換。Protobuf 允許開發者定義數據結構(消息)并自動生成代碼來處理這些數據結構的序列化和反序列化。Protocol Buffers具有以下優點:

  • 高效性:Protobuf 使用緊湊的二進制格式,比傳統的文本格式(如 XML 或 JSON)更節省空間和帶寬,序列化和反序列化速度快,適合高性能需求的場景。
  • 跨語言支持:Protobuf 支持多種編程語言,包括但不限于 C++, Java, Python, Go, C#, Ruby, JavaScript 等。這種跨語言特性使得它在異構系統中非常有用。
  • 可擴展性:Protobuf 允許數據結構的靈活擴展,新的字段可以添加而不會破壞已有的數據格式。這種向后兼容性使得在系統升級和維護過程中更容易處理。
  • 自動生成代碼:開發者定義數據結構的.proto文件后,可以使用 protoc 編譯器生成目標語言的代碼,減少手工編碼的錯誤和工作量。
2.1 基礎語法

??Protobuf的定義文件.proto一般包含語法版本聲明、包聲明、消息定義和服務定義四個部分。其基本結構如下:

syntax = "proto3";
option go_package="./project/generated"
package example;
message MessageName {//定義消息// 字段定義
}
service Greeter { //定義服務
}
  • 語法版本聲明:使用syntax指定.proto文件的語法版本,一般常用的語法版本有:proto2proto3
  • 包聲明:package關鍵字用于指定代碼的命名空間。
  • optiongo_pacakge指定了生成的Go代碼應該放置的路徑名。go_package中至少要包含一個/.
  • 消息定義:使用message關鍵字聲明消息類型。消息類型中存放數據結構。一個消息類型包含一個或多個字段,每個字段有一個唯一的編號。舉例如下:
message Person {string name = 1;   // 類型、字段名及其唯一編號。int32 id = 2;string email = 3;
}
  • 服務定義:使用service關鍵字聲明服務類型,服務用于定義 RPC 服務接口。舉例如下:
service Greeter {rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {string name = 1;
}
message HelloReply {string message = 1;
}

3. go環境下的grpc案例

3.1 安裝相關的包

先在go語言的project中安裝grpc相關的包,具體命令如下

go get google.golang.org/grpc
go get google.golang.org/protobuf
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
go get google.golang.org/protobuf/cmd/protoc-gen-go@latest
3.2 編寫helloworld.proto文件

如果go環境使用的是GoLand等,需要先安裝protobuf插件。具體過程這里不在贅述。

syntax = "proto3";
option go_package="./generated";
package helloworld;
service Greeter {rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {string name = 1;
}
message HelloReply {string message = 1;
}

接著使用protoc命令將helloworld.proto文件編譯成go語言的源代碼。具體命令如下:

 protoc --go_out=. --go-grpc_out=. helloworld.proto

其中:
--go_out指定生成Go代碼的輸出目錄。
--go-grpc_out指定生成Go gRPC代碼的輸出目錄。

3.3 客戶端/服務端代碼

服務端代碼server.go

package main
import ("context""google.golang.org/grpc"pb "grpc_test/proto/generated" //引用protoc生成的go package"log""net"
)
type server struct {pb.UnimplementedGreeterServer
}
//實現sayhello函數
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {return &pb.HelloReply{Message: "Hello, " + req.Name}, nil
}
func main() {lis, err := net.Listen("tcp", ":50051")if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer()pb.RegisterGreeterServer(s, &server{})if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}

客戶端代碼client.go

package main
import ("context""flag""log""time""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"pb "grpc_test/proto/generated"
)
const (defaultName = "world"
)
var (addr = flag.String("addr", "localhost:50051", "the address to connect to")name = flag.String("name", defaultName, "Name to greet")
)
func main() {flag.Parse()// Set up a connection to the server.conn, err := grpc.NewClient(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatalf("did not connect: %v", err)}defer conn.Close()c := pb.NewGreeterClient(conn)// Contact the server and print out its response.ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name})if err != nil {log.Fatalf("could not greet: %v", err)}log.Printf("Greeting: %s", r.GetMessage())
}

這里完整的代碼結構如下:
在這里插入圖片描述
然后分別server.goclient.go文件(如果是在GoLand中,這兩個文件要分別運行在兩個終端中),可以看到如下結果:

2024/06/25 20:51:17 Greeting: Hello, world

參考資料

  1. https://blog.csdn.net/m0_68949064/article/details/123974867

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36025.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36025.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36025.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無源電壓繼電器 JDY-1210AW 導軌安裝 約瑟JOSEF

系列型號: JDY-1002AW電壓繼電器;JDY-1002B電壓繼電器; JDY-1110AW電壓繼電器;JDY-1110B電壓繼電器; JDY-1220AW電壓繼電器;JDY-1220B電壓繼電器; JDY-1100AW電壓繼電器;JDY-110…

服務器數據恢復—用raid6陣列磁盤組建raid5陣列如何恢復原raid數據?

服務器存儲數據恢復環境: 華為OceanStor 5800存儲,該存儲中有一組由10塊硬盤組建的raid6磁盤陣列,供企業內部使用,服務器安裝linux操作系統EXT3文件系統,劃分2個lun。 服務器存儲故障: 管理員發現存儲中rai…

JavaScript的學習之dom的查詢(一)

一、獲得元素 通過document對象調用&#xff1a; getElementById()&#xff1a;通過id屬性獲取一個元素節點對象getElementsByTagName()&#xff1a;通過標簽名獲取一組元素節點對象getElementsByName()&#xff1a;通過name屬性來獲取一組元素節點對象 核心學習代碼 <scrip…

記錄一次即將出現的釣魚新方式

釣魚通常是內網滲透過程中的最為常見的入口方式&#xff0c;但是隨著藍隊人員溯源反制思路開闊&#xff0c;入侵排查能力提升&#xff0c;釣魚也越來越困難&#xff0c;這里就記一種不同尋常的釣魚方式。 pip install 的執行流程&#xff1a; 先獲取到遠端的服務器地址 url 比…

node.js 面試題 1

### 明天要去面試了 今天晚上突擊一下node.js 什么是Node.js&#xff1f;它有什么特點&#xff1f; Node.js是一個基于Chrome V8引擎的JavaScript運行環境&#xff0c;它允許在服務器端運行JavaScript代碼。它的特點包括單線程、非阻塞I/O、事件驅動等 …

dispatch_after

dispatch_after dispatch_after dispatch_after dispatch_after函數并不是延遲對應時間后立即執行block塊中的操作&#xff0c;而是將任務追加到對應隊列中&#xff0c;考慮到隊列阻塞等情況&#xff0c;所以這個任務從加入隊列到真正執行的時間是不準確的。 dispatch_after(…

Kubernetes CSI livenessprobe探活

Kubernetes CSI livenessprobe探活 要實現一個Kubernetes CSI的livenessprobe探活&#xff0c;可以有以下三種方法&#xff1a; HttpServer 1、在CSI中實現一個簡單的HttpServer&#xff0c;暴露探活接口&#xff1b; GRPC探測 2、CSI鏡像中&#xff0c;增加grpcurl命令&a…

單目標應用:基于吸血水蛭優化器(Blood-Sucking Leech Optimizer,BSLO)的微電網優化(MATLAB代碼)

一、微電網模型介紹 微電網多目標優化調度模型簡介_vmgpqv-CSDN博客 參考文獻&#xff1a; [1]李興莘,張靖,何宇,等.基于改進粒子群算法的微電網多目標優化調度[J].電力科學與工程, 2021, 37(3):7 二、吸血水蛭優化器求解微電網 2.1算法簡介 吸血水蛭優化器&#xff08;B…

【Java Web】Tomcat服務器

目錄 一、Tomcat是什么 二、Tomcat安裝 三、Tomcat相關目錄 四、Web項目標準目錄結構規范 五、Tomcat項目部署方式 六、IDEA關聯本地Tomcat 七、HTTP協議 7.1 http的交互方式 7.1.1 http長連接和短連接 7.1.2 http1.1緩存機制 7.2 http數據報文格式 八、常見響應狀態碼 一、Tom…

印刷企業數字工廠管理系統如何保障產品質量

一、引言 隨著信息技術的迅猛發展&#xff0c;印刷行業也迎來了數字化轉型的浪潮。數字工廠管理系統作為這一轉型的核心工具&#xff0c;不僅在提高生產效率、優化資源配置方面發揮了重要作用&#xff0c;更在保障產品質量上扮演著關鍵角色。本文將深入探討印刷企業數字工廠管…

瀏覽器擴展V3開發系列之 chrome.contextMenus 右鍵菜單的用法和案例

【作者主頁】&#xff1a;小魚神1024 【擅長領域】&#xff1a;JS逆向、小程序逆向、AST還原、驗證碼突防、Python開發、瀏覽器插件開發、React前端開發、NestJS后端開發等等 chrome.contextMenus 允許開發者向瀏覽器的右鍵菜單添加自定義項。 在使用 chrome.contextMenus 之前…

本地讀取classNames txt文件

通過本地讀取classNames,來減少程序修改代碼,提高了程序的拓展性和自定義化。 步驟: 1、輸入本地路徑,分割字符串。 2、將className按順序放入vector容器中。 3、將vector賦值給classNmaes;獲取classNames.size(),賦值給CLASSES;這樣,類別個數和類別都已經賦值完成。…

Python | Leetcode Python題解之第199題二叉樹的右視圖

題目&#xff1a; 題解&#xff1a; class Solution:def rightSideView(self, root: TreeNode) -> List[int]:rightmost_value_at_depth dict() # 深度為索引&#xff0c;存放節點的值max_depth -1stack [(root, 0)]while stack:node, depth stack.pop()if node is not…

第N8周:seq2seq翻譯實戰-Pytorch復現

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 | 接輔導、項目定制 一、前期準備 from __future__ import unicode_literals, print_function, division from io import open import unicodedata import s…

什么是堡壘機(運維審計系統)?

一、堡壘機是什么 1.1 堡壘機的來由 堡壘機是從跳板機&#xff08;也叫前置機&#xff09;的概念演變過來的。早在2000年左右的時候&#xff0c;一些中大型企業為了能對運維人員的遠程登錄進行集中管理&#xff0c;會在機房部署一臺跳板機。 跳板機其實就是一臺lunix/windows…

50、基于NARX神經網絡的磁懸浮建模(matlab)

1、NARX神經網絡簡介 NARX&#xff08;非線性自回歸外部輸入&#xff09;神經網絡是一種用于非線性建模和預測的神經網絡結構。與傳統的自回歸模型不同&#xff0c;NARX網絡可以接收外部輸入來影響輸出結果&#xff0c;從而更好地捕捉系統的復雜性和非線性特征。 NARX神經網絡…

NodeJs之npm、yarn、pnpm設置最新的淘寶鏡像下載源

NodeJs之npm、yarn、pnpm設置最新的淘寶鏡像下載源 文章目錄 NodeJs之npm、yarn、pnpm設置最新的淘寶鏡像下載源1. 查看默認的下載源1. npm2. yarn3. pnpm 2. 設置最新的淘寶鏡像地址1. npm2. yarn3. pnpm 1. 查看默認的下載源 1. npm C:\Users\jinshengyuan>npm get regi…

STM32 SPI實戰篇:驅動W25Q64 Flash存儲器的技巧與方法

摘要 在嵌入式系統開發中&#xff0c;非易失性存儲是必不可少的一部分。W25Q64作為SPI Flash存儲器的一種&#xff0c;以其較高的存儲密度和擦寫次數受到廣泛應用。本文將深入探討STM32通過SPI驅動W25Q64的實戰技巧和方法&#xff0c;包括硬件連接、SPI配置、讀寫操作&#xf…

競賽選題 python+深度學習+opencv實現植物識別算法系統

0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度學習的植物識別算法研究與實現 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;4分工作量&#xff1a;4分創新點&#xff1a;4分 &#x1f9ff; 更多…

基于Java微信小程序自駕游拼團設計和實現(源碼+LW+調試文檔+講解等)

&#x1f497;博主介紹&#xff1a;?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者&#xff0c;博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?&#x1f497; &#x1f31f;文末獲取源碼數據庫&#x1f31f;感興趣的可以先收藏起來&#xff0c;還…