【gRPC】1—gRPC是什么

news2024/11/22 16:22:51

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.coloradmin.cn/o/2201106.html

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

相关文章

鸿蒙--播放器状态控制

各个页面共享同一个播放状态,而且可以互相控制,如果传递来传递去会非常的麻烦,但是他们都是Tabs组件内的,我们在index页面提供一个状态,在各个组件接收即可 创建两个子组件,一个是播放控制的子组件&#xf…

1. Oracle 安装报错——环境变量过长

文章目录 1. 报错详细信息2. 解决方案2.1 方案一:修改配置文件cvu_prereq.xml2.2 方案二:修改环境变量配置 1. 报错详细信息 安装 Oracle 过程中,在执行 “先决条件检查” 时报错: 报错内容: This test checks wheth…

【自然语言处理】(3) --RNN循环神经网络

文章目录 RNN循环神经网络一、传统神经网络的问题二、RNN的基本结构三、计算过程4. RNN的局限 总结 RNN循环神经网络 循环神经网络(RNN,Recurrent Neural Network)是一种用于处理序列数据的神经网络模型。其关键特性在于网络节点&#xff08…

现代数字信号处理I-P2概率论学习笔记

目录 学习视频链接: 1. 三要素及关系 2. 期望和方差的定义及基本性质 2.1 期望(均值)定义: 在实际工作中很难获得随机变量的分布或者概率密度,用矩描述随机变量 2.2 期望基本性质: 2.3 方差定义 2.…

Android Studio Koala Feature Drop 稳定版现已推出

作者 / Android Studio 产品经理 Sandhya Mohan Android Studio Koala Feature Drop (2024.1.2) 现已推出!🐨 🔗 Android Studio https://developer.android.google.cn/studio 今年早些时候,我们宣布每个 Android Studio 动物版本…

10月9日笔记(域内用户登录凭据窃取)

缺:BloodHound自动化分析域环境未实现(环境问题) 获取常见应用软件凭据 为了扩大可访问的范围,测试人员通常会搜索各种常见的密码存储位置,以获取用户凭据。一些特定的应用程序可以存储密码,以方便用户管…

python的特殊方法——魔术方法

前言 __init__(self[]) ​编辑 __call__(self [, ...]) __getitem__(self, key) __len__(self) __repr__(self) / __str__(self) __add__(self, other) __radd__(self, other) 参考文献 前言 官方定义好的,以两个下划线开头且以两个下划线结尾来命名的方法…

PostgreSQL学习笔记四:GUI管理工具

PostgreSQL 是一款广泛使用的开源关系数据库管理系统,拥有许多图形用户界面(GUI)工具来帮助用户更高效地管理数据库。以下是一些流行的 PostgreSQL 管理工具: pgAdmin: 一个流行的开源 PostgreSQL GUI 工具&#xff0c…

处理“navicat premium 2003 - 无法在 192.168.10.140 上连接到 MySQL 服务器(10060“未知错误“)”的问题:

以下是一些可能的解决方法来处理“navicat premium 2003 - 无法在 192.168.10.140 上连接到 MySQL 服务器(10060"未知错误")”的问题: **一、检查 MySQL 服务状态** 1. 确认 MySQL 服务是否正在运行。你可以在服务器上通过任务管…

Django makemigrations时出现TypeError: ‘module‘ object is not iterable

使用Python 3.11、Django 5.1.2 写完model进行makemigrations时出现报错 报错的最下面提到了我自己创建的一个应用里的urls.py,尝试着给里面加上一个列表 然后问题解决了。。。 不知道为什么 makemigrations的时候会去检查urls。。。

mybatisPlus对于pgSQL中UUID和UUID[]类型的交互

在PGSQL中&#xff0c;有的类型是UUID和UUID[]这种类型&#xff0c;在mybatis和这些类型交互的时候需要手动设置类型处理器才可以&#xff0c;这里记录一下类型处理器的设置 /*** UUID类型处理器*/ public class UUIDTypeHandler extends BaseTypeHandler<UUID> {/*** 获…

Kubernetes中的pod管理及优化

华子目录 什么是pod1.创建自主式pod&#xff08;生产不推荐&#xff09;优点缺点示例1示例2示例3示例4 2.利用控制器管理pod&#xff08;推荐&#xff09;应用版本的更新 3.利用yaml文件部署应用优点3.1yaml配置文件参数3.2如何获取资源帮助 yaml文件编写示例1.运行简单的单个容…

实现std::sort,replace,fill,accumulate,equal等函数

std::sort /// <summary>/// std::sort 是从小到大排列的/// </summary>/// <typeparam name"IteratorClass"></typeparam>/// <typeparam name"ComparingFunctions"></typeparam>/// <param name"itBegin&qu…

PAT甲级-1150 Travelling Salesman Problem

题目 题目大意 旅行商问题是NP-hard问题&#xff0c;即没有多项式时间内的解法&#xff0c;但是可以验证答案是否正确。给定一个无向图&#xff0c;判断简单环&#xff0c;复杂环和非环。对应“TS simple cycle”、“TS cycle”、“Not a TS cycle”。还要求出环的最小路径权值…

力扣11-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。…

DAY28||39.组合总数 |40.组合总和Ⅱ |131.分割回文串

39.组合总数 题目&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以…

Java基本数据类型转换

一、自动类型转换 1.基本介绍 当Java程序在进行赋值或者运算时&#xff0c;精度小的类型自动转换为精度大的数据类型&#xff0c;这个就是自动类型转换数据类型按精度&#xff08;容量&#xff09;大小进行排序为&#xff1a; ![在这里插入图片描述](https://i-blog.csdnimg.…

数据中心物理安全的历史和演变

在当今的数字时代&#xff0c;数据中心托管已成为我们互联世界的支柱。这些设施在存储、管理和处理我们日常生活所需的大量信息方面发挥着至关重要的作用。从社交媒体平台和电子商务网站到流媒体服务和云计算&#xff0c;数据中心为我们依赖的数字服务提供支持。 随着企业越来…

K8s-资源管理

一、资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务&#xff0c;所谓的部署服务&#xff0c;其实就是在kubernetes集群中…

【图文并茂】【软件无线电】如何用收音机接收图片,如何将图片编码到不同频点上,捕获在频谱上跳动的MIKU

如何将图片编码到不同频点上&#xff0c;捕获在频谱上跳动的MIKU 这篇文章和数字信号处理有关,或者说跟SDR软件无线电有关,只是考虑这样一个问题,如何将一张图片,编码放到不同的频点上,使得接收方能够通过SDR模块,捕获这样的信号,然后通过绘制频谱,来得到我们编码的那张图片。 …