【gRPC】1—gRPC是什么

gRPC是什么

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

📖RPC专栏:https://blog.csdn.net/weixin_53580595/category_12368218.html

文章目录

  • gRPC是什么
    • 1 RPC框架
      • 1.1 序列化协议
      • 1.2 传输层
      • 1.3 动态代理层
    • 2 gRPC特色
    • 3 HTTP/2协议简介
      • 3.1 协议协商
      • 3.2 多路复用
      • 3.3 流控机制


因为博主工作需要💼,在平时用的是gRPC协议作为远程调用,所以在这里开个新坑详细梳理一下gRPC的工作方式与底层实现,如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆

gRPC是一款高性能开源通用的RPC框架,同时面向服务端跟移动端,基于HTTP/2协议设计。gRPC不是一款服务治理框架,但是提供了服务治理的若干原材料,例如客户端负载均衡、KeepAlive、流控(自动跟手动)等等。下面简单介绍一下何为RPC框架,gRPC作为RPC框架的特点和依赖的重要协议 – HTTP/2协议

1 RPC框架

在这里插入图片描述

一个RPC框架的基本构成如上图所示,主要包括如下几个部分:

1.1 序列化协议

万物皆字节,我们需要一种途径将万物转化为字节序列在网络传输,这个转化器便是序列化协议,常见如Java原生序列化协议、Thrift、Hession、Json/XML、ProtoBuf。

1.2 传输层

目前而言主要是TCP/UDP,对于Java生态而言大多使用NettyAPI来屏蔽底层实现细节。

1.3 动态代理层

屏蔽业务感知远程调用,等同于一个本地服务调用一般

2 gRPC特色

  1. 支持多语言(其实是每个语言实现了一遍…)
  2. 基于IDL定义服务,即proto文件(其实是使用了Protocol Buffers协议,ProtoBuf也没大家想象中的那么好,第二章节会进行说明),每个语言提供一个代码生成工具,因此可以基于同一份proto生成不同语言的文件从而支持跨语言使用
  3. 序列化支持PB、JSON等,支持自定义Marshaller
  4. Client支持Netty跟Okhttp(一般给客户端使用的),Server是Netty;同时Client与Server都支持InProcess方式调用(可以理解为Mock)
  5. 暴露较多LowLevel API(类似StreamObserver,XXXCall之类的给使用者),在gRPC API设计思路子节中会详细讲解它为何这么做
  6. 对于实现全链路异步而言,个人认为gRPC是首选,会在第五章进行详细介绍如果实现Reactive-gRPC

3 HTTP/2协议简介

想要理解好gRPC必须了解HTTP/2协议,因为不论是日常看到的异常栈还是gRPC涉及的相关定义都跟HTTP/2存在强绑定的关系。关于HTTP/2详细介绍请参见:https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-CN

本文简单介绍跟gRPC息息相关的几个概念:

3.1 协议协商

  • HTTP/2部署需要基于HTTPS是当前主流浏览器的要求,但是并非强制,因此主要包括如下两种协商类型:

    1. 基于TLS的HTTP/2协议,使用h2标识(ALPN);
    2. 基于TCP的HTTP/2协议,使用h2c标识;
  • gRPC客户端跟服务端建立连接时会进行协议协商,过程如下:

    1. 客户端在不确定服务端是否支持HTTP/2的情况下发起协商升级请求,如果服务端支持HTTP/2会通过header带回来Upgrade:h2/h2c标识,如果不支持就默认按照HTTP/1.1返回;
    2. 协议协商成功后,如果使用HTTP/2协议双方会互发SETTINGS帧(下面会介绍)作为连接序言,回执后开始发送数据,Client侧可以不必等待Server的回执来提高效率;
  • gRPC支持的三种协议协商策略

    1. PlainText:明确服务端支持HTTP/2协议,省去上述协商升级过程,直接通过SETTINGS帧作为连接序言建立连接后即可发送数据帧;
    2. PlainTextUpgrade: 不清楚服务端是否支持HTTP/2,即2中描述的内容;
    3. TLS:基于TLS建立HTTP/2连接,协商采用ALPN扩展协议,以h2作为标识;

3.2 多路复用

  1. 这里多路复用是指多个请求使用同一个连接互相不干扰,跟操作系统select/epoll的多路复用不是一个概念
  2. 在HTTP/1.X里面双方想并行发多个请求必须占用多个连接,占用连接资源;同时FIFO的方式如果前面请求处理时间长也会导致队首阻塞(需要明确的是这里不是指TCP的队首阻塞,HTTP/2解决不了TCP队首阻塞问题,HTTP/3可以)问题,效率低下;HTTP/2通过抽象Stream概念来实现多路请求复用同一连接
  3. HTTP/2中双方建立连接之后,每个实际报文请求可以理解为一个Stream,一个Stream又分成若干个Frame(帧是最小的传输单元),数据传输主要包括Header Frame跟Data Frame。每个Stream都分配一个StreamId。gRPC内部也是通过StreamId来识别不同请求的报文
  4. 常见的帧类型:
    • SETTINGS帧:用于设置连接级别的配置,协议协商与流控窗口变更相关依赖于它;
    • PING帧:用于心跳保持,gRPC KeepAlive就是利用这个帧实现;
    • GOAWAY帧:发起关闭连接请求时候使用,通常是连接达到IDLE状态之后;
    • RST_STREAM帧:关闭当前流的帧,gRPC会经常用到,特别是当错误发生的时候;
    • WINDOW_UPDATE帧:流控帧,gRPC的流控实现依赖于它;
    • DATA帧:实际传输数据帧,如果数据发送完毕会带END_STEAM标识;
    • HEADER帧:消息头帧,通常是一个请求开始帧,基于此帧创建请求初始化相关内容;

3.3 流控机制

  1. 流控机制是确保同一个TCP连接上的Stream不会互相干扰,因为TCP毕竟也有其局限性
  2. 流控机制同时作用于单个Stream和整个连接,对于Stream而言只作用于Data帧(保证不影响重要帧)
  3. 初始窗口大小都是65535字节,发送端需要严格遵守接收端的窗口限制,连接序言中可以通过SETTINGS帧设置SETTINGS_INITIAL_WINDOW_SIZE来指定Stream的初始窗口大小,但是无法配置连接级别的初始窗口大小,gRPC支持设置初始窗口的大小,后续文章内容会详细介绍
  4. gRPC通过WINDOW_UPDATE帧来实现流量控制,但相关说明如下:
    • gRPC支持自定义流控但默认没开启,仍处于VisableForTesting阶段;使用Netty内置的默认流控功能:基本思路就是当已经处理过的数据超过窗口一半是就发送WINDOW_UPADTE来更新窗口;
    • gRPC默认流控初始窗口大小是1M;
    • gRPC如果开启KeepAlive功能那么Ping也会占用窗口大小;
    • gRPC默认给每个Stream分配的字节数是16K;
    • gRPC内部支持的自动跟手动流控,只是针对gRPC本身而言,这里流控的含义是Client何时发起从buffer中读取需要数据的请求,类似于一种应用层级的流控,默认是自动的,当有特殊需求时可以开启手动控制,但是比较复杂而且容易出错,不推荐使用;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

脉冲下跳沿提取电路

本例中的电路可将负脉冲转换为正脉冲。尽管这个任务看似简单,但负脉冲的幅度为-5V~-2V。按照不同应用要求,正脉冲也需要不同的脉冲宽度,而负脉冲是梯形的。脉冲必须先经过一个长距离的传输线才能到达某个控制设备。有多个电路可以解决这一问题…

jQuery——解决快速点击翻页的bug

本文分享到此结束,欢迎大家评论区相互讨论学习,下一篇继续分享jQuery中内置动画的学习。

谷歌AI大模型Gemini API快速入门及LangChain调用视频教程

1. 谷歌Gemini API KEY获取及AI Studio使用 要使用谷歌Gemini API,首先需要获取API密钥。以下是获取API密钥的步骤: 访问Google AI Studio: 打开浏览器,访问Google AI Studio。使用Google账号登录,若没有账号&#xf…

大数据ETL数据提取转换和加载处理

什么是 ETL? 提取转换加载(英语:Extract, transform, load,简称ETL),用来描述将资料从来源端经过抽取、转置、加载至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。 ETL&…

C++竞赛初阶—— 石头剪子布

题目内容 石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比…

Spring Cloud Netflix Zuul 网关详解及案例示范

1. 引言 在微服务架构中,API 网关作为服务间通信的入口,扮演着重要的角色。Netflix Zuul 是一个提供动态路由、监控、安全等功能的 API 网关服务器,它可以为微服务系统提供统一的入口,简化服务间的交互。在业务系统中&#xff0c…

【计网】【计网】从零开始学习http协议 ---理解http重定向和请求方法

去光荣地受伤, 去勇敢地痊愈自己。 --- 简嫃 《水问》--- 从零开始学习http协议 1 知识回顾2 认识网络重定向3 http请求方法3.1 http常见请求方法3.2 postman工具进行请求3.3 处理GET和POST参数 1 知识回顾 前面两篇文章中我们学习并实现了http协议下的请求与应…

Linux 命令 netstat 的 10 个基本用法

Netstat 简介 Netstat 是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字。如果你想确认系统上的 Web 服务有没有起来…

行为设计模式 -观察者模式- JAVA

观察者模式 一.简介二. 案例2.1 抽象主题(Subject)2.2 具体主题(Concrete Subject)2.3 抽象观察者(Observer)2.4 具体观察者(Concrete Observer)2.5 测试 三. 结论3.1 优缺点3.2 使用…

STM32外设详解——ADC

来源:铁头山羊 基本概念 ①ADC是模数转换器的统称,stm32f103c8t6内部集成了2个12位主次逼近型ADC,外设名称为ADC1、ADC2。 ② 采样深度为12位意味着ADC可以将0~3.3V的模拟电压等比转换为0~4095的数字值(分割为2的12次方份&…

网 络 安 全

网络安全是指保护网络系统及其所存储或传输的数据免遭未经授权访问、使用、揭露、破坏、修改或破坏的实践和技术措施。网络安全涉及多个方面,包括但不限于以下几个方面: 1. 数据保护:确保数据在传输和存储过程中的完整性和保密性,…

银河麒麟V10安装ToDesk远程控制

银河麒麟V10安装ToDesk远程控制 ARM版本安装 1.下载arm的deb包 wget https://dl.todesk.com/linux/todesk_4.0.3_aarch64.deb2.安装 sudo apt-get install ./todesk_4.0.3_aarch64.deb3.启动todesk todesk

文献翻译用什么软件?新手建议收藏这5个

在学术研究的广阔天地里,语言障碍往往是科研人员不得不跨越的一道难关。 面对海量的外文文献,如何高效、准确地获取其中的信息,成为了许多学者关注的焦点。 想知道文献翻译器推荐哪一个?今天这篇文章为大家推荐5个优秀的文献翻译…

如何制作低代码开发的视频教程?

如何制作低代码开发的视频教程? 随着数字化转型的加速,越来越多的企业和组织开始采用低代码开发平台来加速应用程序的构建。对于许多开发者和业务人员来说,学习如何使用这些平台可以显著提高工作效率。因此,创建一份清晰、实用且…

02_InFluxDb

InFluxDb 初始化初始化流程 交互InFluxDbWebUI交互 数据模型行协议添加标签数据格式 数据类型空格索引 Flux语言 初始化 初始化流程 用户 密码 组织名称 Bucket—mysql里面的数据库概念 交互InFluxDb 暂用了8086端口.提供了 http api WebUI交互 略... 数据模型 这是mys…

无源有损耗导电介质的平面电磁波——复数介电常数带来复波数k(导致幅度衰减)和复波阻抗(带来磁场电场相位不同)

推导中以εμσ是实数为假设 注意在线性介质中J 0和σ等于0其实是一个条件,因为J σE 线性介质的麦克斯韦方程 线性介质无源无损耗条件下 线性介质无源有损耗导电介质下 无源有损耗的复数麦克斯韦方程组,只有方程二与无源无损耗的麦克斯韦方程组不同…

双十一选购攻略:2024年双十一有什么值得入手好物?

又到一年双11,还有很多持币观望的小伙伴,可能还没想要买什么,所以我就来啦,给大家参谋参谋,结合我生活中的好物使用经验,来跟大家做个分享,如果能给已经进入双11“买买买”节奏的你一些参考&…

java.lang.NoClassDefFoundError: kotlin/Result解决方案

问题 在控制窗口上虽然报错是找不到对应的class,但是呢在我们导入kotlin的后,还是报相同的异常,在网上查找了各种资料,都没有解决方案。 问题分析 在idea2021之后,kotlin都使用远程仓库(kotlinx-coeouti…

C语言 动态数据结构的C语言实现内存映像

C程序的内存映像 C程序中变量的内存分配方式  C程序中变量的内存分配方式  从静态存储区分配  全局变量和静态变量 C程序中变量的内存分配方式  从静态存储区分配  全局变量和静态变量  在栈上分配  存放函数参数值,局部变量值等  …

1.1 flexsim基础入门

连线和端口 A:连接 S:中间端口连接 (经常用于货物搬运的时候,中间端口连接属于无方向连接) 假设有一个任务分配器,用来分配任务。暂存区与任务分配器连接,说明通过任务分配器作为中间商下达任务…