gRPC-第二代rpc服务

在如今云原生技术的大环境下,rpc服务作为最重要的互联网技术,蓬勃发展,诞生了许多知名基于rpc协议的框架,其中就有本文的主角gRPC技术。

一款高性能、开源的通用rpc框架

作者作为一名在JD实习的Cpper,经过一段时间的学习和实践,发现了C++与Java之间的种种不同,这也让我产生了一个想法:既然rpc需要做到的就是客户端无感知调用,那么客户端和服务端使用的语言也不应该成为约束,正巧在来JD实习之前,我就有接触过gRPC,所以就想写一篇文章分析一下gRPC与当今主流rpc框架之间的区别与优势。

对比

1. gRPC的实现原理

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得使用者能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

gRPC的客户端和服务端可以用在多样化的环境中运行,使用者可以使用各种官方支持的语言来构建自己的应用。例如:你可以很轻易的使用Java作为gRPC的服务端,而在客户端使用Ruby、Go、Python等语言。

gRPC调用图

2. gRPC的优势与劣势

2.1 优势:

2.1.1 多语言支持

gRPC官方就支持多种编程语言,包括C#/.NET, C++, Dart, Go, Java, Kotlin, Node.js, Objective-C, PHP, Python, Ruby等。开发人员无需考虑使用何种开发语言,可以充分利用语言的优势:C++的内存操作,go语言的灵活,Java的生态丰富…

2.1.2 基于Protocol Buffers

gRPC默认使用Protocol Buffers作为其接口定义语言(IDL)和底层消息交换格式。Protocol Buffers是一种语言和平台中立的接口描述语言,允许开发者定义数据结构和服务接口,并且可以生成多种语言的代码。这使得在不同语言之间实现数据和服务接口的一致性变得简单。其消息格式采用二进制方式传输,比传统的Json体积更小。

具体的语法定义如下:

  1. 消息定义:在 .proto 文件中定义消息,消息由字段组成。字段有三种类型:required、optional、repeated,分别表示必须、可选和重复。
message Person {
  required string name = 1;
  optional int32 id = 2;
  repeated string email = 3;
}
  1. 枚举定义:枚举类型允许你定义一组有限的可能的值。
enum PhoneType {
  MOBILE = 0;
  HOME = 1;
  WORK = 2;
}
  1. 服务定义:服务允许你定义一组相互关联的RPC(远程过程调用)。
service HelloService {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

4.字段编号:每个字段都有一个唯一的数字编号。这是必要的,因为在解析过程中,我们需要知道每个字段的顺序。在 .proto 文件中定义的每个字段都有默认值。例如,int32 类型的字段默认值为 0。

5.字段类型:每个字段都有一个类型。例如,string、int32、message 等。对于 message 类型的字段,你需要在括号内定义该消息的类型。对于 repeated 类型的字段,你可以将多个值放入一个列表中。例如,Person 消息中的 email 字段可以包含一个电子邮件地址列表。

6.服务调用:在客户端代码中,你可以使用生成的 stub 类来调用服务方法。例如,你可以这样调用 SayHello 方法:

HelloService.stub stub = HelloServiceGrpc.newBlockingStub(channel);
HelloReply response = stub.sayHello(HelloRequest.newBuilder().build());

2.1.3 跨平台兼容性

gRPC支持多种软件和硬件平台。这种跨平台能力意味着gRPC不仅能在不同的操作系统上运行,还能在各种环境中有效运行,如服务器、移动设备和Web环境。

2.1.4 底层调用协议

gRPC使用HTTP/2作为底层传输协议克服了一些HTTP/1.1版本的一些限制。二进制组帧和压缩。 HTTP/2 协议在发送和接收方面均紧凑且高效。在单个 TCP 连接上多路复用多个 HTTP/2 调用。 多路复用可消除队头阻塞。

2.1.5 强大的社区和生态系统

gRPC的社区和生态系统提供了丰富的文档、教程和API参考,帮助开发者在不同的语言和平台上使用gRPC。这种广泛的社区支持也促进了对新语言和平台的支持。例如:Dubbo3对gRPC的支持、gRPC-Swift、gRPC-Spring。

github上的gRPC生态支持

2.1.6 严格规范

具有 JSON 的 HTTP API 没有正式规范。 开发人员为 URL、HTTP 谓词和响应代码的最佳格式争论不休。gRPC 规范对 gRPC 服务必须遵循的格式进行了规定。 gRPC 消除了争论并为开发人员节省了时间,因为 gRPC 在各个平台和实现中都是一致的。

2.2 劣势:

2.2.1 浏览器支持有限

当下,不可能直接从浏览器调用gRPC服务。gRPC大量使用HTTP/2功能,没有浏览器提供支持gRPC客户机的Web请求所需的控制级别。例如,浏览器不允许调用者要求使用的HTTP/2,或者提供对底层HTTP/2框架的访问。

2.2.2 不是人类可读的

HTTP API请求以文本形式发送,可以由人读取和创建。默认情况下,gRPC消息使用protobuf编码。**虽然protobuf的发送和接收效率很高,但它的二进制格式是不可读的8。protobuf需要在.proto文件中指定的消息接口描述才能正确反序列化。需要额外的工具来分析线路上的Protobuf有效负载,并手工编写请求。

grpc与传统rpc相比较

  1. demo展示

下面作者将使用C++与go作为开发语言来展示gRPC强大的跨语言调用能力

项目结构:

grpc-demo
├── cpp
│   ├── CMakeLists.txt // C++的CMakeLists.txt文件,用来生成makefile
│   ├── cmake // 用来存放一些cmake函数
│   │   └── common.cmake // cmake函数
│   ├── include // 头文件
│   ├── proto // Protocol Buffers定义文件
│   │   └── helloworld.proto
│   └── src // C++源文件
│       └── main.cpp
├── go
│   ├── Makefile // makefile脚本
│   ├── go.mod // Go语言包管理
│   ├── proto
│   │   ├── helloworld.proto
│   ├── service
│   └── src // go源文件
│       └── main
│           └── main.go
└── proto
    └── helloworld.proto

项目源代码: https://github.com/ConstantineQAQ/grpc-demo

总结

回归题目,gRPC因为他强大的可扩展性,轻便的底层传输格式,越来越多的企业在技术选型时选择了它,我也希望未来能有一款应用可以通过gRPC发挥出每种语言的优势,绽放出绚丽的色彩。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/432185.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】深度学习基础知识——梯度下降详解和示例

尽管梯度下降(gradient descent)很少直接用于深度学习,但它是随机梯度下降算法的基础,也是很多问题的来源,如由于学习率过大,优化问题可能会发散,这种现象早已在梯度下降中出现。本文通过原理和…

【控制台警告】npm WARN EBADENGINE Unsupported engine

今天用webpack下载几个loader依赖,爆出了三个警告,大概的意思就是本地安装的node和npm的版本不是很匹配? 我的解决思路是: 先检查node和npm版本 然后去官网查找版本的对应 靠,官网404 Node.js (nodejs.org) 就找到…

第十二篇:学习python数据清洗

文章目录 一、啥是数据清洗二、将表格数据导入pandas中1. 准备工作2. 引入csv文件2.1 引入pandas库2.2 读取文件/修改名称3.2 快速浏览数据2.4 修改名字2.5 查找缺失值2.6 删除缺失值 3. 引入Excel文件3.1 引入pandas库3.2 读取Excel文件的人均GDP数据3.3 查看数据类型和non-nu…

【鸿蒙 HarmonyOS 4.0】弹性布局(Flex)

一、介绍 弹性布局(Flex)提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴方向的尺寸称为主轴尺寸,在交叉轴方向的尺寸称为交叉轴尺寸…

六、软考-系统架构设计师笔记-软件工程基础知识

1、软件工程 软件工程是将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件并对上述方法的研究。 软件要经历从需求分析、软件设计、软件开发、运行维护,直至被淘汰这样的全过程,这个过程称为软件的生…

什么是聚簇索引与非聚集索引和区别?

什么是聚簇索引与非聚集索引和区别? 按物理存储分类:InnoDB的存储方式是聚集索引,MVISAM的存储方式是非聚集索引 test innodb.frm 测试 innodb.ibd Frame表结构 数据表索引数据 test myisam.frm ---->Frame表结构test myisam.MYD_---数据表数据test_myisam.MYl-…

HTML实体字符列表,必看

HTML、CSS、JS三大部分都起什么作用? HTML内容层,它的作用是表示一个HTML标签在页面里是个什么角色;CSS样式层,它的作用是表示一块内容以什么样的样式(字体、大小、颜色、宽高等)显示;JS行为层…

【论文笔记】Language Models are Unsupervised Multitask Learners

Language Models are Unsupervised Multitask Learners 回顾一下第一代 GPT-1 : 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式;模型架构是基于 Transformer 的叠加解码器(掩码自注意力机制、残差、Layernorm…

【Unity】ABB CRB 15000 外部引导运动

一、RobotStudio控制器的文件系统和配置参数 HOME:控制器文件系统的根目录或起始点。配置:机器人控制器的配置设置和参数。外件信息:连接到机器人的外部组件的信息。I/O 系统:输入/输出系统,管理机器人和外部设备之间的…

.[[backup@waifu.club]].wis最近多发,数据库被加密了能恢复吗?

Wis勒索病毒是怎样加密文件的? WIS勒索病毒加密文件的过程主要依赖于强大的加密算法,通常是RSA或AES等对称或非对称加密算法。这些算法可以非常快速地将用户的文件加密,使得文件在没有正确密钥的情况下无法被正常读取或打开。技术服务号&…

C#与欧姆龙PLC实现CIP通讯

参考文档: 欧姆龙PLC使用-CSDN博客 CIP通讯介绍(欧姆龙PLC)-CSDN博客 使用NuGet添加引用:CIPCompolet 基础参考我的CIP协议介绍,默认TCP端口为:44818 类NXCompolet 类的功能可以在安装PLC开发软件后帮…

Mol2文件处理-拆分、合并、提取名称、计数与格式转换

欢迎浏览我的CSND博客! Blockbuater_drug …点击进入 文章目录 前言一、Mol2文件合并二、Mol2文件拆分为含有单个分子的文件三、Mol2文件分子名称修改与提取3.1 分子名称修改去除空格3.2 文件名称提取 四、Mol2文件包含分子计数4.1 Mol2文件中分子计数4.2 分子计数传…

Pytorch学习 day03(Tensorboard、Transforms)

Tensorboard Tensorboard能够可视化loss的变化过程,便于我们查看模型的训练状态,也能查看模型当前的输入和输出结果 在Pycharm中,可以通过按住ctrl,并左键点击某个库来进入源文件查看该库的使用方法SummaryWriter是用来向log_dir…

工具函数模板题(蓝桥杯 C++ 代码 注解)

目录 一、Vector容器: 二、Queue队列 三、Map映射 四、题目(快递分拣 vector): 代码: 五、题目(CLZ银行问题 queue): 代码: 六、题目(费里的语言 map&…

通过 JS 获取和修改表单元素属性和样式属性

JS 获取和修改表单元素属性 表单(主要是指 input 标签)的以下属性都可以通过 DOM API来修改 value: input 的值checked: 复选框会使用selected: 下拉框会使用disabled: 禁用type: input 的类型(文本, 密码, 按钮, 文件等) 修改 input 的值 > value 示例1: 点击切换状态的…

【CSP试题回顾】202212-2-训练计划

CSP-202212-2-训练计划 解题思路 输入和初始化: 首先,代码从输入中获取项目的截止日期和项目数量。然后,它初始化一个项目列表,每个项目都有其依赖项、被依赖的项目集合、完成时间、总完成时间(包括依赖链&#xff09…

深度学习模型部署(番外3)神经网络不同层的量化方法

神经网络层量化 批归一化层Batch Normalization(BN层) 关于归一化的原理可以看之前的这篇blog:BatchNorm原理与应用 批归一化在推理过程中会被融合到上一层或者下一层中,这种处理方式被称为批归一化折叠。这样可以减少量化,也可以减少属于的…

EPSON RA8000CE (RTC模块)压电侠

RA8000CE是一个集成了32.768 kHz数字温度补偿晶体振荡器(DTCXO)的RTC模块。它包括各种功能,如具有闰年校正的秒到年时钟/日历,时间警报,唤醒计时器,时间更新中断,时钟输出和时间戳功能,可以在外部或内部事件…

python 蓝桥杯填空题

文章目录 字母数判断列名(进制问题)特殊日期 字母数 由于是填空题,那么寻找的话,就直接让每一个位置都是A,通过计算看看是不是结果大于2022即可 判断列名(进制问题) 这道题目,我们可以往数字进制…

基于“xxx” Androidx平台的驱动及系统开发 之 触摸板篇

目录 一、基于全志 A133 Android10平台,适配1366x768 - ilitek2511触摸1、原理图分析2、驱动移植与适配3、补丁和资源文件 二、基于瑞芯微 RK3566 Android11平台,适配GT9XX触摸1、原理图分析2、补丁及资源文件 三、遇到的问题与解决1、基于amlogic Andro…