Golang架构直通车——理解gRPC

2023-10-31

gRPC概述

gRPC具有以下特点:

  • 基于HTTP/2和Protobuf3的通用rpc框架, 继而提供了连接多路复用、Body 和 Header 压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU使用和延长电池寿命等。
  • 支持服务端-服务端,客户端-服务端通信,由于使用了http2所以并不局限于服务器集群之间的通信。
  • IDL层使用了使用Protobuf3,多语言支持,非常适合团队的接口设计。

主要缺陷:

  • GRPC尚未提供连接池,需要自行实现
  • 尚未提供“服务发现”、“负载均衡”机制

关键技术——HTTP/2

HTTP/2 的主要目标是通过支持完整的请求与响应复用来减少延迟,通过有效压缩 HTTP 标头字段将协议开销降至最低,同时增加对请求优先级和服务器推送的支持。 为达成这些目标,HTTP/2 还给我们带来了大量其他协议层面的辅助实现,例如新的流控制、错误处理和升级机制。

HTTP/2 没有改动 HTTP 的应用语义。 HTTP 方法、状态代码、URI 和标头字段等核心概念一如往常。 不过,HTTP/2 修改了数据格式化(分帧)以及在客户端与服务器间传输的方式。

在这里插入图片描述

  • 双向数据流
    建立链接后,客户端和服务端均可主动发起请求(客户端和服务端序列号是以奇数和偶数开始自增的)。
  • 多路复用和流控
    采用多路复用的方式,在一条链接上可以跑多个请求,可以通过流控的方式按请求权重做控制。而HTTP/1.x 客户端需要使用多个连接才能实现并发和缩短延迟。
  • 头部压缩
    由于http1每个请求都会带有一大堆header,比如cookie啊之类的,这是http1的痛点(HTTP/1.x 不会压缩请求和响应标头,从而导致不必要的网络流量)。这会导致一些请求虽然用不到这个cookie,但是仍然会在请求时携带这些cookie,导致一个请求会多发很多个字节。
    头部压缩后,重复的header只需要发一次,相当于有动态表和静态表的概念:简单来说就是把一些重复的header固定下来,而之后的请求只需要发送diff的header,或者说与之前header不同的部分。
  • 内置安全(SSL/TSL支持)

二进制分帧层

HTTP/2 所有性能增强的核心在于新的二进制分帧层,它定义了如何封装 HTTP 消息并在客户端与服务器之间传输。HTTP/1.x 协议以换行符作为纯文本的分隔符,而 HTTP/2 将所有传输的信息分割为更小的消息和帧,并采用二进制格式对它们编码

新的二进制分帧机制改变了客户端与服务器之间交换数据的方式。 为了说明这个过程,我们需要了解 HTTP/2 的三个概念:

  • 数据流:已建立的连接内的双向字节流,可以承载一条或多条消息
  • 消息:与逻辑请求或响应消息对应的完整的一系列帧
  • 帧:HTTP/2 通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流

简单来说,所有通信都在一个 TCP 连接上完成(复用,当然如果由于解码、编码都在一个CPU上完成,为了追求效率也可以用多个连接),此连接可以承载任意数量的双向数据流。每个数据流都有一个唯一的标识符和可选的优先级信息,用于承载双向消息。每条消息都是一条逻辑 HTTP 消息(例如请求或响应),包含一个或多个帧。来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。

在这里插入图片描述

在 HTTP/1.x 中,如果客户端要想发起多个并行请求以提升性能,则必须使用多个 TCP 连接,HTTP/2 中新的二进制分帧层突破了这些限制,实现了完整的请求和响应复用:客户端和服务器可以将 HTTP 消息分解为互不依赖的帧,然后交错发送,最后再在另一端把它们重新组装起来。

数据流优先级

将 HTTP 消息分解为很多独立的帧之后,我们就可以复用多个数据流中的帧,客户端和服务器交错发送和传输这些帧的顺序就成为关键的性能决定因素。 为了做到这一点,HTTP/2 标准允许每个数据流都有一个关联的权重和依赖关系

  • 可以向每个数据流分配一个介于 1 至 256 之间的整数。
  • 每个数据流与其他数据流之间可以存在显式依赖关系

数据流依赖关系和权重的组合让客户端可以构建和传递“优先级树”,表明它倾向于如何接收响应。
在这里插入图片描述

如上面的示例所示,数据流依赖关系和权重的组合明确表达了资源优先级,这是一种用于提升浏览性能的关键功能,网络中拥有多种资源类型,它们的依赖关系和权重各不相同。

注意:这里的资源优先级并不能保证特定的传输顺序,它保证的是分配的处理资源权重。

流控制

流控制是一种阻止发送方向接收方发送大量数据的机制,以免超出后者的需求或处理能力。

例如,客户端可能请求了一个具有较高优先级的大型视频流,但是用户已经暂停视频,客户端现在希望暂停或限制从服务器的传输,以免提取和缓冲不必要的数据。 再比如,一个代理服务器可能具有较快的下游连接和较慢的上游连接,并且也希望调节下游连接传输数据的速度以匹配上游连接的速度来控制其资源利用率;等等。

HTTP/2 未指定任何特定算法来实现流控制。 不过,它提供了简单的构建块并推迟了客户端和服务器实现,可以实现自定义策略来调节资源使用和分配,以及实现新传输能力,同时提升网页应用的实际性能和感知性能。

服务器推送

HTTP/2 新增的另一个强大的新功能是,服务器可以对一个客户端请求发送多个响应。 换句话说,除了对最初请求的响应外,服务器还可以向客户端推送额外资源,而无需客户端明确地请求。

HTTP/2 打破了严格的请求-响应语义,支持一对多和服务器发起的推送工作流,在浏览器内外开启了全新的互动可能性。为什么在浏览器中需要一种此类机制呢?一个典型的网络应用包含多种资源,客户端需要检查服务器提供的文档才能逐个找到它们。 那为什么不让服务器提前推送这些资源,从而减少额外的延迟时间呢? 服务器已经知道客户端下一步要请求什么资源,这时候服务器推送即可派上用场。

事实上,如果您在网页中内联过 CSS、JavaScript,或者通过数据 URI 内联过其他资产,那么您就已经亲身体验过服务器推送了。

标头压缩

在 HTTP/1.x 中,此元数据始终以纯文本形式,通常会给每个传输增加 500–800 字节的开销。如果使用 HTTP Cookie,增加的开销有时会达到上千字节。
而利用霍夫曼编码,可以在传输时对各个值进行压缩,而利用之前传输值的索引列表,我们可以通过传输索引值的方式对重复值进行编码,索引值可用于有效查询和重构完整的标头键值对。
在这里插入图片描述

作为一种进一步优化方式,会包含一个静态表和一个动态表:静态表提供了一个包含所有连接都可能使用的常用 HTTP 标头字段的列表;动态表最初为空,将根据在特定连接内交换的值进行更新。 因此,为之前未见过的值采用静态 Huffman 编码,并替换每一侧静态表或动态表中已存在值的索引,可以减小每个请求的大小。

gRPC Stream

在这里插入图片描述

  • 简单 RPC ( Simple RPC )
    这就是一般的rpc调用,一个请求对象对应一个返回对象。
  • 服务端流式 RPC ( Server-side streaming RPC )
    一个请求对象,服务端可以传回多个结果对象
  • 客户端流式RPC ( Client-side streaming RPC )
    客户端传入多个请求对象,服务端返回一个响应结果
  • 双向流式RPC ( Bidirectional streaming RPC )
    结合客户端流式rpc和服务端流式rpc,可以传入多个对象,返回多个响应对象

gRPC Gateway

使用grpc也会面临一个问题,我们的微服务对外一定是要提供Restful接口的(我们通常把RPC用作内部通信,而使用Restful Api进行外部通信)。为了避免写两套应用,我们使用grpc-gateway把gRPC转成HTTP。服务接收到HTTP请求后,grpc-gateway把它转成gRPC进行处理,然后以JSON形式返回数据。
简单来说Gateway相当于是gRPC和http之间的代理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang架构直通车——理解gRPC 的相关文章

  • 战舰世界选服务器删除什么文件夹,《战舰世界》常见问题解决方案合集

    虚拟内存导致的无前提闪退 表现为 1 无弹出窗口 2 闪退后桌面分辨率会突然变大然后变正常 问题常出现于 win7 win8 1 win10 x86框架下的32位系统 解决方法 修改虚拟内存为系统实际物理内存的1 5倍 例如我是win10
  • [Win11] PowerShell无法激活Conda虚拟环境

    目录 一 问题背景 二 解决方案 一 问题背景 按照教程1安装Typora时 需使用PowerShell执行Python命令 然而 Win11 PowerShell无法激活Conda虚拟环境 报错如下图所示 二 解决方案 根据报错 发现无法
  • Vue.js实战读书笔记--计算属性

    计算属性 3 1 什么是计算属性 在双方绑定过程中如果有过长的数据 表达式或者复杂逻辑业务时 应将所有的计算属性都以函数的形式写在Vue实例的computed选项内 最终返回计算后的结果 举例 改写前 div text split reve
  • ESP32-C3系列模组简介

    ESP32 C3是一款安全稳定 低功耗 低成本的物联网芯片 搭载RISC V 32位单核处理器 为物联网产品提供行业领先的射频性能 完善的安全机制和丰富的内存资源 嵌入式智能终端 无线WIFI技术以及Internet的广泛应用必将使家居控制
  • [Python系列-15]:人工智能 - 数学基础 -5- 向量内积(点乘)和外积(叉乘)概念及几何意义

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119322764 TBD ht
  • 听我一句劝,千万别去外包,两年外包生涯做完,感觉自己废了一半....

    先说一下自己的情况 大专生 18年通过校招进入湖南某软件公司 干了接近5年的点点点 今年年上旬 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了五年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • 基础爬虫记~豆瓣+东方财富网爬虫

    基础小白 大佬轻点喷 一 基础豆瓣爬虫 1 首先在某站上听讲解 简单建立起了对爬虫的基础框架 具体包括五个板块 当然 有些东西看个人 可写成函数 也可以直接写 但重复用到的东西建议写函数 用到了下面五个库 from bs4 import B
  • 第五周:基于PIL的Python图像处理

    安装PIL注意 不是pip install Python Image Library 而是Pip install pillow pip算是PIL的一个分支 借助它我们可以完成 图像基本操作 缩放 裁剪 旋转 色彩转换 1 引用PIL fro
  • Linux Ubuntu 20.04LTS安装OpenSSL步骤

    其实 Ubuntu 20 04LTS 系统自带 OpenSSL 的 但是这个自带的openssl是没有 lt 头文件 h gt 和 lt 动态库文件 so及静态库文件 a gt 对于开发人员编程来说用不了 编译就报错找不到头文件 接口未定义
  • sqli-labs————less 23(高级注入篇)

    前言 从这一关开始 我们进进入了短暂的高级注入部分 这一部分中将会陆续介绍一些更为巧妙的注入技巧 Less 23 查看一下源代码
  • VS2013及QT安装

    参考如下链接 QT下载 QT下载 VS2013及QT安装 https jingyan baidu com article e8cdb32b132cd637052bade4 html
  • egg.js + mysql + windows 踩坑全纪录

    资料 egg js文档 https www eggjs org zh CN intro quickstart 背景 前面的都很简单 按照官方文档配置即可 全部调通以后 开始接触数据库mysql 因为米有后台开发背景 所以需要从头开始 步骤
  • Error:java: 无法从静态上下文中引用非静态 变量 this

    Error java 无法从静态上下文中引用非静态 变量 this 分析 出现这种错误首先先分清什么是静态什么是非静态 它们之间的关系是什么 静态方法中不能引用非静态变量 非静态方法中能引用静态变量 错误原因代码如下 public clas
  • 关于pd.read_excel()读取xls文件报错的解决办法

    报错信息 File E Python lib site packages xlrd compdoc py line 426 in locate stream raise CompDocError s corruption seen d d
  • 电商数据部分展示

    京东链接 商品id 标题 价格部分数据展示 淘宝标题 价格 优惠价格 链接部分数据展示
  • 跳动的爱心(c++版)

    include
  • 科教兴国

    在这个时代 人工智能的奇迹交织成一片璀璨的星河 在这片星河中 各大企业如同星辰 闪烁着探索的光芒 寻找着那些志同道合的伙伴 我们并肩飞翔 穿越信息的海洋 共同描绘出未来的蓝图 每一次合作 都如同星星之间的碰撞 擦出创新的火花 为这个时代注入

随机推荐

  • Linux安装JDK、Redis、MySQL、RabbitMQ、Minio、Nginx.......

    文章目录 一 环境准备 二 安装JDK 三 安装MySQL 四 安装Redis 三 安装RabbitMQ 四 安装Minio 五 安装Nginx 特殊情况处理 Centos7挂载磁盘 服务器时间同步 MySQL数据库时间同步 安装解压软件
  • LeetCode题目笔记——2357. 使数组中所有元素都等于零

    文章目录 题目描述 题目链接 题目难度 简单 方法一 直接模拟 代码 Python 方法二 哈希表 代码 Python 总结 题目描述 给你一个非负整数数组 nums 在一步操作中 你必须 选出一个正整数 x x 需要小于或等于 nums
  • Android APK反编译详解(附图)

    在学Android应用开发 在想既然是用Java开发的应该很好反编译从而得到源代码吧 google了一下 确实很简单 以下是我的实践过程 在此郑重声明 贴出来的目的不是为了去破解人家的软件 完全是一种学习的态度 不过好像通过这种方式也可以去
  • 二分法查找两个有序数列的中位数

    背景 输入两个有序数列 a a1 a2 an 其中a1
  • LayUI导入excel功能

    第一种导入 div class layui form block div
  • 2个红外传感器循迹原理_智能循迹小车

    今天我们来学习制作智能循迹小车 那么什么是智能小车呢 智能小车作为现代的新发明 是以后的发展方向 它可以按照预先设定的模式在一个环境里自动的运作 不需要人为的管理 可应用于科学勘探等等的用途 智能小车能够实时显示时间 速度 里程 具有自动寻
  • Go基础:数据结构(定义和go语言实现)

    目录 前言 一 数组 Array 1 优缺点 2 适用场景和不适用场景 二 切片 Slice 1 优缺点 2 适用场景和不适用场景 三 链表 Linked List 1 优缺点 2 适用场景和不适用场景 四 栈 Stack 1 优缺点 2
  • 退役一年感悟

    不知不觉 退役已经快有一年了 前几天突发奇想登上了洛谷 就看见距离 CSP2020 只有一周了 不禁感慨时间之快 刚刚考完 CSP2019 后 思绪一直很混乱 我很难受 很不甘 感觉自己的实力并没有充分展现出来 我分明学过更难 更高深的知识
  • 技术人员的赚钱之道-9:极思极恐,技术人员需了解的“穷人”思维与“富人”思维的差别

    认识到自己的不足 是自我完善的前提 完善自己的不足 持续的改进 也算是Agile思想的体现 反复阅读 时常刷新自己的认知局限 省钱与花钱 穷人的思维是如何存钱 勤俭持家 富人的思维是如何让钱生钱 增值盈利 因此富人会尽量把钱花出去 不是消费
  • 如何通过IDEA查看注解逻辑实现

    日常写代码的过程中会使用到很多Spring框架提供的注解 也会读到别人写的自定义注解 很多时候会好奇注解背后的实现逻辑 本文就简单地记录一下 如何通过代码中的注解 使用IDEA定位到注解的逻辑实现位置 以下方法适用于官方注解 自定义注解 以
  • 27、Docker 镜像命令

    1 镜像相关命名2 镜像操作命令 0 docker help 查看帮助文档 1 docker image 查看所有镜像 2 docker pull 从服务拉去镜像 3 docker save 将镜像保存为一个压缩包 4 docker rmi
  • 在struts框架下实现文件的上传

    由于jspsmartupload上传文件 当前端页面没有file控件时 后端用jspsmartupload控件upload时将会走入一个死循环 现在采用struts自己提供的功能实现文件的上传 1 前端页面upload jsp
  • vue3进阶-----单文件组件

    目录 三 vue3进阶 1 单文件组件 1 1组件定义 重塑经脉 断了 1 2单文件组件 SFC 独立日 1 3Vue CLI创建项目 锅灶升级 1 4 vuecli选项介绍 1 5 VueCLI创建项目 风云再起 index html m
  • redis入门笔记

    文章目录 redis安装 redis启动 redis中key的操作 redis数据类型 1 Redis 字符串 String 2 Redis列表 List 3 Redis集合 Set 4 Redis哈希 Hash 5 Redis有序集合Zs
  • LVGL8制作简易时钟

    通过这两天对LVGL8的部分控件和样式的学习 自己制作了一个简易时钟 可显示时间 日期 星期 用到的主要有样式 布局等对象 还是通过codeblock来模拟代码的运行 代码如下 typedef struct lv clock lv obj
  • The 19th Zhejiang Provincial Collegiate Programming Contest

    文章目录 A JB Loves Math https codeforces com gym 103687 problem A B JB Loves Comma https codeforces com gym 103687 problem
  • 2023华为OD机试真题Java实现【动态规划/找出重复代码】

    题目描述 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给出两行代码 字符审长度1 lt length lt 100 由英文字母 数字和空格组成 找出两行代码
  • MQ相关知识

    http bijian1013 iteye com category 359051 一 操作系统是否有安装该软件 查看版本 dspmqver 一 查看队列管理器运行状态 dspmq 显示结果中QMNAME表示MQ队列管理器的名称 STATU
  • docker基础

    目录 Docker架构图 Dockers常用命令 系统命令 版本信息 系统信息 帮助命令 镜像命令 docker image 搜索镜像 拉取镜像 查看本地镜像 删除镜像 容器命令 docker container 创建容器 查看容器 删除容
  • Golang架构直通车——理解gRPC

    文章目录 gRPC概述 关键技术 HTTP 2 二进制分帧层 数据流优先级 流控制 服务器推送 标头压缩 gRPC Stream gRPC Gateway gRPC概述 gRPC具有以下特点 基于HTTP 2和Protobuf3的通用rpc