一、简介

我们在前面学习了thrift rpc的知识,我们从其中接触到了IDL,编解码协议,服务的远程调用(调用远程服务就像在在本地调用一样)等各种概念。
其实我个人对thrift的使用并不多,我更多的是使用今天我们要提到的一个RPC框架称之为gRPC,其实作为一个rpc框架,grpc和之前提到的thrift是有很多相似之处的,包括他也有IDL这个概念。只是语法不一样而已。

但是作为一个非常流行的rpc框架,grpc是有自己的独到设计的,下面我们来看看他的一些特点和概念。

1. gRPC 是由google开源的一个高性能的RPC框架。是由Google内部的Stubby RPC,演化而来的,2015正式开源。在如今大行其道的云原生时代,实际上它已经是一个事实上的RPC标准。2. gRPC 核心的设计思路 1. 网络通信: gRPC自己封装网络通信的部分 提供多种语言的 网络通信的封装 (C Java[Netty] GO),所以他也是有多语言异构的能力的。他也是通过IDL来实现语言无关的翻译能力。2. 协议:使用HTTP2作为网络传输协议,传输数据的时候数据体使用二进制数据内容。 支持双向流(双工)连接的多路复用。3. 序列化:较之于传统的http1的基本文本JSON格式,http2是基于二进制内容序列化的。具体的话,他是使用了一种叫做protobuf (Protocol Buffers) 的序列化方式,这是google开源一种序列化方式,时间效率和空间效率是JSON的3---5倍。IDL语言 4. 代理的创建 :让调用者像调用本地方法那样 去调用远端的服务方法。我们可以看到,上面四点,其实只需要我们处理3,使用protobuf来定义IDL,实现序列化,数据消息翻译成目标语言。其余的grpc都封装好了给我们。3. gRPC 与 ThriftRPC 区别共性:支持异构语言的RPC。区别:1. 网络通信 Thrift 的第五层是自己定义的专属协议,而GRPC则是选择了HTTP22. 性能角度 ThriftRPC 性能 高于 gRPC,毕竟他是自己实现的协议,更加精准。3. gRPC 大厂背书(Google),云原生时代 与其他组件合作的顺利。所以gRPC应用更广泛,nacos中就有使用。4. gRPC的好处 1. 高效的进行进程间通信。2. 支持多种语言 原生支持 C  Go Java实现。C语言版本上扩展 C++ C# NodeJS Python Ruby PHP..3. 支持多平台运行 Linux Android IOS MacOS Windows。4. gPRC序列化方式采用protobuf,效率高。5. 使用Http2协议6. 大厂的背书(谷歌)

二、关于http2

实际上网上关于http2的内容已经很多了。我这里就不做太多的赘述了,我来简单描述一下,如果有什么不足之处,大家多多指教。

1、Http1.x协议

1.1、http1.0

1、Http1.0协议时代,他是基于请求响应的模式,属于一种短连接协议,也就是你发送请求接受相应之后就立刻断开。所以他是无状态的,无状态的意思就是服务端不知道你客户端是谁,因为你每次都断开。但是实际上我们开发的时候往往需要记住状态,所以大家设计了cookie和session的机制来记住,每次你带着你的标记来。但是这机制毕竟不是网络协议的内容,是技术人员的一种弥补技术手段。
2、他是传输数据文本结构,你可能会说有时候我上传文件,明明传的是二进制的,数据是二进制的,但是其余的请求头,标记等等都是文本。
3、单工模式, 无法实现服务端主动推送,为了变相实现推送一般使用客户端轮训的方式,也就是客户端不断的去询问,达到一种看似感知服务端的效果。但是大部分是空轮训,浪费资源了。

1.2、http1.1

Http1.1协议依然是请求响应的模式,但是已经进化成为了一种有限的长连接,通过keepalive请求头标识来保持一段时间的长连接,而且可以通过 升级的方式实现WebSocket 的双工协议,进而实现服务器向客户端推送。
Http1.x协议 共性

1. 传输数据文本格式,可读性好的但是效率差。
2. 本质上Http1.x协议无法实现双工通信。
3. 资源的请求。比如我们要像服务器请求三个资源,就需要发送三次请求,建立多个连接才可以完成。(有时候你发接口请求,需要请求一些静态资源,就要多次请求获取)

2. HTTP2.0协议

 1. Http2.0协议是一个二进制协议,效率高于Http1.x协议,可读性差。2. 可以实现双工通信。3. 一个请求 一个连接 可以请求多个数据。【多路复用】# Http2.0协议的三个概念1. 数据流 stream2. 消息   message3. 帧    frame    参看图 
#  其他的相关概念
1. 数据流的优先级,可以通过为不同的stream设置权重,来限制不同流的传输顺序。
2. 流控 client发送的数据太快了,server处理不过来,通知client暂停数据的发送。

我们来画一个图来表示一下http2的这些概念。
在这里插入图片描述
我们看到它把以前我们需要建立三次连接获取三次数据的格式变成了,建立一次连接,通过流的形式发送过去,然后响应回来。而且这个还可以调整stream之间的权重来选择先响应哪个后响应哪个。

三、Protocol Buffers [protobuf]

1. protobuf 是一种与编程语言无关【IDL】,与具体的平台无关【OS】。他定义的中间语言,可以方便的在client 于 server中进行RPC的数据传输。
2. protobuf 两种版本 proto2 proto3,但是目前主流应用的都是proto3。
3. protobuf主要安装protobuf的编译器,编译器目的,可以把protobuf的IDL语言,转换成具体某一种开发语言。

1、protobuf编译器的安装

下载地址:https://github.com/protocolbuffers/protobuf/releases
windows 版本1. 直接解压缩 方式在一个特定的目录下面2. 直接配置环境变量 path
mac版本brew install protobuf protoc --version 来检验是否安装

2、protobuf IDEA的插件

1. 2021.2版本后面的新版本 IDEA内置了Protobuf插件
2. 之前版本 可以选装第三方Protobuf插件
3. 二者不能共存。

3、protobuf的语法

其实官方提供了详细的语法介绍,我们可以去参考一下protobuf的官方文档

3.1、文件格式

所有的proto内容都要写在.proto后缀的文件中。比如
UserService.proto
OrderService.proto

3.2、版本设定

syntax = “proto3”;
文件最上面声明出版本号。

3.3、注释

1. 单行注释   //
2. 多行注释   /*    */

3.4、与Java语言相关的语法

#后续protobuf生成的java代码 一个源文件还是多个源文件  xx.java,自己开发一般一个简单,有时候实际开发会按照业务拆分多个组织,看要求。
option java_multiple_files = false; #指定protobuf生成的类 放置在哪个包中,java的包
option java_package = "com.levi";#指定的protobuf生成的外部类的名字(管理内部类【内部类才是真正开发使用】)
option java_outer_classname = "UserServce";
在protobuf中我们的这些业务类都是有一个外部类的,他的作用就是管理这些业务类。这就是他的规范。

option的意思就是可以选,所以以上这些你都可以不写,有默认的。最好味了规范还是写上。

3.5、逻辑包

这个用的不多,他的作用是用来管理多个proto文件,不是管理包划分。而是一种proto的划分,类似于这个proto属于这个逻辑包下这种区分。用来结构管理。

# 对于protobuf对于文件内容的管理
package xxx;

3.6、导入

UserService.protoOrderService.protoimport "xxx/UserService.proto";

OrderService.proto导入了UserService.proto,就可以在OrderService.proto中使用UserService.proto中定义的内容了。

3.7、基本类型

类型中定义了proto文件中的proto类型和各个语言的基本类型的对应,可以看一下,我们这里主要观察java即了。
在这里插入图片描述

3.8、枚举类型

enum SEASON{SPRING = 0;SUMMER = 1;}
枚举的值 必须是0开始 ,后面那个是标号,不一定连续,但是一定要从0开始递增。
grpc的标号和thrift不一样,他是放在=后面的。

3.9、消息 Message

其实就是实体类,thrift是struct那些,grpc直接就是message。

message LoginRequest {string username = 1;singular string password = 2;int32  age = 3;
}编号 从1开始 到2^29-1  注意:19000 - 19999 不能用这个区间内的编号,因为他是protobuf自己保留的。这个编号不需要连续,递增就好了。# 一组关键字
- singular : 这个字段的值 只能是0个或1个 (默认关键字)  null   "123456"
- repeated :返回集合,proto会生成对应的getList方法。
message Result{string code = 200;repeated string datas = 2; //这个字段 返回值 是多个 比如我们分页要获取多个回来集合
}# 可以定义多个消息 
message LoginRequest{....
}
message LoginResponse{...
}# 消息可以嵌套 
message SearchResponse{message Result{string url = 1;string title = 2;}string xxx = 1;int32  yyy = 2;# 可以直接使用嵌套Result ppp = 3;
}message AAA{string xxx = 1;SearchResponse.Result yyy = 2; # 直接.引用内部即可
}# oneof [其中一个],标识这个类型的东西虽然里面有多个属性,但是只会返回一个
message SimpleMessage{oneof test_oneof{string name = 1;int32  age = 2;}# test_oneof这个属性只会返回name或者age一个。test_oneof xxx
}

3.10、服务service

就是service业务类。

service HelloService{rpc hello(HelloRequest) returns(HelloResponse){}
}
# 里面是可以定义多个服务方法。而且都是以rpc开头。HelloRequest,HelloResponse这些类型都是我们之前定义的消息。后面的{}表示业务体,这里不写内容,具体由你生成结构之后自己去写。
# 定义多个服务接口
# gPRC 服务 4种服务方式,后续介绍 。

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

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

相关文章

OSPF高级特性之GR

一、概述OSPF GR(Graceful Restart),在路由器发生故障或管理员干预的情况下重启了OSPF进程时,重新构建控制平面时,转发平面不受影响,仍可以正常转发数据。在我们OSPF网络环境当中,假设路由器为框式路由器,通常框式路由器有多个主控板,当主主控板发生故障时会切换到备主控板上。…

iOS 构建配置与 AdHoc 打包说明

iOS 构建配置与 AdHoc 打包说明 1. 背景 在 iOS 项目中,通常需要支持 多个环境的构建和分发,比如: 开发环境 (Debug) → 本地调试内测环境 (AdHoc) → 提供 QA / 产品经理测试预发布环境 (AdHoc_Release) → 和正式版配置一致,但通…

【52】MFC入门到精通——MFC串口助手(二)---通信版(发送数据 、发送文件、数据转换、清空发送区、打开/关闭文件),附源码

文章目录1 完整 功能展示2 添加控件变量及声明2.1 添加控件及变量2.2 SerialPortDlg.h: 头文件3 函数实现3.1 数据发送3.1.2 写数据、字符串转3.2 发送文件3.2.1 打开文件3.2.2 发送文件3.3 清空发送区4 完整MFC项目项下载1 完整 功能展示 串口通信助手 页面展示,功…

笔试——Day12

文章目录第一题题目思路代码第二题题目:思路代码第三题题目:思路代码第一题 题目 删除公共字符 思路 模拟: 遇到需要删除的字符,则不添加到结果中 代码 第二题 题目: 两个链表的第一个公共结点 思路 模拟&#x…

SpringMVC @ResponseBody注解详解

概要ResponseBody是 Spring MVC 中的一个重要注解,用于指示方法的返回值应该直接作为 HTTP 响应体返回,而不是解析为视图名称。基本功能ResponseBody主要用于将Java对象转换为HTTP响应体(通常是JSON或XML)绕过视图解析器直接返回数…

剑指offer——模拟:顺时针打印矩阵

模拟vector.size返回的是矩阵的行数,vector[0].size返回的是矩阵的列数先排除传入的矩阵是空矩阵先计算上下左右的边界只要边界不重合,就不停止输出,完成一个部分的打印,就将当前的一个边界回收不可以在for循环结束的时候一起判断…

electron-vite实践成品项目

羊驼的工具箱 项目地址 推荐使用该版本 并且使用yarn进行安装 node版本:v22.16.0 技术栈:electron vue3 vite pinia vuetify3 sequelize sqlite Q:为什么vue3要用 vue2的写法 A:其实是因为刚开始用vue3的写法感觉超级恶心 对属性的赋值和方法的管理可观性…

自学中医笔记(一)

我的中医自学笔记 Q&A 自学原因:最开始我也不太信中医,我室友也说中医太玄学了。由于我从小一直都很瘦,吃饭每次都吃得少,上大学那会儿171cm最多也才101斤,而且一年胃病要犯好几次,后来无意中收获了一篇…

3.1 WPF画折线图、直方图、饼状图

本文看了博客WPF编程&#xff0c;Live Charts使用说明&#xff08;2&#xff09;——使用_func<chartpoint, string> labelpoint-CSDN博客&#xff0c;这里作为笔记用。 1.前端代码 前端XAML文件代码如下&#xff1a; <Window x:Class"livechart1.MainWindow&…

如何通过ATS/HTTPS数据防篡改来加密视频?

文章目录前言一、什么是ATS/HTTPS数据防篡改&#xff1f;二、ATS/HTTPS数据防篡改的实现原理三、如何零代码实现ATS/HTTPS数据防篡改来加密视频总结前言 未经保护的视频流极易在传输途中遭遇窃听、拦截或恶意篡改&#xff0c;不仅损害内容价值&#xff0c;更可能引发严重的安全…

Python并发模型:多线程与多进程的优劣对比与实战应用

文章目录多线程基础概念多进程基础概念多线程的优劣势多进程的优劣势实战应用&#xff1a;网络爬虫实战应用&#xff1a;图像处理Python作为一门功能强大的编程语言&#xff0c;提供了多种并发模型&#xff0c;使得我们能够在同一时间执行多个任务&#xff0c;从而提高程序的执…

Spring Boot 整合 Nacos 实战教程:服务注册发现与配置中心详解

Spring Boot 整合 Nacos 教程&#xff08;3000字&#xff09; 一、Nacos 简介 Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台&#xff0c;致力于帮助开发者更轻松地构建云原生应用。它支持多种注册中心协议&#xff08;如 Dubbo、Spring Cloud、Kubernete…

VMware 虚拟机装 Linux Centos 7.9 保姆级教程(附资源包)

安装 VMware 17.5.1 centos 7.9 ​ 1、下载资源包&#xff08;虚拟机镜像&#xff09; VMware-17.5.1 安装包秘钥.zipLinux Centos 7.9 镜像 2、centos 7.9 下载地址 1、Centos 官网 2、阿里巴巴镜像站 3、查看网络命令 ifconfig 或 ip addr 4、登陆服务器 ssh stark192.168.3…

STM32超声波模块

一&#xff1a;超声波模块1&#xff1a;工作原理采用IO触发测距&#xff0c;给至少10us的高电平信号。 模块自动发送8个40KHz的方波&#xff0c;自动检测是否有信号返回。 有信号返回&#xff0c;通过IO输出一高电平&#xff0c;高电平持续时间就是超声波从发射到返回的时间声波…

RK3568项目(十一)--linux驱动开发之mipi屏幕调试

目录 一、引言 二、MIPI DSI 屏幕 ------>2.1、MIPI联盟 ------------>2.1.1、多媒体部分 ------------>2.1.2、硬件协议 ------------>2.1.3、D-PHY功能模式及速率 ------------>2.1.4、分辨率计算 ------>2.2、MIPI-DSI硬件连接 ------>2.3、传…

C语言小游戏——飞机大战

目录 引言 开发环境与工具准备 1. 开发环境配置 2. 资源文件准备 游戏设计与架构 1. 游戏核心数据结构 2. 游戏全局变量 游戏核心功能实现 1. 游戏初始化 2. 游戏主循环 3. 游戏渲染 4. 游戏状态更新 关键游戏机制实现 1. 敌机生成系统 2. 碰撞检测系统 3. 敌机…

SQLite的可视化界面软件的安装

1、如下图所示&#xff0c;DB Browser软件&#xff0c;在压缩包中。2、首先解压到一个文件夹中。例如&#xff08;D:\\DB Browser&#xff09;文件夹。解压后的内容如下图。3、将解压后的DB Browser文件夹&#xff0c;剪切到D:\Program Files\目录中。如下两图。win10操作系统下…

基于 STM32H743VIT6 的边缘 AI 实践:猫咪叫声分类 CNN 网络部署实战(已验证)中一些bug总结

前言前面发了一篇文章基于 STM32H743VIT6 的边缘 AI 实践&#xff1a;猫咪叫声分类 CNN 网络部署实战&#xff08;已验证&#xff09;。这里面有一些我遇到过的bug&#xff0c;当时基本都花了很长的时间才解决。这里将这些bug总结一下方便后续查阅。1.使用cubemx插件解析AI模型…

【机器学习】突破分类瓶颈:用逻辑回归与Softmax回归解锁多分类世界

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

Android gradle plugin agp8.6.1发布时间

Android gradle plugin agp8.6.1发布时间 Android Gradle Plugin (AGP) 的版本 8.6.1 是在2023年发布的。具体来说&#xff0c;它是在2023年4月发布的。这个版本的更新包括了多个重要的改进和修复&#xff0c;旨在提升开发者在Android开发过程中的体验和效率。 主要更新包括&am…