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

gRPC从0到1系列【1】

文章目录

  • 一、gRPC概述
    • 1.1 文档资料
    • 1.2 概述
    • 1.3 优缺点
    • 1.4 典型应用场景
    • 1.5 gRPC的组成部分
      • 1.5.1 接口契约层 - Protocol Buffers
      • 1.5.2 服务定义(Service Definition)
      • 1.5.3 代码生成器(protoc + gRPC 插件)
      • 1.5.4 传输层:HTTP/2
      • 1.5.5 客户端与服务端运行时(Runtime)
      • 1.5.6 扩展机制:拦截器(Interceptors)与元数据(Metadata)
    • 1.6 gRPC组件关系
    • 1.7 总结表格
    • 1.8 原理流程图

一、gRPC概述

1.1 文档资料

  • 官网
https://grpc.io/
  • 中文站
https://grpc.org.cn/

1.2 概述

在 gRPC 出现之前,微服务架构内部的服务通信主要依赖于基于文本的协议,如 RESTful API(使用 JSON/XML over HTTP)。虽然 REST 简单、通用,但在高性能、强类型、多语言环境下的微服务通信中,逐渐暴露出一些局限性:

  1. 效率问题:JSON/XML 是文本格式,序列化/反序列化效率较低,且报文体积较大。
  2. 弱类型约束:JSON 没有严格的模式(Schema),接口的请求和响应格式需要依赖额外的文档来约定,容易出错,且难以在编译期进行类型检查。
  3. 复杂的接口管理:随着接口增多和版本迭代,维护和同步 API 文档变得困难。
  4. 有限的通信模式:传统的 HTTP/1.1 + REST 主要支持请求-响应模式,难以直接支持流式数据传输等更复杂的交互模式。

gRPC 由 Google 开发并开源,它基于其内部大规模使用的 Stubby 框架的理念。Google 为了应对上述挑战,并充分利用现代网络协议(如 HTTP/2)的优势,创造了 gRPC。

gRPC 是一个现代开源的高性能远程过程调用 (RPC) 框架,可以在任何环境中运行。它可以高效地连接数据中心内部和跨数据中心的服务,并为负载均衡、跟踪、健康检查和身份验证提供可插拔的支持。它也适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端服务。

在这里插入图片描述

工作原理:

在这里插入图片描述

1.3 优缺点

优点

优势维度具体说明
高性能二进制序列化(Protobuf)+ HTTP/2 多路复用,比 JSON+HTTP/1.1 吞吐量提升 2-3 倍,延迟显著降低。
跨语言兼容基于 Protobuf IDL 生成多语言代码,彻底解决不同语言服务间的接口对齐问题(如 Go 调用 Java 服务无需手动解析数据)。
强类型接口Protobuf 定义接口时强制指定字段类型(如 int32、string、message),编译期即可检查类型错误,避免运行时数据格式异常。
多通信模式支持 4 种通信模式(简单 RPC、服务端流、客户端流、双向流),灵活应对实时数据传输、批量处理等场景。
云原生友好轻量、低资源占用,完美适配 Kubernetes 容器编排,且与 Istio(服务网格)深度集成,支持流量控制、灰度发布。

缺点

劣势维度具体说明
学习成本较高需掌握 Protobuf 语法、HTTP/2 原理及 gRPC 特有概念(如流、元数据),相比 RESTful API(JSON+HTTP/1.1)入门门槛更高。
浏览器兼容性差基于 HTTP/2 二进制帧,浏览器无法直接发起 gRPC 请求(需通过 gRPC-Web 代理转换为 HTTP/1.1 文本格式),不适合前端直接调用。
调试难度较大二进制传输数据无法通过浏览器 F12 或 Wireshark 直接解析,需使用 gRPC 专用工具(如 grpcurl、Postman 新版)调试。
生态成熟度低于 RESTRESTful API 有大量成熟工具(如 Swagger、Postman)、文档生成方案和社区支持,gRPC 相关工具链仍在完善中。
服务契约变更成本高Protobuf 接口兼容性需严格遵守(如新增字段需标记为 optional,删除字段需谨慎),否则可能导致旧客户端崩溃,需做好版本管理。

1.4 典型应用场景

gRPC 并非适用于所有场景,以下是其优势最突出的核心场景:

  1. 微服务内部通信:微服务间(如订单服务调用支付服务、用户服务)需要低延迟、高吞吐的通信,且服务语言多样(如 Go 网关 + Java 业务服务),gRPC 可替代 RESTful API 提升效率。
    • 示例:Kubernetes 内部组件(api-server、etcd、kubelet)通过 gRPC 通信。
  2. 实时数据传输场景:需要持续双向数据交互的场景,如实时聊天、直播弹幕、股票行情推送,gRPC 双向流比 WebSocket 更高效(二进制传输 + HTTP/2 优化)。
  3. 跨语言数据同步:多语言系统间的批量数据同步(如 Python 数据分析服务向 Java 存储服务批量写入数据),Protobuf 序列化可减少数据体积,客户端流模式支持批量传输。
  4. 高性能中间件通信:数据库、缓存、消息队列等中间件的客户端 - 服务端通信,如 etcd 的客户端(支持多语言)通过 gRPC 与服务端交互。
  5. 移动端 / 物联网(IoT)通信:移动端或 IoT 设备(带宽 / 算力有限)与后端服务通信,gRPC 小体积、低延迟的特性可减少设备资源消耗。

不适用于的场景

  • 前端直接调用后端服务(需额外引入 gRPC-Web 代理,复杂度高于 REST);
  • 对外公开的 API 服务(用户 / 第三方开发者更熟悉 REST/JSON,调试成本低)。

1.5 gRPC的组成部分

1.5.1 接口契约层 - Protocol Buffers

这是 gRPC 的基石和规范,定义了服务的"是什么"。

  • 角色:接口定义语言(IDL)和序列化机制。
  • 核心文件.proto 文件。
  • 定义内容
    • 服务(Service):包含一组远程方法。
    • RPC 方法:定义方法名、请求消息类型、响应消息类型以及通信模式(一元、流式等)。
    • 消息(Message):定义方法调用中传输的数据结构,是强类型的字段集合。
  • 作用:提供唯一的、与编程语言无关的 API 契约,是所有代码生成的基础。

1.5.2 服务定义(Service Definition)

  • .proto 文件中通过 service 块定义远程可调用的方法。
  • 每个方法明确指定:
    • 请求消息类型(input)
    • 响应消息类型(output)
    • 通信模式(Unary、Server Streaming、Client Streaming、Bidirectional Streaming)

1.5.3 代码生成器(protoc + gRPC 插件)

  • 使用官方编译器 protoc 配合对应语言的 gRPC 插件(如 grpc-javagrpc-go)。
  • 自动生成:
    • 客户端存根(Stub):隐藏网络细节,提供本地方法调用接口。
    • 服务端基类/接口(Skeleton):开发者只需实现业务逻辑。

例如:protoc --java_out=. --java-grpc_out=. user.proto 生成 Go 代码。

1.5.4 传输层:HTTP/2

  • gRPC 强制依赖 HTTP/2 作为底层传输协议。
  • 关键特性支持:
    • 多路复用(Multiplexing):多个 RPC 调用共享一个 TCP 连接。
    • 二进制帧:高效解析,减少带宽。
    • 头部压缩(HPACK):降低元数据开销。
    • 流式通信原生支持:天然适配 gRPC 的流式 RPC。

注意:gRPC 不兼容 HTTP/1.1(除非使用 gRPC-Web + 代理)。

1.5.5 客户端与服务端运行时(Runtime)

  • 客户端
    • 通过 Channel 管理连接。
    • 使用 Stub 发起调用(支持同步/异步、阻塞/非阻塞)。
  • 服务端
    • 绑定端口,监听 gRPC 请求。
    • 调度请求到对应的 服务实现类
    • 支持多线程/协程处理并发。

1.5.6 扩展机制:拦截器(Interceptors)与元数据(Metadata)

  • 拦截器(Interceptors)
    • 类似中间件,可在请求/响应前后插入逻辑。
    • 常用于:认证、日志、监控、重试、限流。
    • 支持客户端和服务端。
  • 元数据(Metadata)
    • 传递非业务上下文信息(如 token、trace ID、user-agent)。
    • 以 key-value 形式附加在 RPC 调用中(类似 HTTP headers)。

1.6 gRPC组件关系

在这里插入图片描述

1.7 总结表格

组件功能关键技术
Protocol Buffers接口定义 + 序列化.proto 文件、二进制编码
服务定义声明 RPC 方法Unary / Streaming
代码生成器自动生成客户端/服务端代码protoc + 语言插件
HTTP/2高性能传输层多路复用、二进制帧、头部压缩
客户端/服务端运行时执行 RPC 调用与处理Stub、Channel、服务实现
拦截器 & 元数据扩展与上下文传递中间件、headers-like 机制

1.8 原理流程图

开发者客户端(Client)HTTP/2 传输层服务端(Server)业务逻辑层(Service Logic)1. 编写 .proto 文件(定义服务/数据结构)2. 使用 protoc + 插件生成客户端 Stub 和服务端 Skeleton3. 引入客户端 Stub 代码4. 基于服务端 Skeleton 实现业务逻辑(如 GetUser)5. 调用 Stub 方法(如 userClient.GetUser())6. 将请求参数(struct)序列化为 Protobuf 二进制7. 封装为 HTTP/2 请求(二进制帧,包含服务名、方法名)8. 通过 TLS 加密连接发送请求(多路复用)9. 监听端口,接收 HTTP/2 请求10. 反序列化 Protobuf 为结构化数据11. 调用实现的业务逻辑方法12. 返回业务结果(如 User 数据)13. 将结果序列化为 Protobuf 二进制14. 封装为 HTTP/2 响应(二进制帧)15. 发送响应到客户端16. 反序列化响应为结构化数据17. 返回结果给开发者(如打印 User 信息)开发者客户端(Client)HTTP/2 传输层服务端(Server)业务逻辑层(Service Logic)
http://www.dtcms.com/a/411252.html

相关文章:

  • 网站建设电影WordPress发表心情
  • php做网站的优势网站建设方案的所属行业是
  • java-stream流
  • spiffs分区文件系统在esp idf的创建
  • php网站开发技术描述南昌seo网站排名
  • html5微网站做网站原型图软件
  • 86-python电网可视化项目-6
  • 长乐住房和城乡建设局网站wordpress文章页面
  • 技术拐点将至:AI 大模型的挑战突围与产业重构
  • 青海省住房和城乡建设部网站关键词排名优化软件价格
  • 图片做多的网站是哪个邢台移动网站设计
  • TypeScript 中避免使用 @ts-ignore 的最佳方案
  • 数据传输一致性保障:如何避免‘少数据’或‘脏数据’?
  • Product Hunt 每日热榜 | 2025-09-26
  • 北京公司网站建设定制全国十大装修公司最有名的是
  • 鸿蒙开发入门经验分享:从零开始构建自己的HarmonyOS应用(ArkTS)
  • 解锁安全新维度:Cybersecurity AI (CAI) 助力提升网络安全效率!
  • FastAPI WebSocket 由浅入深的开发范例
  • 义乌免费做网站怎么创业呢白手起家
  • 网站维护运营好做吗建筑工程网络数据安全管理系统
  • 怎么制作外贸网站模板wordpress给会员发信
  • 西安跨境电商平台网站淘宝网网站设计分析
  • SSL 证书的重要性
  • 快速上手XXL-JOB
  • 分组交换总结
  • 亚马逊网站怎么做做网站一般注册商标哪个类
  • daily notes[54]
  • 机器学习——决策树详解
  • 万象EXCEL开发(六)excel单元格运算逻辑 ——东方仙盟金丹期
  • Redis数据结构和常用命令