gRPC協議

目錄

1. gRPC協議介紹及構成

協議分層

協議關鍵字段

2. 示例:Greeter 服務

步驟1:定義 .proto 文件

步驟2:生成代碼

3. Java代碼示例

依賴配置(Maven pom.xml)

服務端實現

客戶端實現

運行流程

關鍵機制

對比 REST API


官網:https://grpc.io/


1. gRPC協議介紹及構成

gRPC(Google Remote Procedure Call)是基于 HTTP/2Protocol Buffers 的高性能RPC框架,核心構成如下:

協議分層
  1. 傳輸層:基于 HTTP/2,支持多路復用、雙向流、頭部壓縮。
  2. 數據編碼層:使用 Protocol Buffers(二進制序列化協議),高效壓縮數據。
  3. 接口定義層:通過 .proto 文件定義服務接口和消息結構。
  4. 通信模式
    • Unary RPC:單次請求-響應。
    • Server Streaming:服務端返回流式響應。
    • Client Streaming:客戶端發送流式請求。
    • Bidirectional Streaming:雙向流式通信。
協議關鍵字段
  • HTTP/2 請求頭
    • :method:固定為 POST
    • :path:標識服務方法,格式為 /包名.服務名/方法名(如 /example.Greeter/SayHello)。
    • content-type:固定為 application/grpc+proto
  • Trailer 頭:用于傳遞狀態碼(如 grpc-status)和錯誤信息。

2. 示例:Greeter 服務

步驟1:定義 .proto 文件
syntax = "proto3";
package example;service Greeter {rpc SayHello (HelloRequest) returns (HelloResponse) {}
}message HelloRequest {string name = 1;
}message HelloResponse {string reply = 1;
}
步驟2:生成代碼

使用 protoc 生成Java代碼(需安裝 protocgrpc-java插件):

protoc --java_out=./src/main/java --grpc-java_out=./src/main/java greeter.proto

生成的文件包括:

  • HelloRequest.java / HelloResponse.java:消息類。
  • GreeterGrpc.java:包含服務端接口和客戶端存根。

3. Java代碼示例

依賴配置(Maven pom.xml
<dependencies><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty</artifactId><version>1.50.0</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>1.50.0</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>1.50.0</version></dependency>
</dependencies>
<build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.7.0</version></extension></extensions><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.6.1</version><configuration><protocArtifact>com.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}</protocArtifact><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:1.50.0:exe:${os.detected.classifier}</pluginArtifact></configuration><executions><execution><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution></executions></plugin></plugins>
</build>
服務端實現
import io.grpc.Server;
import io.grpc.ServerBuilder;
import example.GreeterGrpc;
import example.HelloRequest;
import example.HelloResponse;public class GreeterServer {public static void main(String[] args) throws Exception {// 創建服務端,監聽端口 50051Server server = ServerBuilder.forPort(50051).addService(new GreeterImpl()).build().start();System.out.println("Server started on port 50051");server.awaitTermination();}// 實現服務接口static class GreeterImpl extends GreeterGrpc.GreeterImplBase {@Overridepublic void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {// 處理請求并返回響應String reply = "Hello " + request.getName();HelloResponse response = HelloResponse.newBuilder().setReply(reply).build();responseObserver.onNext(response);responseObserver.onCompleted();}}
}
客戶端實現
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import example.GreeterGrpc;
import example.HelloRequest;
import example.HelloResponse;public class GreeterClient {public static void main(String[] args) {// 創建到服務端的通道ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext() // 簡化示例,禁用TLS.build();// 創建客戶端存根GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);// 發送請求并接收響應HelloRequest request = HelloRequest.newBuilder().setName("Alice").build();HelloResponse response = stub.sayHello(request);System.out.println("Server reply: " + response.getReply());// 關閉通道channel.shutdown();}
}

運行流程

  1. 啟動服務端:運行 GreeterServer,監聽端口 50051。
  2. 啟動客戶端:運行 GreeterClient,發送請求并打印結果。
  3. 輸出結果
Server reply: Hello Alice

關鍵機制

  • HTTP/2 多路復用:多個請求共享一個TCP連接,降低延遲。
  • Protobuf 序列化:二進制格式,體積小、解析快。
  • 代碼生成:根據 .proto 自動生成客戶端和服務端代碼,減少手寫邏輯。

對比 REST API

場景

gRPC 方案

REST 方案

實時聊天

雙向流式

輪詢或 WebSocket

批量文件上傳

客戶端流式

分塊上傳

大規模微服務通信

高效二進制協議

JSON over HTTP/1.1

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

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

相關文章

深度學習 w b

在深度學習中&#xff0c;權重 w 和 偏置 b 是神經網絡的核心參數&#xff0c;它們的形態&#xff08;shape&#xff09;取決于網絡結構和數據維度。以下是關于 w 和 b 的詳細解析&#xff1a; 1. 數學表示與物理意義 權重 w&#xff1a; 連接神經元之間的強度&#xff0c;決定…

el-table 樹形數據,子行數據可以異步加載

1、 <el-tableborder:header-cell-style"tableStyle?.headerCellStyle"ref"tableRef":data"tableData"row-key"id":default-expand-all"false" // 默認不展開所有樹形節點:tree-props"{ children: children, hasC…

Vue中渲染函數的使用

Vue中渲染函數的使用 1. render函數2. h()的使用3. render函數和h函數的區分 vue中的渲染函數&#xff1a; 1.template2.render函數3.jsx -> js extension(jsx也是編譯成render函數&#xff0c;可編程能力更強) 1. render函數 1.1. 認識h函數 1.1.1. Vue推薦在絕大多數情況…

【氮化鎵】GaN HMETs器件物理失效分析進展

2021 年 5 月,南京大學的蔡曉龍等人在《Journal of Semiconductors》期刊發表了題為《Recent progress of physical failure analysis of GaN HEMTs》的文章,基于多種物理表征技術及大量研究成果,對 GaN HEMTs 的常見失效機制進行了系統分析。文中先介紹失效分析流程,包括使…

每日Prompt:治愈動漫插畫

提示詞 現代都市治愈動漫插畫風格&#xff0c;現代女子&#xff0c;漂亮&#xff0c;長直發&#xff0c;20歲&#xff0c;豆沙唇&#xff0c;白皙&#xff0c;氣質&#xff0c;清純現代都市背景下&#xff0c;夕陽西下&#xff0c;一位穿著白色露臍短袖&#xff0c;粉色工裝褲…

2025年牛客網秋招/社招高質量 Java 面試八股文整理

Java 面試 不論是校招還是社招都避免不了各種面試。筆試&#xff0c;如何去準備這些東西就顯得格外重要。不論是筆試還是面試都是有章可循的。關鍵在于理解企業的需求&#xff0c;明確自己的定位&#xff0c;以及掌握一定的應試技巧。 筆試部分&#xff0c;通常是對基礎知識、…

在UI界面內修改了對象名,在#include “ui_mainwindow.h“沒更新

?原因?&#xff1a;未重新編譯UI文件?? Qt的UI文件&#xff08;.ui&#xff09;需要通過??uic工具&#xff08;Qt的UI編譯器&#xff09;??生成對應的ui_*.h頭文件。如果你在Qt Designer中修改了對象名&#xff0c;但沒有??重新構建&#xff08;Rebuild&#xff09;…

前端獲取接口數據流程

一、Free-Table組件分析 <free-table v-show"showTable" v-model:page"params.pageNum" 雙向綁定當前頁大小&#xff0c;支持動態更新 v-model:limit"params.pageSize" 雙向綁定每頁大小&#xff0c;支持動態更新 v-loading&…

Linux系統防火墻之iptables

防火墻在一個系統中就好像是一個國家的軍隊&#xff0c;所謂國無軍不安&#xff0c;在系統中也是這樣&#xff0c;防火墻可以保護系統被別人攻擊&#xff0c;過濾垃圾流量等&#xff0c;那么今天我們就來了解一下Linux系統中的一種防火墻iptables。 目錄 iptables概述 規則 …

vue項目使用svg圖標

下面是在 Vue 3 項目中完整引入和使用 vite-plugin-svg-icons 的步驟 1、安裝插件 npm install vite-plugin-svg-icons -D # 或 yarn add vite-plugin-svg-icons -D # 或 pnpm add vite-plugin-svg-icons -D 2、配置 Vite 在 vite.config.ts 或 vite.config.js 中配置&…

元器件基礎學習筆記——結型場效應晶體管 (JFET)

場效應晶體管&#xff08;Field Effect Transistor&#xff0c;FET&#xff09;簡稱場效應管&#xff0c;是一種三端子半導體器件&#xff0c;它根據施加到其其中一個端子的電場來控制電流的流動。與雙極結型晶體管 &#xff08;BJT&#xff09; 不同&#xff0c;場效應晶體管 …

拆解實戰案例:電商ERP管理系統從需求到原型全流程設計

ERP即企業資源計劃系統&#xff0c;全稱為Enterprise Resource Planning&#xff0c;其核心在于運用系統化管理思想&#xff0c;為企業員工及管理層構建一個提供決策支持的管理系統平臺。它匯聚貫通企業各個業務模塊產生的數據流&#xff0c;實現資源配置與業務流程高效協同。尤…

【面試題】如何保證MQ的消息不丟失、不重復

文章目錄 一、消息丟失問題的解決方案&#xff08;一&#xff09;發送端丟失&#xff08;二&#xff09;存儲端丟失1. 同步刷盤2. Broker 集群 &#xff08;三&#xff09;消費端丟失 二、消息重復問題的解決方案&#xff08;一&#xff09;唯一鍵約束&#xff08;二&#xff0…

ArcGIS Maps SDK for JavaScript:使用圖層過濾器只顯示FeatureLayer的部分要素

文章目錄 引言1 需求場景分析2精確過濾實現方案2.1 基礎過濾語法2.2 動態過濾實現 3 模糊查詢進階技巧3.1 LIKE操作符使用3.2 特殊字段處理 4. 性能優化與注意事項4.1 服務端vs客戶端過濾4.2 最佳實踐建議 5 常見問題解答 引言 在地圖應用開發中&#xff0c;圖層過濾是常見的需…

day25-計算機網絡-3

1. DNS解析流程 windows host文件是否配置域名對應的ip查詢本地DNS緩存是否有這個域名對應的ip詢問本地DNS&#xff08;網卡配置的&#xff09;是否知曉域名對應的ip本地DNS訪問根域名解析服務器&#xff0c;但是根DNS只有頂級域名的記錄&#xff0c;根告訴我們.cn頂級域名的D…

中達瑞和SHIS高光譜相機在黑色水彩筆墨跡鑒定中的應用

在文件檢驗與物證溯源領域&#xff0c;對書寫材料&#xff08;如墨水&#xff09;進行快速、準確、無損的鑒別至關重要。由陳維娜等人撰寫的《高光譜技術結合化學計量法鑒別黑色水彩筆墨跡》&#xff08;發表于《光譜學與光譜分析》2023年第7期&#xff09;利用中達瑞和SHIS凝采…

華為OD機考 - 水仙花數 Ⅰ(2025B卷 100分)

import java.util.*; public static Integer get(int count,int c){if(count<3||count>7){return -1;}//存儲每位數的最高位……最低位int[] arr new int[count];List<Integer> res new ArrayList<>();for(int i(int) Math.pow(10,count-1);i<(int) Math…

Go 標準庫 encoding/gob 快速上手

文章目錄 1.簡介2.基礎3.類型和值4.編碼細節5.安全6.主要函數6.1 注冊1. 接口的底層類型在運行時才能確定2.類型標識的唯一性3.安全性與顯式意圖4.與結構體的自動處理對比5.示例分析為什么不能像 JSON 那樣自動處理&#xff1f;總結 6.2 編碼6.3 解碼 7.示例7.1 編解碼結構體7.…

Ubuntu ifconfig 查不到ens33網卡

BUG&#xff1a;ifconfig查看網絡配置信息&#xff1a; 終端輸入以下命令&#xff1a; sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start - service network - manager stop &#xff1a;停止…

算法-數論

C-小紅的數組查詢&#xff08;二&#xff09;_牛客周賽 Round 95 思路&#xff1a;不難看出a數組是有循環的 d3,p4時&#xff0c;a數組&#xff1a;1、0、3、2、1、0、3、2....... 最小循環節為4&#xff0c;即最多4種不同的數 d4,p6時&#xff0c;a數組&#xff1a;1、5、3、…