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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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、…