PRC gRPC 框架

概述

RPC主要目的在于让开发者,能够方便的调用远程服务器上的服务,而不需要关注底层的网络通信细节。其是一种进程间通信技术,允许程序在不同计算机上执行代码。

RPC技术主要用于分布式系统、微服务架构以及需要进行跨网络调用服务的应用中。

基本原理

  • 客户端发送请求
    • 客户端的RPC框架将调用远程计算机的过程,封装成一个请求消息,发送给服务器
  • 服务器处理请求
    • 服务器的RPC框架接收请求消息,解封装消息,同时调用对应的服务方法
  • 服务端发送响应
    • 当服务端处理完该消息后,服务器的RPC框架将结果封装成响应消息,发送给客户端
  • 客户端接收响应
    • 客户端接收到服务端的消息后,解封装该消息,然后将结果返回给客户端代码使用

 RPC框架

  • gRPC:由Google开发,基于HTTP/2和Protobuf(Protocol Buffers)序列化协议,支持多种编程语言。
  • Apache Thrift:由Facebook开发,支持多种编程语言和传输协议。
  • XML-RPC:基于XML和HTTP协议,简单易用,跨语言支持好。
  • JSON-RPC:基于JSON和HTTP协议,易于使用和调试。

 gRPC

 gRPC即是Google开发的RPC框架

特点总结

  • 高性能:基于HTTP/2协议,支持双向流、头部压缩、多路复用
  • 跨语言支持:不同语言之间的系统支持进行通信
  • 强类型:Protobuf作为接口定义语言和数据序列化协议
  • 双向流:客户端与服务端双向流、适用于实时通信
  • 负载均衡:内置多种负载均衡策略,提高系统可靠性和可拓展性

 Protocol Buffers(Protobuf)

相比于XML和JSON,Protobuf序列化和反序列化的速度更快,占用空间更小

用于数据的序列化和反序列化,定义消息格式和数据结构,同时通过编译器生成相应代码

  • 组成
    • .proto文件:定义数据结构和服务接口文件,其中包括消息类型和RPC服务的定义
    • 编译器:将.proto文件编译成目标语言的代码,供应用程序使用

.proto文件解释

  • syntax = "proto3":指定使用Protocol Buffers的版本3
  • service Greeter:定义一个名为Greeter的RPC服务,其中包含一个名为SayHello的方法
  • rpc SayHello (HelloRequest) returns (HelloReply):定义一个RPC方法SayHello,它接收一个HelloRequest消息并返回一个HelloReply消息
  • message HelloRequestmessage HelloReply:定义两个消息类型,分别包含一个字符串字段 

 gRPC与Reactor

  • 应用场景分析
    • gRPC:构建分布式系统以及微服务架构,为其提供接口,所以只需要关注其系统逻辑,而不需要关注底层通信的细节
    • Reactor:主要用来解决并发I/O问题,构建高性能、低延迟的网络服务器
  • 实现机制:
    • gRPC:封装底层通信细节,借助Protobuf定义使用接口以及消息格式,通过生成代码进行服务调用和消息处理,其底层是基于HTTP2进行通信
    • Reactor:基于事件循环和回调机制,管理IO事件的分发和处理,从而实现高效的事件驱动架构
  • 理解
    • gRPC:是一种从高层构建通信框架,通过提供的接口,从而简化分布式系统中服务之间的通信。其主要目标在于提高服务
    • Reactor:基于底层的一种设计模式,主要是用于处理并发IO操作

思考gRPC和Reactor结合的可能性

  • 首先Reactor构建在服务端,主要负责监听新连接的IO请求,当监听的请求发生的时候,则将其交付给其他线程处理。
  • gRPC则是负责处理具体业务。
  • 所以,借助Reactor来管理大量并发连接,从而实现高效的分发事件。然后响应的I/O事件交付给gRPC框架进行处理,由gRPC框架来处理具体的业务。 

构建RPC框架

步骤分析

  • 定义通信协议
    • 消息格式:选择一种轻量级的数据格式进行消息传递,可以选择JSON或Protobuf进行消息传递 
    • 请求和响应格式:定义好通信双方的请求和响应结构
  • 传输方式确认
    • 选择传输协议:TCP  HTTP       
    • 套接字编程:服务端和客户端使用套接字编程,从而建立连接发送接收数据
  • 服务端设计
    • 远程调用方法初始化:服务器注册可供远程调用的方法,可以使用哈希表来存储方法名称与对应的函数指针或者回调函数
    • 请求处理:服务器要能够解析客户端发送的请求,调用对应的方法并返回结果。在需要处理并发连接的时候,可以使用异步I/O来处理多个客户端连接
    • 序列化/反序列化:将收到的请求数据进行序列化为特定的请求结构进行U存储,同时将结果序列化为响应数据返回给哭护短
  • 客户端设计
    • 调用远程方法:客户端封装远程方法的调用,将方法的名称以及参数打包成请求,发送给服务器,同时等待服务器响应
    • 接收响应:客户端接收服务器响应后,进行反序列化,处理返回结果或者错误信息
    • 异步调用(看情况选择):客户端可以通过异步调用从而提高性能,避免同步调用导致阻塞

细节问题 补充

大量并发连接处理方法:

        可以使用多线程或者异步I/O来处理大量的并发连接。多线程模型可以使用功能线程池,每个线程负责处理一个客户端的连接;异步I/O则借助事件驱动机制来处理多个连接。 

确保数据传输和可靠性以及完整性:

  •  使用传输层协议(TCP)保证数据传输的可靠性以及顺序性
  • 应用层可以使用效验机制(校验和、数据长度前缀)确保数据完整性 
  • 安全性保证:使用TLS/SSL来加密传输层的数据,从而保证通信机密性和完整性,同时还可以在应用层实现身份认证机制

实现方法注册和调用的方法

  • 借助哈希表来存储方法名称和对应函数指针或回调函数(方法:函数)
  • 服务器接收请求后,通过方法名称查找对应的函数,并调用该函数 

如何处理参数类型的多样性和返回值

  • 使用通用的数据格式,例如JSON和Protobuf来表示多种类型的数据
  • 通过序列化和反序列化机制,可以将参数和返回值转换为标准格式传输 

如何实现负载均衡和容错

  • 在多台服务器上部署RPC服务时,使用功能负载均衡器分配请求
  • 实现服务注册以及发现机制,动态的调整服务实例,从而提高系统的可用性和容错能力 

性能优化方法

  • 优化网络I/O性能,使用异步IO模型
  • 减少序列化和反序列化的开销,选择高效且轻量化的序列化格式
  • 使用连接池,复用客户端到服务器的连接
  • 实现批量请求和响应,减少网络往返的次数,从而提高性能 

gRPC 和 RPC对比

 gRPC相比于RPC的优势;现代分布式系统中选择gRPC的原因

  • 高性能:并非是基于HTTP1.1协议,而是基于HTTP2 协议,支持多路复用、流控制、头部压缩等功能
  • 多语言支持:gRPC支持多种编程语言,便于不同语言的系统间通信
  • 强类型接口:使用Protobuf作为接口定义语言,提供强类型的接口和数据验证
  • 流式通信:支持双向流,适用于实时通信的场景
  • 负载均衡和名称解析:内置支持多种负载均衡策略和服务发现机制

Protobuf 优势

  •  高效:Protobuf的序列化和反序列化速度快且轻量化
  • 强类型:通过定义.proto文件,生成强类型代码,提供编译时进行检查
  • 拓展性强
  • 扩语言支持

gRPC的工作机制以及如何实现同步与异步调用

  • 工作机制:gRPC基于HTTP2协议进行通信,使用Protobuf定义接口和消息格式。客户端调用远程方法的时候,通过该框架生成的代码将方法调用转换为网络请求,发送到服务器中。服务器接收请求,调用相应方法并返回结果。
  • 同步调用:客户端调用方法的时候等待服务器返回结果
  • 异步调用:客户端不一直等待结果,而是通过回调进行处理 

gRPC流式通信的实现以及使用场景

  • 实现方式分析:gRPC基于HTTP2的流特征,实现了客户端流、服务器流和双向流。客户端可以在一个长连接中进行多次消息的发送和接收。
  • 场景:实时通信、数据流处理、聊天系统等需要持续交换数据的场景 

gRPC的负载均衡和服务发现

  • 负载均衡:例如可以使用轮询或者哈希实现负载均衡策略;通过服务发现系统动态获取可用服务实例列表,并根据策略分配请求
  • 服务发现:主要是集成服务注册与发现框架,gRPC 客户端可以自动获取和更新可用的服务器列表,从而实现动态负载均衡 

gRPC的性能优化

  • 多路复用:基于HTTP2协议,支持多路复用,减少连接开销
  • 头部压缩:HTTP2减少了重复的头部,提高了传输效率
  • 连接池:使用连接池复用TCP连接,减少连接建立和断开的开销
  • 批量请求:通过合并小的请求和响应,减少网络往返次数,从而提高吞吐量 

 

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

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

相关文章

项目实战二 HIS项目

目标: 项目的操作流程: 开发体系 前端开发:负责页面的编写 HTML CSS JavaScript 后端开发:看不到 摸不着的功能 常用开发语言 PHP JAVA Python 框架 : 半成品 做好的功能模块 版本控制 Git 分布式版本控…

鼠标连点器:是什么?如何用?鼠标自动点击器好用吗?说明书详细版(国内外6款电脑鼠标连点器分享)值得收藏!

知识科普1:鼠标连点器是什么? ⭕答:鼠标连点器,又称为鼠标点击器或自动点击器,是一种能够模拟鼠标点击操作的计算机软件。 鼠标连点器可以根据用户设定的参数,自动进行连续的鼠标点击操作,从而…

SQL labs-SQL注入(三)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言: 盲注简述:是在没有回显得情况下采用的注入方式,分为布尔盲注和时间盲注。 布尔盲注:布尔仅有两种形式,ture&#…

【LLM】-05-提示工程-部署Langchain-Chat

目录 1、软硬件要求 1.1、软件要求 1.2、硬件要求 1.3、个人配置参考 2、创建cuda环境 3、下载源码及模型 4、配置文件修改 5、初始化知识库 5.1、训练自己的知识库 6、启动 7、API接口调用 7.1、使用openai 参考官方wiki,本文以Ubuntu20.04_x64&#xf…

微信小程序数组绑定使用案例(二)

一、数组事件绑定&#xff0c;事件传递数据 1.wxml <text>姓名&#xff1a;{{name}} </text> <block wx:for"{{list}}"><button bind:tap"nameClick2" data-name"{{item}}">修改:{{item}}</button> </block&…

想学习Python爬虫的宝子们可以看过来,从基础开始看这一篇文章就够了!

1. 预备知识 学习者需要预先掌握Python的数字类型、字符串类型、分支、循环、函数、列表类型、字典类型、文件和第三方库使用等概念和编程方法。 2. Python爬虫基本流程 a. 发送请求 使用http库向目标站点发起请求&#xff0c;即发送一个Request&#xff0c;Request包含&am…

单调栈(随缘复习到了,顺手刷了)

也是不知道为什么突然又复习到单调栈了&#xff0c;所以顺手刷了三道题&#xff0c;总结一下 P6503 [COCI2010-2011#3] DIFERENCIJA 思路&#xff1a;这题是要求每个子区间里面的最大值和最小值的差&#xff0c;我们一开始想的必然是纯暴力呀&#xff0c;但是一看这数据&#…

自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍

自动驾驶系列—智能巡航辅助功能中的车道中央保持功能介绍 自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍 自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍 文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感…

MySQL聚合函数(DQL)

先看一下我的表内容和数据&#xff0c;再做接下来的例子和讲解 1.聚合函数的基本语法 SELECT 聚合函数&#xff08;表中的某个字段&#xff09;FROM 表名; 2. 常见的聚合函数 举例 1.统计该企业的数量 select count(idcard) from emp; 2.统计该企业员工的平均年龄 select…

SpringBoot缓存注解使用

背景 除了 RedisTemplate 外&#xff0c; 自Spring3.1开始&#xff0c;Spring自带了对缓存的支持。我们可以直接使用Spring缓存技术将某些数据放入本机的缓存中&#xff1b;Spring缓存技术也可以搭配其他缓存中间件(如Redis等)进行使用&#xff0c;将某些数据写入到缓存中间件…

QSqlRelationalTableModel 增删改查

QSqlRelationalTableModel 可以作为关系数据表的模型类&#xff0c;适用于三范式设计的表&#xff0c;主表中自动加载外键表中的名称。本文实现QSqlRelationalTableModel 为模型类&#xff0c;实现增删改查。 目录 0.表准备 1. 构建表格数据 声明变量 表格、数据模型、选择…

全球价值链贸易核算matlab程序(TIVA与WWZ分解方法大全)以及区域表链接方法

数据来源&#xff1a;基础数据来源于世界银行、国家统计局时间范围&#xff1a;2007年数据范围&#xff1a;国家与行业层面样例数据&#xff1a; 包含内容&#xff1a; 全部数据下载链接&#xff1a;https://download.csdn.net/download/samLi0620/89567902

Redis的操作以及SpringCache框架

目录 一.什么是Redis&#xff1f; 二.Redis的相关知识&#xff1a; 三.如何操作Redis&#xff1f; 1&#xff0c;常用命令&#xff1a; 2.Spring Data Redis &#xff08;1&#xff09; pom.xml 配置&#xff1a; &#xff08;2&#xff09;配置Redis数据源&#xff1a; …

麒麟V10安装nginx、mysql报错缺少包:error while loading shared libraries libssl.so.10

背景 启动nginx报错&#xff1a;error while loading shared libraries libssl.so.10 解决 查看nginx启动文件所依赖的动态链接库&#xff08;即共享库或动态库&#xff09; ldd nginx-1.22.1/sbin/nginx离线安装compat-openssl10包 将依赖包麒麟v10安装openssl10依赖包上…

QT6.6+Opencv 4.6.0完成摄像头显示以及捕获照片的功能

效果图提前展示,想试试再往下看: 在网上找了很久QT的摄像头打开方式,成功了,但是捕获照片一直不成功,我不知道是不是qt6版本的原因:这个多媒体窗口我安装没有效果 QT += multimediawidgets之前使用过python的opencv,于是想到可以使用opencv来显示摄像头以及捕获照片。…

C++完整的学生管理系统

实现功能 添加、删除、修改学生为学生添加、删除、修改成绩将数据保存在students.txt和grades.txt里 效果图&#xff08;部分功能&#xff09; 添加学生 添加成绩 源代码 这里就不分多个文件了 编译时在连接器命令行加入以下命令 -stdc11 #include <ios…

极客天成NVFile全闪存储加速千卡AIGC大模型训练平台

01 中国AI算力核心产业现状 随着人工智能技术的快速发展和广泛应用&#xff0c;AI算力已成为推动数字经济和科技创新的关键基础设施。2024年&#xff0c;中国AI算力核心产业规模持续扩大&#xff0c;在全球AI发展格局中占据重要地位&#xff0c;中国AI算力核心产业规模达到约…

LangChain的数据增强

吾名爱妃&#xff0c;性好静亦好动。好编程&#xff0c;常沉浸于代码之世界&#xff0c;思维纵横&#xff0c;力求逻辑之严密&#xff0c;算法之精妙。亦爱篮球&#xff0c;驰骋球场&#xff0c;尽享挥洒汗水之乐。且喜跑步&#xff0c;尤钟马拉松&#xff0c;长途奔袭&#xf…

Spring事务(1)

目录 一、事务回顾 1、什么是事务&#xff1f; 2、为什么需要事务&#xff1f; 3、事务的操作 二、Spring 中事务的实现 1、代码准备&#xff1a; &#xff08;1&#xff09;创建项目 spring-trans&#xff0c;引入 Spring Web&#xff0c;MyBatis&#xff0c;MySQL等依…

【C++】C++前言

目录 一.什么是C 1.1.面向过程&#xff1a; 1.2.面向对象&#xff1a; 二.C发展历史 三.C版本更迭 3.1.语法更新 3.2.关于C2X最新特性的讨论&#xff1a; 3.3.关于C23的一个小故事&#xff1a; 四.C参考文档&#xff1a; 五.C的重要性&#xff1a; 5.1.编程语言排行榜…