首页 > 其他分享 >gRPC是什么?

gRPC是什么?

时间:2024-12-28 16:09:05浏览次数:5  
标签:定义 gRPC 什么 响应 客户端 服务端 Protobuf

gRPC 是一个高性能、跨语言的 远程过程调用(RPC) 框架,由 Google 开发。
它基于 HTTP/2 协议,使用 Protocol Buffers(protobuf) 作为接口描述语言和数据格式。

  • 传统 RPC:就像打电话(远程调用函数),你告诉对方要做什么,对方处理后告诉你结果。
  • gRPC:是一种升级版的“打电话”,通话质量(性能)更好,支持多种语言(多平台),还可以同时支持双向交流。

gRPC 的核心特点

  1. 跨语言支持

    • 支持多种编程语言(如 Go、Java、Python、C++ 等)。
    • 客户端和服务端可以用不同语言实现。
  2. 高性能

    • 使用 HTTP/2 提供高效的二进制传输、双向流、连接复用。
  3. 使用 Protocol Buffers

    • 用 Protobuf 定义接口和数据结构,生成多语言代码。
  4. 多种通信模式

    • 一元 RPC:客户端发起请求,服务端返回单一响应。
    • 服务端流式 RPC:客户端发起请求,服务端返回多次响应。
    • 客户端流式 RPC:客户端发送多次请求,服务端返回一次响应。
    • 双向流式 RPC:客户端和服务端可以同时发送多次请求和响应。

Protocol Buffers(Protobuf)是什么?

Protobuf 是 Google 提供的一种轻量级、高效的序列化数据格式。
它是 gRPC 的核心组件,用来定义服务接口和数据结构,同时生成代码(如 Go、Java、Python 等)以便直接使用。


Protobuf 的作用

  1. 定义服务接口和数据结构
    • 描述 gRPC 服务的请求和响应格式。
  2. 生成代码
    • 使用 protoc 工具将 .proto 文件编译成目标语言代码。
  3. 高效序列化和反序列化
    • Protobuf 使用二进制格式,比 JSON 和 XML 更小、更快。

Protobuf 文件示例

syntax = "proto3"; // 指定 Protobuf 的语法版本

package example;  // 包名

// 定义 gRPC 服务
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// 定义请求消息
message HelloRequest {
  string name = 1;  // "name" 字段,编号为 1
}

// 定义响应消息
message HelloReply {
  string message = 1;  // "message" 字段,编号为 1
}

Protobuf 文件内容解析

  • syntax:指定使用的 Protobuf 版本(推荐使用 proto3)。
  • package:定义文件的命名空间,便于代码生成和组织。
  • service:定义 gRPC 服务,包含一个或多个方法(如 SayHello)。
  • message:定义消息的结构,用于请求和响应。
  • 字段编号:数字(如 1)是字段的唯一编号,便于数据解析。

gRPC 和 Protobuf 的关系

  1. Protobuf 用来定义 gRPC 服务的接口和消息结构。
  2. gRPC 使用 Protobuf 生成的代码,实现高性能远程调用。

gRPC 的工作流程

  1. 编写 .proto 文件
    • 定义服务方法、请求和响应格式。
  2. 生成代码
    • 使用 protoc 工具将 .proto 文件转换为目标语言的代码。
  3. 实现服务逻辑
    • 在服务端实现服务逻辑,客户端调用服务。
  4. 部署服务
    • 服务端启动服务,客户端发送请求并接收响应。

gRPC vs REST

特性 gRPC REST
传输协议 HTTP/2 HTTP/1.1
数据格式 Protobuf(二进制) JSON(文本)
性能 高(序列化速度快,流量小) 较低(基于文本)
类型安全 强(严格的接口定义) 弱(无强制类型检查)
通信模式 一元、流式、多种模式支持 一元请求-响应
多语言支持 非常强

标签:定义,gRPC,什么,响应,客户端,服务端,Protobuf
From: https://www.cnblogs.com/niumachen/p/18637577

相关文章

  • webkitRelativePath是什么?
    webkitRelativePath是一个在HTML5的FileAPI中使用的非标准属性,它由WebKit和Blink引擎(如Chrome和Safari浏览器)支持。这个属性提供了一个相对于用户选择文件夹的路径,当用户通过<inputtype="file"webkitdirectory>选择整个目录时,该属性对每个文件对象可用。主要特......
  • Kafka为什么这么快? 高性能背后的原理?
    Kafka是一款性能非常优秀的消息队列,每秒处理的消息体量可以达到千万级别。今天来聊一聊Kafka高性能背后的技术原理。1批量发送Kafka收发消息都是批量进行处理的。我们看一下Kafka生产者发送消息的代码:privateFuture<RecordMetadata>doSend(ProducerRecord<K,V>re......
  • 网页UI:客户口里的“设计感”到底是个什么感?
    费劲巴拉给客户搞的设计稿,客户来了一句“没有设计感”,设计师仿佛头上挨了一闷棍,都能憋出内伤出来,那么这个设计感到底是傻感觉呢?本文从什么是设计感、为什么要提升设计感、该如何提升设计感等单个角度来解读这个话题,并附上相关案例,欢迎友友们点赞评论私信。一、网页UI中的设计......
  • 为什么有了可视化大屏安防监控压力就小了?本文为你揭晓背后原因
    在安防监控领域,可视化大屏的出现为安全管理带来了诸多变革。有了可视化大屏,安防监控的压力明显减小,这背后有着多方面的原因。 一、全面直观的信息展示 可视化大屏能够将来自各个监控点的图像、数据等信息集中展示在一个大屏幕上,为安防人员提供了全面、直观的监控画面。与......
  • 为什么有的ui弹窗干巴巴的,本文为你揭晓原因
    一、缺乏视觉设计色彩单调一些UI弹窗的色彩选择过于单一,没有运用丰富的色彩搭配来吸引用户的注意力。单调的色彩会让弹窗显得沉闷、无趣,无法给用户带来视觉上的冲击。 一个只用白色背景和黑色文字的弹窗,会给人一种冰冷、严肃的感觉,缺乏亲和力。而如果在弹窗中加入一些明......
  • 强化学习算法:soft actor-critic (SAC)—— SAC中的alpha_losse是什么?
    官方实现地址:https://openi.pcl.ac.cn/devilmaycry812839668/softlearning在SAC算法的官方实现中有一个论文中没有介绍的部分,这就是SAC中的alpha_losse,在SAC论文中alpha是以超参数的形式存在的,但是在论文作者发布的具体实现的代码中关于这个alpha却给出了一种计算方法,该方法可......
  • 07 _ Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
    07_LoadAverage:加了CPUCgroup限制,为什么我的容器还是很慢?你好,我是程远。今天我想聊一聊平均负载(LoadAverage)的话题。在上一讲中,我们提到过CPUCgroup可以限制进程的CPU资源使用,但是CPUCgroup对容器的资源限制是存在盲点的。什么盲点呢?就是无法通过CPUCgroup来控制Loa......
  • 04 _ 理解进程(3):为什么我在容器中的进程被强制杀死了?
    04_理解进程(3):为什么我在容器中的进程被强制杀死了?你好,我是程远。今天我们来讲容器中init进程的最后一讲,为什么容器中的进程被强制杀死了。理解了这个问题,能够帮助你更好地管理进程,让容器中的进程可以gracefulshutdown。我先给你说说,为什么进程管理中做到这点很重要。在实......
  • 03|理解进程(2):为什么我的容器里有这么多僵尸进程?
    03|理解进程(2):为什么我的容器里有这么多僵尸进程?你好,我是程远。今天我们来聊一聊容器里僵尸进程这个问题。说起僵尸进程,相信你并不陌生。很多面试官经常会问到这个知识点,用来考察候选人的操作系统背景。通过这个问题,可以了解候选人对Linux进程管理和信号处理这些基础知识的理解......
  • 07 _ Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
    07_LoadAverage:加了CPUCgroup限制,为什么我的容器还是很慢?你好,我是程远。今天我想聊一聊平均负载(LoadAverage)的话题。在上一讲中,我们提到过CPUCgroup可以限制进程的CPU资源使用,但是CPUCgroup对容器的资源限制是存在盲点的。什么盲点呢?就是无法通过CPUCgroup来控制Loa......