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

GRPC详解

h5打开以查看

一、什么是 gRPC?

gRPC 是一个高性能、开源、通用的 RPC 框架,由 Google 开发并基于 HTTP/2 和 Protocol Buffers 构建。

让我们分解这个定义:

  • RPC: 远程过程调用。它是一种技术,允许你像调用本地函数一样调用另一台机器(远程)上的函数或方法。它抽象了底层的网络通信复杂性。

  • 高性能: 主要得益于其使用 HTTP/2 作为传输协议和 Protocol Buffers 作为序列化/反序列化工具。

  • 通用: 可用于连接多种语言和环境中的服务,如微服务、移动客户端与后端、浏览器与后端等。

  • HTTP/2: 下一代 HTTP 协议,支持多路复用、头部压缩、服务器推送等特性,极大地提高了网络效率。

  • Protocol Buffers: gRPC 默认的接口定义语言和数据序列化工具。它高效、跨平台且语言中立。

二、核心概念与工作原理

1. Protocol Buffers

这是 gRPC 的基石。你首先需要定义 .proto 文件。

  • 服务定义: 指定可以被远程调用的方法,以及它们的参数和返回类型。

  • 消息定义: 指定方法之间传递的数据结构。

示例 hello.proto

protobuf

// 指定 protobuf 版本
syntax = "proto3";// 定义包名(可选,用于防止命名冲突)
package hello;// 定义服务,包含可被远程调用的方法
service Greeter {// 一个简单的 RPCrpc SayHello (HelloRequest) returns (HelloReply) {}
}// 定义请求消息的类型
message HelloRequest {string name = 1; // 字段的编号,用于二进制编码中标识字段
}// 定义响应消息的类型
message HelloReply {string message = 1;
}

关键点:

  • 这个 .proto 文件是 契约,与编程语言无关。

  • 使用 protoc 编译器,可以生成各种语言(如 Go, Java, Python, C#, JavaScript 等)的代码。

  • 生成的代码包括:用于序列化/反序列化消息的类/结构体,以及客户端和服务端的基类/接口。

2. gRPC 的四种通信模式
  1. 一元 RPC

    • 最简单的模式,类似于普通的函数调用。

    • 客户端发送一个请求,服务端返回一个响应。

    • rpc SayHello (HelloRequest) returns (HelloReply) {}

  2. 服务端流式 RPC

    • 客户端发送一个请求,服务端返回一个消息流。

    • 客户端从返回的流中读取,直到没有更多消息。

    • 适用场景: 服务器向客户端传输大量数据,如日志文件、视频流、数据库查询结果集。

    • rpc LotsOfReplies (HelloRequest) returns (stream HelloReply) {}

  3. 客户端流式 RPC

    • 客户端发送一个消息流,服务端返回一个单一的响应。

    • 客户端一边写入消息流,一边等待服务端的响应。

    • 适用场景: 客户端向服务器上传大量数据,如文件上传、传感器数据上报。

    • rpc LotsOfGreetings (stream HelloRequest) returns (HelloReply) {}

  4. 双向流式 RPC

    • 客户端和服务端都使用一个读写流来发送一系列消息。

    • 两个流是独立的,可以按任意顺序读写。

    • 适用场景: 实时通信,如聊天应用、游戏、双向数据同步。

    • rpc BidiHello (stream HelloRequest) returns (stream HelloReply) {}

三、架构与数据流

直观地展示了 gRPC 的核心架构与四种通信模式的数据流。

四、为什么使用 gRPC?优点与缺点

优点
  1. 高性能

    • HTTP/2: 多路复用允许在单个 TCP 连接上同时处理多个请求,避免了 HTTP/1.1 的队头阻塞问题。头部压缩减少了开销。

    • Protocol Buffers: 是一种二进制格式,比 JSON/XML 更小、序列化和反序列化更快。

  2. 强类型契约和代码生成

    • .proto 文件是明确的、版本化的契约。

    • 自动生成的客户端和服务端代码减少了样板代码,确保了类型安全,并简化了开发。

  3. 跨语言互操作性

    • 只要共享同一个 .proto 文件,用不同语言编写的服务可以轻松地相互通信。

  4. 内置功能丰富

    • 认证: 支持 SSL/TLS 和基于令牌的认证。

    • 负载均衡: 可与外部负载均衡器集成。

    • 超时和重试: 可以配置截止时间和重试策略。

    • 流控制: 得益于 HTTP/2。

    • 可插拔的中间件: 支持拦截器,用于日志、认证、指标收集等。

  5. 非常适合微服务架构

    • 在微服务环境中,服务之间的高效、类型安全的通信至关重要,gRPC 完美地满足了这一需求。

缺点
  1. 对人类不友好

    • 由于使用二进制编码,消息不能被人类直接读取和调试。不能像 JSON 那样直接用 curl 命令测试(虽然有 grpcurl 等工具可以弥补)。

  2. 浏览器支持有限

    • 浏览器无法直接发起 gRPC 请求(因为无法强制使用 HTTP/2 和操纵底层帧)。通常需要 gRPC-Web 代理来将 HTTP/1.1 请求转换为 gRPC 请求。

  3. 学习曲线

    • 需要学习 Protocol Buffers 语法和 gRPC 的概念,相对于简单的 REST/JSON API 门槛更高。

  4. 不是面向资源的

    • gRPC 使用自定义方法,而 REST 围绕 HTTP 动词(GET, POST, PUT, DELETE)和资源设计。对于面向资源的 API,REST 可能更直观。

五、gRPC vs. REST API

特性gRPCREST API
协议HTTP/2主要是 HTTP/1.1
数据格式Protocol Buffers(二进制)JSON/XML(文本)
契约强类型,强制(.proto)弱类型,可选(如 OpenAPI/Swagger)
性能(二进制,多路复用)较低(文本,队头阻塞)
流式传输原生支持 四种模式有限支持(如 Server-Sent Events)
代码生成一流支持,内置第三方工具(如 Swagger Codegen)
浏览器支持需要 gRPC-Web原生支持

六、使用场景

  1. 微服务间通信: 这是 gRPC 最主要的应用场景,尤其是在对性能要求高的系统中。

  2. 多语言环境: 当你的技术栈包含多种编程语言时,gRPC 是理想的连接桥梁。

  3. 点对点实时通信: 需要双向流式的场景,如聊天、游戏、指令下发。

  4. 移动客户端与后端: 二进制格式有助于节省移动设备的带宽和电量。

  5. 云原生应用: Kubernetes、etcd 等云原生基础设施的核心组件都使用 gRPC 进行通信。

总结

gRPC 是一个强大的现代 RPC 框架,它通过 HTTP/2 和 Protocol Buffers 的结合,提供了卓越的性能、类型安全和开发效率。虽然它在调试和浏览器兼容性方面存在一些挑战,但其在微服务、跨语言服务和性能敏感型应用中的优势是压倒性的。如果你正在构建一个分布式系统,gRPC 绝对是一个值得深入研究和采用的技术。

h5打开以查看

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

相关文章:

  • wordpress 站点主页长春建设局网站处长
  • CAN(二)——错误帧
  • 分布式锁的特点
  • 网站制作价格多少钱wordpress带会员
  • 加速度计如何助力大型无人机飞得更稳、更准、更智能?
  • 网站动画效果用什么程序做的装修设计软件 知乎
  • 光刻胶分类与特性:正性胶和负性胶以及SU-8厚胶和AZ 1500 系列光刻胶(上)
  • 网站建设能挣钱网站正在建设中php
  • 苏州企业网站制作报价山西响应式网站哪家好
  • 33-蓝桥杯报名通知
  • 基于视觉分析的人脸联动使用手机检测系统 智能安全管理新突破 人脸与手机行为联动检测 多模态融合人脸与手机行为分析模型
  • 高青外贸公司网站建设怎么建设游网站主页
  • 财务部官方网站经济建设司网站建设做网站多少钱
  • 塑料机械怎么做网站模板之家如何免费下载
  • 济南正宗网站建设平台网站板块策划
  • Java设计模式精讲---01工厂方法模式
  • Nacos 综合漏洞利用工具 | 更新V3.0.5
  • 西宁网站建设排名花店如何做推广
  • 建博客网站重庆移动网站建设
  • 禅城网站建设联系电话电商平台系统开发
  • 知名做网站费用制作网页可以用
  • 给城市建设提议献策的网站wordpress logo更换
  • 商户查询更新缓存(opsForHash、opsForList、ObjectMapper、@Transactional、@PutMapping、装箱拆箱、线程池)
  • 做网站用dw的多吗武山县建设局网站
  • FPGA—ZYNQ学习GPIO-EMIO,MIO,AXIGPIO(五)
  • 移动端网站和app区别2021年给我一个网站
  • 记录CANOE启动报错“TimeService failed to reset all device clocks...”的问题解决过程
  • 我看别人做系统就直接网站下载深圳市专业制作网站公司吗
  • 可以做网站挂在百度上吗盐城滨海建设局网站
  • 网站建设年终总结怎么把自己的网站做自适应网站