当前位置: 首页 > news >正文

快速学会什么是gPRC

  • 博客主页:音符犹如代码
  • 系列专栏:微服务
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

一、gRPC 简介

1.1 定义与特点

gRPC 是由 Google 开发的高性能远程过程调用(RPC)框架,它允许开发者像调用本地函数一样调用远程服务器上的方法。其主要特点包括:

  • 快速高效:采用 HTTP/2 作为传输协议,支持双向流式通信。
  • 跨语言支持:提供多种编程语言的客户端和服务端库,如 Java、Python、Go 等。
  • 统一接口定义:通过 .proto 文件定义服务接口,确保客户端和服务端的一致性。

1.2 应用场景

gRPC 特别适用于以下场景:

  • 微服务架构:实现服务间的高效通信。
  • 多语言系统:不同语言编写的系统间需要进行交互。
  • 实时通信:需要双向流或实时数据传输的应用。

二、gRPC 的核心组件

2.1 .proto 文件

.proto 文件是 gRPC 的接口定义文件,相当于一个合同,规定了服务及其方法的定义和数据结构。它的作用包括:

  • 统一接口:客户端和服务端基于同一个 .proto 文件生成代码,避免接口不一致的问题。
  • 跨语言支持:一个 .proto 文件可以生成多种语言的代码,如 Python、Go、Java 等。
  • 自动序列化:使用 Protobuf 自动将对象转换为二进制格式进行传输。
示例 .proto 文件
syntax = "proto3";package example;service UserService {rpc GetUser (UserRequest) returns (UserResponse);
}message UserRequest {int32 id = 1;
}message UserResponse {string name = 1;int32 age = 2;
}

2.2 Protobuf 序列化协议

Protobuf 是 gRPC 默认使用的数据序列化协议,是一种高效的二进制序列化协议。相比 JSON 等文本格式,Protobuf 生成的数据体积更小,适用于移动应用与后端之间的内部通信,是高性能、低功耗通信的优选方案。

序列化与反序列化流程
  • 序列化:将内存中的对象(如 User 对象)转换成二进制字节流。
  • 反序列化:将二进制字节流转回对象。

三、gRPC 工作原理

3.1 客户端与服务端交互流程

客户端流程
  1. 调用 stub.getUser(123) 方法。
  2. gRPC 框架使用 Protobuf 将请求对象序列化成二进制格式。
  3. 通过 HTTP/2 协议发送出去。
服务端流程
  1. gRPC 收到数据。
  2. 使用 Protobuf 反序列化成对象。
  3. 调用你实现的业务逻辑。
  4. 再用 Protobuf 序列化响应并返回。

3.2 图解交互流程

客户端:
1. 你调用 stub.getUser(123)
2. gRPC 框架 → 使用 Protobuf 把请求对象序列化成二进制
3. 通过 HTTP/2 发送出去网络中传输:二进制字节流(由 Protobuf 生成)服务端:
1. gRPC 收到数据
2. 使用 Protobuf 反序列化成对象
3. 调用你实现的业务逻辑
4. 再用 Protobuf 序列化响应 → 返回

四、Java 中使用 gRPC 的步骤

4.1 创建 .proto 文件

在 Java 项目中,.proto 文件通常放在与 Java 包同级的 proto 目录下。

4.2 生成代码

使用 Maven 插件自动生成代码

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 项目基本信息 --><groupId>com.example</groupId><artifactId>grpc-demo</artifactId><version>1.0.0</version><packaging>jar</packaging><name>grpc-demo</name><description>gRPC 服务端与客户端演示项目</description><properties><!-- 全局版本控制 --><java.version>8</java.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- gRPC 相关依赖版本 --><grpc.version>1.50.2</grpc.version><protobuf.version>3.21.12</protobuf.version><os-maven-plugin.version>1.7.1</os-maven-plugin.version><protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version></properties><dependencies><!-- gRPC 核心依赖 --><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty-shaded</artifactId><version>${grpc.version}</version></dependency><!-- 单元测试 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.1</version><scope>test</scope></dependency></dependencies><build><extensions><!-- 用于检测操作系统类型(跨平台支持) --><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>${os-maven-plugin.version}</version></extension></extensions><plugins><!-- 编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin><!-- Protobuf 代码生成插件 --><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>${protobuf-maven-plugin.version}</version><configuration><!-- 指定 protoc 编译器 --><protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact><!-- gRPC Java 插件 --><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact><!-- 生成的 Java 文件输出路径 --><outputDirectory>src/main/java</outputDirectory><!-- 不清空输出目录,避免覆盖已有代码 --><clearOutputDirectory>false</clearOutputDirectory></configuration><executions><execution><goals><goal>compile</goal>        <!-- 编译 .proto 生成 Message 类 --><goal>compile-custom</goal> <!-- 使用插件生成 gRPC Stub/Service --></goals></execution></executions></plugin></plugins></build>
</project>

4.3 实现业务逻辑

生成的代码类似 service 接口,你需要自己编写实现类来处理具体的业务逻辑。


总结

gRPC 是一种强大的 RPC 框架,结合 Protobuf 序列化协议,能够实现高效、跨语言的远程调用。通过 .proto 文件定义接口,确保了客户端和服务端的一致性,并支持多种编程语言的开发。希望本文能帮助你更好地理解和使用 gRPC。

http://www.dtcms.com/a/332868.html

相关文章:

  • 【大模型微调系列-03】 大模型数学基础直观入门
  • 前端动画库之gsap
  • Android init.rc详解3
  • 机器学习之PCA
  • 八股文小记 Servlet 过滤器-Spring MVC 拦截器-Spring AOP 拦截器区别
  • Spring容器初始化源码解析
  • 深入解析MPLS网络中的路由器角色
  • 【java】对word文件设置只读权限
  • HTTP/2新型漏洞“MadeYouReset“曝光:可发动大规模DoS攻击
  • 代码随想录Day51:图论(岛屿数量 深搜广搜、岛屿的最大面积)
  • C#文件复制异常深度剖析:解决“未能找到文件“之谜
  • Ceph CSI 镜像删除流程与 Trash 机制失效问题分析文档
  • CISC 与 RISC 架构全面解析:从原理到应用
  • gulimall项目笔记:P54三级分类拖拽功能实现
  • 《Attention-driven GUI Grounding》论文精读笔记
  • CSS Houdini 与 React 19 调度器:打造极致流畅的网页体验
  • 【Redis】Redis典型应用——分布式锁
  • 【Redis】分布式系统的演化过程
  • KNN 算法
  • 高频量化详解,速度和程序化的满足!
  • 卷积神经网络(CNN)学习笔记
  • 基本电子元件:贴片电阻器的种类
  • 序列晋升6:ElasticSearch深度解析,万字拆解
  • Spring事物
  • 如何理解AP中SM中宿主进程?
  • 艾伦·图灵:计算理论与人工智能的奠基人
  • 云原生俱乐部-k8s知识点归纳(4)
  • 数据结构初阶:排序算法(一)插入排序、选择排序
  • uniapp纯前端绘制商品分享图
  • 18- 网络编程