grpc學習golang版( 五、多proto文件示例 )

系列文章目錄
第一章 grpc基本概念與安裝
第二章 grpc入門示例
第三章 proto文件數據類型
第四章 多服務示例
第五章 多proto文件示例
第六章 服務器流式傳輸
第七章 客戶端流式傳輸
第八章 雙向流示例


文章目錄

  • 一、前言
  • 二、定義proto文件
    • 2.1 公共proto文件
    • 2.2 語音喚醒proto文件
    • 2.3 人臉喚醒proto文件
    • 2.4 生成go代碼
    • 2.5 注意
  • 三、編寫server服務端
  • 四、編寫Client客戶端
  • 五、測試
  • 六、示例代碼


一、前言

當項目大起來之后,會有很多個service,rpc,message(即服務,方法,結構體),這樣閱讀起來又困難,不同的業務服務都寫在一個文件,又容易導致開發人員混亂。所以我們會需要將不同服務放在不同的proto文件中。同時也可以放一些公共的proto文件。最主要的目的就是方便閱讀,查找,使用本質其實是生成的go文件放在同一個包下

二、定義proto文件

這里還是以喚醒服務為例,定義2個服務,語音喚醒人臉喚醒。我們都知道,喚醒服務入參需要一個人名name,出參的時候會有聲音sound。這些就可以放在公共的proto里面,他們都是語音喚醒人臉喚醒的共同內容

2.1 公共proto文件

新建common.proto文件

// 指定proto版本
syntax = "proto3";
// 指定默認包名
package wake_grpc;// 指定golang包名
option go_package = "/wake_proto";//請求參數
message Request{string name = 1;
}
//響應參數
message Response{string sound = 1;
}

2.2 語音喚醒proto文件

前面我們說過,喚醒,不僅有語音喚醒,還有 人臉喚醒,這些都屬于喚醒的服務。語音喚醒服務又分,狗叫聲喚醒貓叫聲喚醒坤叫聲喚醒。所以這里我們把他們(即語音喚醒人臉喚醒)拆分開,不同業務做細分。
新建voice_wake.proto文件。關鍵詞import引入公共proto文件

// 指定proto版本
syntax = "proto3";
// 指定默認包名
package wake_grpc;
// 指定golang包名
option go_package = "/wake_proto";
//引入公共proto文件
import "common.proto";//語音喚醒服務
service VoiceWakeService {//狗叫rpc DogBark(Request)returns(Response){}
}

2.3 人臉喚醒proto文件

正如我前面所說,把人臉喚醒也拆分出來,不同業務做細分。
新建face_wake.proto文件。關鍵詞import引入公共proto文件

// 指定proto版本
syntax = "proto3";
// 指定默認包名
package wake_grpc;
// 指定golang包名
option go_package = "/wake_proto";
//引入公共proto文件
import "common.proto";//人臉喚醒服務
service FaceWakeService {//一巴掌rpc ASlap(Request)returns(Response){}
}

目錄結構變更后為

2.4 生成go代碼

go_grpc_study/example_3/grpc_proto目錄下新建Terminal,執行生成文件,命令如下

protoc --go_out=. --go-grpc_out=. ./common.proto
protoc --go_out=. --go-grpc_out=. ./voice_wake.proto
protoc --go_out=. --go-grpc_out=. ./face_wake.proto

目錄結構變更后為

2.5 注意

voice_wake.proto文件、face_wake.proto文件必須得加上package,并且要和import的package相同
還有值得一提的是,voice_wake.proto文件、face_wake.proto文件引入公共proto時,golang編譯器會報紅色警告。但
不影響后續的使用!
不影響后續的使用!
不影響后續的使用!

如下face_wake.proto文件,有知道如何解決報紅色警告的,也可以評論留言。

三、編寫server服務端

新建server目錄,新建main.go文件
目錄結構如下

編寫server/main.go文件

package mainimport ("context""fmt"wake_grpc3 "go_grpc_study/example_3/grpc_proto/wake_proto""google.golang.org/grpc""google.golang.org/grpc/grpclog""net"
)// 新版本 gRPC 要求必須嵌入 UnimplementedGreeterServer 結構體
type VoiceWakeServer struct {wake_grpc3.UnimplementedVoiceWakeServiceServer
}
type FaceWakeServer struct {wake_grpc3.UnimplementedFaceWakeServiceServer
}func (VoiceWakeServer) DogBark(ctx context.Context, request *wake_grpc3.Request) (pd *wake_grpc3.Response, err error) {fmt.Println("語音喚醒入參:", request.Name)pd = new(wake_grpc3.Response)pd.Sound = "汪汪汪~"return
}func (FaceWakeServer) ASlap(ctx context.Context, request *wake_grpc3.Request) (pd *wake_grpc3.Response, err error) {fmt.Println("人臉喚醒入參:", request.Name)pd = new(wake_grpc3.Response)pd.Sound = "塞班~"return
}func main() {// 監聽端口listen, err := net.Listen("tcp", ":8080")if err != nil {grpclog.Fatalf("Failed to listen: %v", err)}// 創建一個gRPC服務器實例。s := grpc.NewServer()// 將server結構體注冊為gRPC服務。wake_grpc3.RegisterVoiceWakeServiceServer(s, &VoiceWakeServer{})wake_grpc3.RegisterFaceWakeServiceServer(s, &FaceWakeServer{})fmt.Println("grpc server running :8080")// 開始處理客戶端請求。err = s.Serve(listen)
}

具體步驟如下:

  • 1)定義2個結構體,結構體名稱無所謂,必須包含wake_grpc3.UnimplementedVoiceWakeServiceServerwake_grpc3.UnimplementedFaceWakeServiceServer 對象
  • 2)實現 .proto文件中定義的API,即DogBark狗叫方法ASlap一巴掌方法
  • 3)將服務描述及其具體實現注冊到 gRPC 中

四、編寫Client客戶端

新建client目錄,新建main.go文件
目錄結構如下

編寫clinet/main.go文件

package mainimport ("context""fmt"wake_grpc3 "go_grpc_study/example_3/grpc_proto/wake_proto""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""log"
)func main() {addr := ":8080"// 使用 grpc.Dial 創建一個到指定地址的 gRPC 連接。// 此處使用不安全的證書來實現 SSL/TLS 連接conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 連接失敗 %s", addr, err))}defer conn.Close()voiceClient := wake_grpc3.NewVoiceWakeServiceClient(conn)res, err := voiceClient.DogBark(context.Background(), &wake_grpc3.Request{Name: "王五",})fmt.Println(res, err)faceClient := wake_grpc3.NewFaceWakeServiceClient(conn)res, err = faceClient.ASlap(context.Background(), &wake_grpc3.Request{Name: "趙6",})fmt.Println(res, err)
}

具體步驟如下:

  • 1)首先使用 grpc.Dial() 與 gRPC 服務器建立連接
  • 2)使用 wake_grpc3.NewVoiceWakeServiceClient(conn)wake_grpc3.NewFaceWakeServiceClient(conn)初始化客戶端
  • 3)通過客戶端調用ServiceAPI方法voiceClient.DogBarkfaceClient.ASlap

五、測試

server目錄下,啟動服務端

go run main.go

clinet目錄下,啟動客戶端

go run main.go

服務端運行結果

客戶端運行結果

六、示例代碼

go_grpc_study:grpc學習golang版


完成ヾ(?°?°?)ノ゙

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

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

相關文章

解決Vue3項目中跨域問題的步驟

決Vue3項目中跨域問題的步驟可以按照以下方式清晰地分點表示和歸納: 1. 使用代理服務器(Proxy) 步驟: 在Vue項目的根目錄下找到或創建vue.config.js文件。在vue.config.js中配置devServer的proxy選項。設定需要代理的接口前綴&a…

基于局域網下的服務器連接、文件傳輸以及內網穿透教程 | 服務器連接ssh | 服務器文件傳輸scp | 內網穿透frp | 研究生入學必備 | 深度學習必備

🙋大家好!我是毛毛張! 🌈個人首頁: 神馬都會億點點的毛毛張 📌本篇博客分享的是基于局域網下的服務器連接🔗、文件傳輸以及內網穿透教程,內容非常完備?,涵蓋了在服務器上做深度學…

樹莓派3B讀寫EEPROM芯片AT24C256

AT24C256是一個Atmel公司的EEPROM存儲芯片,容量是256K個bit(也就是32K字節),I2C接口,而樹莓派正好有I2C接口,如下圖藍框中的4個IO口, 把AT24C256和這4個口接在一起,這樣硬件就準備好…

Django 頁面展示模型創建表的數據

1,添加視圖函數 Test/app8/urls.py from django.shortcuts import render from .models import Userdef create_user(request):if request.method POST:username request.POST.get(username)email request.POST.get(email)# ... 獲取其他字段的值# 創建用戶實例…

【Python學習篇】Python實驗小練習——異常處理(十三)

個人名片: 🎓作者簡介:嵌入式領域優質創作者🌐個人主頁:妄北y 📞個人QQ:2061314755 💌個人郵箱:[mailto:2061314755qq.com] 📱個人微信:Vir2025WB…

【教程】5分鐘直接了解隨機森林模型

本文來自《老餅講解-BP神經網絡》https://www.bbbdata.com/ 目錄 一、什么是隨機森林模型1.1.隨機森林模型介紹1.2.為什么隨機森林要用多棵決策樹 二、怎么訓練一個隨機森林模型2.1.訓練一個隨機森林模型 隨機森林模型是機器學習中常用的模型之一,它是決策樹模型的一…

Node.js全棧指南:靜態資源服務器

上一章【認識 MIME 和 HTTP】。 我們認識和了解了 MIME 的概念和作用,也簡單地學習了通過瀏覽器控制臺查看請求和返回的用法。 通過對不同的 HTML、CSS、JS 文件進行判斷,設置不同的 MIME 值,得以讓我們的瀏覽器正正確地接收和顯示不同的文…

八爪魚現金流-031,寬帶到期記一筆負債

到期了,新弄的網絡,記錄一下負債包。 八爪魚現金流 八爪魚

英英詞典(匯編實驗)

功能要求: 1.單詞及其英文解釋的錄入、修改和刪除 (1 ) 錄入新單詞,把它插入到相應的位置(按詞典順序),其后跟英文解釋、同義詞、反義詞;(此功能要求在文件中完成,其它功能可以將單詞放在數據段中&#xf…

數據庫原理之數據庫基本概念

目錄 前言 基本概念 數據庫完整性 前言 今天我們來看看數據庫的基本概念,幫助大家對數據庫有一點點最基本的了解 基本概念 4個基本概念 數據data:描述事物的符號,數據庫中存儲的基本對象。 數據庫Database:長期存儲在計算機…

山東大學多核并行2024年回憶版

2024.6.13回憶版 矩陣向量乘不可整除代碼 集合通信與點對點通信的區別 塊劃分、循環劃分、循環塊劃分(14個向量,4個進程) 按行訪問還是按列訪問快 SISD系統問題 循環依賴問題 問題:為什么不能對這個循環并行化&#xff0…

Python邏輯控制語句 之 綜合案例

需求: 1. 提示?戶輸?登錄系統的?戶名和密碼 2. 校驗?戶名和密碼是否正確(正確的?戶名:admin、密碼:123456) 3. 如果?戶名和密碼都正確,打印“登錄成功!”,并結束程序 4. 如果?戶名或密碼錯誤,打印“?戶名或密碼錯誤!”…

Django 對模型創建的兩表插入數據

1,添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存儲密碼first_name …

代碼隨想錄算法訓練營第一天 [300.最長遞增子序列 674. 最長連續遞增序列 718. 最長重復子數組]

代碼隨想錄算法訓練營第一天 [300.最長遞增子序列 674. 最長連續遞增序列 718. 最長重復子數組] **一、300.最長遞增子序列 ** 鏈接: 代碼隨想錄. 思路:dp[i] 以nums[i]為結尾的遞增子序列最大長度,下標為i的數,需要和下標為0開始一直到下標為…

DM 的斷點續傳測試

作者: 大魚海棠 原文來源: https://tidb.net/blog/4540ae34 一、概述 DM有all、full、incremental三種數據遷移同步方式(task-mode),在all同步模式下,因一些特殊情況,需要變更上游MySQL的數…

LDO產品的基礎知識解析

低壓降穩壓器 (LDO)是一種用于調節較高電壓輸入產生的輸出電壓的簡單方法。在大多數情況下,低壓降穩壓器都易于設計和使用。然而,如今的現代應用都包括各種各樣的模擬和數字系統,而有些系統和工作條件將決定哪種LDO最適合相關電路&#xff0c…

鄧普頓的五大投資原則

在《逆向投資 鄧普頓的長贏投資法》的推薦序《“逆向投資大神”鄧普頓五大投資原則》中,劉建位總結了鄧普頓的五大投資原則,分別是“以逆向投資為中心”“以價值投資為選股根本”“以分散投資為組合穩定器”“以全球投資來擴大機會池”“以極度悲觀點投資…

rust單元測試順序執行

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站。 存在的問題 有時候,不同單元測試之間可能會競爭相同的資源,比如讀寫相同的文件。在這種情況下,如果…

springboot的特點是什么?

Spring Boot是一個基于Spring框架的開源項目,它旨在簡化Spring應用的初始搭建和開發過程。以下是Spring Boot的一些主要特點: 快速開發: Spring Boot提供了許多默認配置,使得開發者可以更快地開始開發應用程序,而無需…