go的grpc

GRPC介紹

目錄

  1. 單體架構
  2. 微服務架構
  3. 問題
  4. 原始的grpc
    • 服務端
    • 客戶端
    • 原生rpc的問題
  5. grpc的hello world
    • 服務端
    • 客戶端
  6. proto文件
  7. proto語法
    • 數據類型
      • 基本數據類型
      • 其他數據類型
  8. 編寫風格
  9. 多服務

單體架構

  1. 只能對整體擴容
  2. 一榮俱榮,一損俱損
  3. 代碼耦合,項目的開發者需要知道整個項目的流程

微服務架構

針對單體架構的問題出現了微服務架構

  1. 可以按照服務進行單獨擴容
  2. 各個服務之間可以獨立開發,獨立部署

問題

  1. 代碼冗余
  2. 服務之間的調用很麻煩

為什么要使用grpc
grpc使用的意義

原始的grpc

服務端

package mainimport ("fmt""net""net/http""net/rpc"
)type Server struct {
}
type Req struct {Num1 intNum2 int
}
type Res struct {Num int
}func (s Server) Add(req Req, res *Res) error {res.Num = req.Num1 + req.Num2return nil
}func main() {// 注冊rpc服務rpc.Register(new(Server))rpc.HandleHTTP()listen, err := net.Listen("tcp", ":8080")if err != nil {fmt.Println(err)return}http.Serve(listen, nil)
}

客戶端

package mainimport ("fmt""net/rpc"
)type Req struct {Num1 intNum2 int
}
type Res struct {Num int
}func main() {req := Req{1, 2}client, err := rpc.DialHTTP("tcp", ":8080")if (err != nil) {fmt.Println(err)return}var res Resclient.Call("Server.Add", req, &res)fmt.Println(res)
}

原生rpc的問題:

  1. 編寫相對復雜,需要自己去關注實現過程
  2. 沒有代碼提示,容易寫錯。

grpc的hello world

服務端

  1. 編寫一個結構體,名字叫什么不重要
  2. 重要的是得實現protobuf中的所有方法
  3. 監聽端口
  4. 注冊服務
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/grpclog""grpc_study/grpc_proto/hello_grpc""net"
)type HelloServiceServer struct {
}func (s HelloServiceServer) SayHello(ctx context.Context, request *hello_grpc.HelloRequest) (res *hello_grpc.HelloResponse, err error) {fmt.Println("請求來了!", request)return &hello_grpc.HelloResponse{Message: "Hello " + "Xiaoyu_Wang",Name:    "Server",}, nil
}func main() {// 監聽端口listen, err := net.Listen("tcp", ":8080")if err != nil {grpclog.Fatalf("Failed to listen: %v", err)}// 創建一個gRPC服務器實例。s := grpc.NewServer()server := HelloServiceServer{}// 將server結構體注冊為gRPC服務。hello_grpc.RegisterHelloServiceServer(s, &server)fmt.Println("grpc server running :8080")// 開始處理客戶端請求。err = s.Serve(listen)
}

客戶端

  1. 建立連接
  2. 調用方法
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""grpc_study/grpc_proto/hello_grpc""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()// 初始化客戶端client := hello_grpc.NewHelloServiceClient(conn)result, err := client.SayHello(context.Background(), &hello_grpc.HelloRequest{Name:    "Xiaoyu_Wang",Message: "ok",})fmt.Println(result, err)
}

proto文件

syntax = "proto3"; // 指定proto版本
package hello_grpc;     // 指定默認包名// 指定golang包名
option go_package = "/hello_grpc";//定義rpc服務
service HelloService {// 定義函數rpc SayHello (HelloRequest) returns (HelloResponse) {}
}// HelloRequest 請求內容
message HelloRequest {string name = 1;  // 消息號string message = 2;
}// HelloResponse 響應內容
message HelloResponse{string name = 1;string message = 2;
}

proto語法

  1. service 對應的就是go里面的接口,可以作為服務端,客戶端
  2. rpc 對應的就是結構體中的方法
  3. message對應的也是結構體

數據類型

基本數據類型
message Request {double a1 = 1;float a2 = 2;int32 a3 = 3;uint32 a4 = 4;uint64 a5 = 5;sint32 a6 = 6;sint64 a7 = 7;fixed32 a8 = 8;fixed64 a9 = 9;sfixed32 a10 = 10;sfixed64 a11 = 11;bool a12 = 12;string a13 = 13;bytes a14 = 14;
}

對應的go類型:

type Request struct {state         protoimpl.MessageStatesizeCache     protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsA1  float64 `protobuf:"fixed64,1,opt,name=a1,proto3" json:"a1,omitempty"`A2  float32 `protobuf:"fixed32,2,opt,name=a2,proto3" json:"a2,omitempty"`A3  int32   `protobuf:"varint,3,opt,name=a3,proto3" json:"a3,omitempty"`A4  uint32  `protobuf:"varint,4,opt,name=a4,proto3" json:"a4,omitempty"`A5  uint64  `protobuf:"varint,5,opt,name=a5,proto3" json:"a5,omitempty"`A6  int32   `protobuf:"zigzag32,6,opt,name=a6,proto3" json:"a6,omitempty"`A7  int64   `protobuf:"zigzag64,7,opt,name=a7,proto3" json:"a7,omitempty"`A8  uint32  `protobuf:"fixed32,8,opt,name=a8,proto3" json:"a8,omitempty"`A9  uint64  `protobuf:"fixed64,9,opt,name=a9,proto3" json:"a9,omitempty"`A10 int32   `protobuf:"fixed32,10,opt,name=a10,proto3" json:"a10,omitempty"`A11 int64   `protobuf:"fixed64,11,opt,name=a11,proto3" json:"a11,omitempty"`A12 bool    `protobuf:"varint,12,opt,name=a12,proto3" json:"a12,omitempty"`A13 string  `protobuf:"bytes,13,opt,name=a13,proto3" json:"a13,omitempty"`A14 []byte  `protobuf:"bytes,14,opt,name=a14,proto3" json:"a14,omitempty"`
}
其他數據類型
  1. 數組類型
message ArrayRequest {repeated int64 a1 = 1;repeated string a2 = 2;repeated Request request_list = 3;
}
type ArrayRequest struct {A1          []int64 A2          []string   RequestList []*Request
}
  1. map類型
message MapRequest {map<int64, string> m_i_s = 1;map<string, bool> m_i_b = 2;map<string, ArrayRequest> m_i_arr = 3;
}
type MapRequest struct {MIS   map[int64]stringMIB   map[string]boolMIArr map[string]*ArrayRequest
}
  1. 嵌套類型
message Q1 {message Q2{string name2 = 2;}string name1 = 1;Q2 q2 = 2;
}
type Q1 struct {state         protoimpl.MessageStatesizeCache     protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsName1 string `protobuf:"bytes,1,opt,name=name1,proto3" json:"name1,omitempty"`Q2    *Q1_Q2 `protobuf:"bytes,2,opt,name=q2,proto3" json:"q2,omitempty"`
}

編寫風格

  1. 文件名建議下劃線,例如:my_student.proto
  2. 包名和目錄名對應
  3. 服務名、方法名、消息名均為大駝峰
  4. 字段名為下劃線

多服務

syntax = "proto3";option go_package = "/duo_grpc";service VideoService {rpc Look (Request) returns (Response) {}
}message Request{string name = 1;
}message Response{string name = 1;
}service OderService {rpc Buy (Request) returns (Response) {}
}

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

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

相關文章

1.12.信息系統的分類【ES】

專家系統&#xff08;ES&#xff09;技術架構深度解析 一、ES核心定義 &#x1f9e0; 智能決策中樞 由三大核心能力構建的領域專家模擬系統&#xff1a; 存儲專家級領域知識&#xff08;10^4規則量級&#xff09;支持不確定性推理&#xff08;置信度>85%&#xff09;動態…

考研數一非數競賽復習之Stolz定理求解數列極限

在非數類大學生數學競賽中&#xff0c;Stolz定理作為一種強大的工具&#xff0c;經常被用來解決和式數列極限的問題&#xff0c;也被譽為離散版的’洛必達’方法&#xff0c;它提供了一種簡潔而有效的方法&#xff0c;使得原本復雜繁瑣的極限計算過程變得直觀明了。本文&#x…

html播放本地音樂

本地有多個音樂文件&#xff0c;想用 html 逐個播放&#xff0c;或循環播放&#xff0c;并設置初始音量。 audio 在 html 中播放音樂文件用 audio 標簽&#xff1a; controls 啟用控制按鈕&#xff0c;如進度條、播放、音量、速度等。不加不顯示任何 widget。autoplay 理應啟…

DeepSeek-Manus精品課合集【附下載】

AI消息不斷&#xff0c;繼DeepSeek之后&#xff0c;又出了一個顛覆性的AI產品Manus&#xff0c;號稱全球第一個通用型AI。相比與DeepSeek&#xff0c; Manus擁有更強的自主性和執行力。 如果說DeepDeek是一個最強大腦&#xff0c;那么Manus就是一個完整的人&#xff01; DeepS…

MySQL復習筆記

MySQL復習筆記 1.MySQL 1.1什么是數據庫 數據庫(DB, DataBase) 概念&#xff1a;數據倉庫&#xff0c;軟件&#xff0c;安裝在操作系統&#xff08;window、linux、mac…&#xff09;之上 作用&#xff1a;存儲數據&#xff0c;管理數據 1.2 數據庫分類 關系型數據庫&#…

從源到目標:深度學習中的遷移學習與領域自適應實踐

引言&#xff1a;數據驅動的智能時代與遷移挑戰 在深度學習快速發展的今天&#xff0c;模型訓練對數據量和質量的依賴成為核心瓶頸。面對新場景時&#xff0c;標注數據不足、數據分布差異等問題常導致模型性能驟降。遷移學習&#xff08;Transfer Learning&#xff09;與領域自…

【網絡】HTTP協議、HTTPS協議

HTTP與HTTPS HTTP協議概述 HTTP&#xff08;超文本傳輸協議&#xff09;&#xff1a;工作在OSI頂層應用層&#xff0c;用于客戶端&#xff08;瀏覽器&#xff09;與服務器之間的通信,B/S模式 無狀態&#xff1a;每次請求獨立&#xff0c;服務器不保存客戶端狀態&#xff08;通…

Jmeter使用介紹

文章目錄 前言Jmeter簡介安裝與配置JDK安裝與配置JMeter安裝與配置 打開JMeter方式一方式二 設置Jmeter語言為中文方法一&#xff08;僅一次性&#xff09;方法二(永久設置成中文) Jmeter文件常用目錄 元件與組件元件組件元件的作用域元件的執行順序第一個案例添加線程組添加 H…

【NLP 32、文本匹配任務 —— 深度學習】

大劫大難以后&#xff0c;人不該失去銳氣&#xff0c;不該失去熱度&#xff0c;你鎮定了卻依舊燃燒&#xff0c;你平靜了卻依舊浩蕩&#xff0c;致那個從絕望中走出來的自己&#xff0c;共勉 —— 25.1.31 使用深度學習在文本匹配任務上主要有兩種方式&#xff1a;① 表示型 ②…

發展史 | 深度學習 / 云計算

注&#xff1a;本文為來自 csdn 不錯的“深度學習 / 云計算發展史 ” 相關文章合輯。 對原文&#xff0c;略作重排。 深度學習發展史&#xff08;1943-2024 編年體&#xff09;&#xff08;The History of Deep Learning&#xff09; Hefin_H 已于 2024-05-23 15:54:45 修改 …

通領科技沖刺北交所

高質量增長奔赴產業新征程 日前&#xff0c;通領科技已正式啟動在北交所的 IPO 進程&#xff0c;期望借助資本市場的力量&#xff0c;加速技術升級&#xff0c;推動全球化戰略布局。這一舉措不僅展現了中國汽車零部件企業的強大實力&#xff0c;也預示著行業轉型升級的新突破。…

TCP/IP 5層協議簇:網絡層(ICMP協議)

1. TCP/IP 5層協議簇 如下&#xff1a; 和ip協議有關的才有ip頭 2. ICMP 協議 ICMP協議沒有端口號&#xff0c;因為不去上層&#xff0c;上層協議采用端口號

RISC-V匯編學習(三)—— RV指令集

有了前兩節對于RISC-V匯編、寄存器、匯編語法等的認識&#xff0c;本節開始介紹RISC-V指令集和偽指令。 前面說了RISC-V的模塊化特點&#xff0c;是以RV32I為作為ISA的核心模塊&#xff0c;其他都是要基于此為基礎&#xff0c;可以這樣認為&#xff1a;RISC-V ISA 基本整數指…

C語言 —— 愿此世如黃金般輝煌 - 進制轉換與操作符詳解

目錄 1. 操作符的分類 2. ?進制和進制轉換 2.1 2進制轉10進制 2.2 10進制轉2進制 2.3 2進制轉8進制 2.4 2進制轉16進制 3. 原碼、反碼、補碼 4. 移位操作符 4.1 左移操作符 4.2 右移操作符 5. 位操作符&#xff1a;&、|、^、~ 5.1 & 按位與 5.2 | 按位或 …

docker1

前言 技術架構 單機架構 應用數據分離架構 應用服務集群架構 讀寫分離/主從分離架構 寫入主的時候&#xff0c;要同步Mysql從的數據才可以 冷熱分離架構 寫的時候要寫入主和緩存數據庫 讀的時候先去緩存看有沒有&#xff0c;沒有的話就去從數據庫讀數據 主要就是看這個數據是…

Spring Boot整合ArangoDB教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 一、環境準備 JDK 17Maven 3.8Spring Boot 3.2ArangoDB 3.11&#xff08;本地安裝或Docker運行&#xff09; Docker啟動ArangoDB docker run -d --name ar…

從離散迭代到連續 常微分方程(Ordinary Differential Equation, ODE):梯度流

從離散迭代到連續 ODE&#xff1a;梯度下降與梯度流的奇妙聯系 在機器學習和優化領域&#xff0c;我們常常使用離散的迭代算法&#xff08;如梯度下降&#xff09;來求解目標函數的最優解。然而&#xff0c;你是否想過這些離散步驟背后可能隱藏著連續的動態&#xff1f;常微分…

常見的 Git 命令

基礎配置和信息查詢 (Setup and Information) git config --global user.name “Your Name”: 配置全局用戶名&#xff0c;用于 Git 提交記錄。 git config --global user.email “your.emailexample.com”: 配置全局用戶郵箱&#xff0c;同樣用于 Git 提交記錄。 git confi…

深度解析:視頻軟編碼與硬編碼的優劣對比

視頻編碼 一、基本原理與核心技術 壓縮原理 通過時空冗余消除實現數據壓縮&#xff1a; 空間冗余&#xff1a;利用幀內預測&#xff08;如DC/角度預測&#xff09;消除單幀內相鄰像素相似性。時間冗余&#xff1a;運動估計與補償技術&#xff08;ME/MC&#xff09;減少連續幀間…

藍耘智算 + 通義萬相 2.1:為 AIGC 裝上 “智能翅膀”,翱翔創作新天空

1. 引言&#xff1a;AIGC 的崛起與挑戰 在過去幾年中&#xff0c;人工智能生成內容&#xff08;AIGC&#xff09;技術突飛猛進。AIGC 涉及了文本生成、圖像創作、音樂創作、視頻制作等多個領域&#xff0c;并逐漸滲透到日常生活的方方面面。傳統的內容創作方式已經被許多人類創…