【2-1:RPC设计】

news2024/11/15 20:08:01

RPC

  • 1. 基础
    • 1.1 定义&特点
    • 1.2 具体实现框架
    • 1.3 应用场景
  • 2. RPC的关键技术点&一次调用rpc流程
    • 2.1 RPC流程
      • 流程
      • 两个网络模块如何连接的呢?
      • 其它特性
      • RPC优势
    • 2.2 序列化技术
      • 序列化方式
      • PRC如何选择序列化框架
      • 考虑因素
    • 2.3 应用层的通信协议-http
      • 2.3.1 基础概念
        • 大多数RPC大多自研http,也支持合http1.1
        • 什么是IO
        • 边缘触发
        • 水平触发
        • 事件驱动 IO
        • 异步 IO
      • 2.3.2 操作系统的IO模型有哪些
        • 同步阻塞IO
        • 非阻塞式 IO
        • IO多路复用
        • select
        • poll
        • epoll
      • 2.3.3 IO总结
      • 2.3.4 线程模型
    • 2.4 动态代理
      • 其它动态代理方案
    • 2.5 基于ZK注册的原理
      • 基于zk注册数据的存储结构-以dubbo为例
    • 2.6 容错策略之超时重试
      • 什么是超时重试?
      • 如何检测请求是否超时?
      • 时间轮算法
    • 2.7 熔断限流
      • 熔断降级的概念
      • 如何判断熔断
      • 熔断工作合适开始?又合适结束
      • 有了熔断降级为何还要限流?
      • 常见的限流算法
  • 3. 实现一个自己定义的RPC框架-mini版
    • 3.1 PRC框架
    • 3.2 Netty
    • 3.3Dubbo

1. 基础

1.1 定义&特点

RPC,remote procedure call,远程过程调用,它定义了一台机器上的程序去调用另一台机器上子程序的这一行为
特点:

  • 把远程实现搬到了本地,效果上远程调用和本地调用没有差别
  • 使用cs模式,客户端发起请求,服务端接收请求参数后执行
  • 屏蔽跨进程跨网络调用底层复杂性让我们更专注于业务逻辑

1.2 具体实现框架

  1. dubbo(apache alibaba java)
  2. motan(微博)
  3. tars(腾讯内部)
  4. grpc
  5. thrift
  6. spring cloud openfeign

1.3 应用场景

跨网络通信都可以用

2. RPC的关键技术点&一次调用rpc流程

2.1 RPC流程

流程

在这里插入图片描述
在这里插入图片描述

  1. 客户端调接口走到代理类,组装请求并序列化,然后协议编码并发送
  2. 服务端收到请求,进行协议解析以及反序列化拿到请求参数
  3. 服务端根据请求参数调用接口实现,然后组装响应
  4. 响应按同样的方式返回

两个网络模块如何连接的呢?

在这里插入图片描述

注册中心就是一个存数据的地方,最好可以提供监听功能。注册中心与rpc框架是分开的
常见的注册中心:zookeeper、nacos、etcd

其它特性

在这里插入图片描述

  • 路由筛选可用的提供者
  • 负载均衡:从可用的提供者种,选择具体用哪个
  • 熔断限流:流量控制
  • 网络处理
  • 协议处理

RPC优势

  1. 让构建分布式应用更容易,解耦服务,容易扩展
  2. RPC一般使用长连接,不必每次通信都要建立连接,减少网络开销
  3. RPC需要有注册中心,可以动态感知服务变化并可视化
  4. 丰富的后台管理功能,可统一管理接口服务,对调用方来说是无感知的,统一化的操作
  5. 协议精简,效率更高,私密安全性高
  6. 具有负载均衡,熔断限流等功能

2.2 序列化技术

  • 任何一种序列化框架:核心思想就是设计一种序列化协议将对象的类型、属性类型属性值–按照固定的格式写到二进制字节流中来完成序列化,再按照固定的格式一一读出对象的类型、属性类型、属性值,通过这些信息重新创建出一个新的对象,来完成反序列化

序列化方式

  • JDK原生序列化
  • 轻量级文本数据交换格式-json/XML
    • 可读性好,方便阅读和调试,多语言支持序列化以后的字节文件相对较大,效率相对不高,但对比XML序列化后的字节流更小,在企业运用普遍,特别是对前端和三方提供api。
  • Hessian是一个动态类型,二进制,并支持跨语言的徐丽华框架
    • Hessian 性能上要比JDK、JSON 序列化高效很多,并且生成的字节数也更小。有非常好的兼容性和稳定性所以Hessian 更加适合作为 RPC框架远程通信的序列化协议
  • protobuf
    • Google 推出的开源序列库,它是一种轻便,高效的结构化数据存储格式,多语言支持。
    • 速度快,压缩比高,体积小,序列化后体积相比JSON、Hessian 小很多课彩盘格式的扩展、升级和兼容性都不错,可以做到向后兼容

PRC如何选择序列化框架

  • 选型因素
    • 安全性: 首要考虑,如果序列化存在安全漏洞,那么线上的服务就很可能被入侵(JDK原生序列化存在漏洞
    • 兼容性: 序列化协议在版本升级后的兼容性是否很好,是否是跨平台、跨语言等
    • 通用性:能够对任意类型进行序列化和反序列化,不会出现服务接口方法加一个某种类型的参数后服务器突然不能调用
    • 性能、效率:序列化与反序列化过程是 RPC调用的一个必须过程,性能和效率势必将直接关系到 RPC 框架整体的性能和效率
    • 空间开销:序列化之后的二进制数据的体积大小,序列化后的字节数据体积越小,网络传输的数据量就越小,传输的数据的速度也就越快,在RPC调用中直接关系到请求响应的耗时

考虑因素

  1. 避免对象构造得过于复杂,属性很多,并且存在多层的嵌套
  2. 避免对象过于庞大:大字符串,超大数组等
  3. 避免使用序列化框架不支持的类型作为参数传递
  4. 防止对象有复杂的继承关系

2.3 应用层的通信协议-http

2.3.1 基础概念

大多数RPC大多自研http,也支持合http1.1

在这里插入图片描述

什么是IO

IO就是计算机内部与外部设备之间拷贝数据的过程
网络数据到来后先存储到操作系统的内核缓存区,在等待应用程序收走

边缘触发

使用边缘触发模式时,当被监控的 Socket 描述符上有可读事件发生时,服务器端只会从 epoll_wait 中苏醒一次,即使进程没有调用 read 函数从内核读取数据,也依然只苏醒一次,因此我们程序要保证一次性将内核缓冲区的数据读取完。

水平触发

使用水平触发模式时,当被监控的 Socket 上有可读事件发生时,服务器端不断地从 epoll_wait 中苏醒,直到内核缓冲区数据被 read 函数读完才结束,目的是告诉我们有数据需要读取。

事件驱动 IO

发起读请求后,等待读就绪事件通知再进行数据读取。

异步 IO

发起读请求后,等待操作系统读取完成后通知,完全将功能交给操作系统实现。

2.3.2 操作系统的IO模型有哪些

同步阻塞IO
同步非阻塞IO
IO多路复用
信号驱动IO
异步IO
在这里插入图片描述

同步阻塞IO

read 的第一个阶段阻塞的,这就是我们常说的阻塞式 IO,即如果read 第一个阶段等待读就绪是阻塞的,我们就称为阻塞式IO

listenfd = socket();   // 打开一个网络通信套接字
bind(listenfd);        // 绑定
listen(listenfd);      // 监听
while(1) {
   
  connfd = accept(listenfd);  // 阻塞 等待建立连接
  int n = read(connfd, buf);  // 阻塞 读数据
  

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

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

相关文章

windows上修改redis端口号

概况 redis是一个开源的内存数据结构存储系统,常用做数据库、缓存和消息代理。默认的端口号为6379 更改redis端口号步骤如下 先停止redis服务 redis-cli shutdowm 打开redis配置文件 在redis安装目录下,即redis.windows.conf文件。 port 6396 然后…

插片式远程 I/O模块:热电阻温度采集模块与PLC配置案例

XD系列成套系统主要由耦合器、各种功能I/O模块、电源辅助模块以及终端模块组成。有多种通讯协议总线的耦合器,例如Profinet、EtherCAT、Ethernet/IP、Cclink IE以及modbus/TCP等。I/O 模块可分为多通道数字量输入模块、数字量输出模块、模拟量输入模块、模拟量输出模…

js前端隐藏列 并且获取值,列表复选框

列表框 <div class"block" id"psi_wh_allocation_m"><table id"result" class"list auto hover fixed" style"width:100%;border-collapse:collapse"><thead><tr><%--<th></th>--%&…

人类大脑的计算与机器的类脑计算

人类大脑的计算基本原理涉及到神经元的基本工作方式、神经网络的结构和连接模式、信息传递的方式、学习和记忆的机制等多个层面的复杂互动&#xff0c;这些原理的深入理解不仅有助于神经科学的发展&#xff0c;还为人工智能领域的发展提供了重要的启示和指导。人类大脑计算基本…

【JavaScript 报错】未捕获的加载错误:Uncaught LoadError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 资源路径错误2. 资源不存在3. 网络问题 二、解决方案1. 检查资源路径2. 确保资源存在3. 处理网络问题 三、实例讲解四、总结 在JavaScript应用程序中&#xff0c;未捕获的加载错误&#xff08;Uncaught …

电脑录音如何操作?电脑麦克风声音一起录制,分享7款录音软件

电脑录音已经成为我们日常生活和工作中不可或缺的一部分。无论是录制会议、教学、音乐、网络直播、音源采集还是其他声音&#xff0c;电脑录音软件都为我们提供了极大的便利。本文将为大家介绍如何操作电脑录音&#xff0c;并分享七款录音软件&#xff0c;包括是否收费、具体操…

OpenCV中的浅拷贝和深拷贝

文章目录 前言一、浅拷贝二、深拷贝三、比较总结 前言 在数字图像处理中&#xff0c;针对读取到的一张图像&#xff0c;需要反复利用这张图像做各种的变换&#xff0c;以满足我们项目的需求。在这之前&#xff0c;最容易忽略的一点就是图像之间的拷贝问题&#xff0c;其中的浅…

【JavaScript 报错】未捕获的类型错误:Uncaught TypeError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 调用不存在的方法2. 访问未定义的属性3. 数据类型不匹配4. 函数参数类型不匹配 二、解决方案1. 检查方法和属性是否存在2. 使用可选链操作符3. 数据类型验证4. 函数参数类型检查 三、实例讲解四、总结 在…

Java高级重点知识点-25-Stream流、方法引用

文章目录 Stream流流式思想概述获取流常用方法 方法引用方法引用符通过对象名引用成员方法通过类名称引用静态方法通过super引用成员方法通过this引用成员方法类的构造器引用数组的构造器引用 Stream流 通过循环遍历来讲解流的优势&#xff1b; 要求&#xff1a;筛选所有姓张的…

游戏如何应对黑灰产工作室

游戏黑灰产工作室&#xff0c;是指以非法渠道、非法手段通过游戏进行牟利的团伙。使用脚本、外挂是黑灰产工作室的显著特征&#xff0c;其常见的牟利方式有&#xff1a;打金工作室、资源囤积号、初始号、自抽号、代练工作室以及营销欺诈等。 ▲ 常见的游戏黑灰产工作室牟利路径…

正向传播和反向传播

正向传播&#xff08;Forward Propagation&#xff09; 正向传播是指将输入数据通过神经网络&#xff0c;计算出预测值的过程。具体步骤如下&#xff1a; 输入层&#xff1a;接受输入数据。隐藏层&#xff1a;每个隐藏层中的神经元接收上一层的输出&#xff0c;进行加权求和&…

ENSP防火墙综合配置

综合拓扑&#xff1a; 实验要求&#xff1a; 要求一 生产区的安全策略配置 办公区的安全策略 要求二 生产区的安全策略 游客和办公区的安全策略 因为ISP返回的数据包会被防火墙最后的默认安全策略给拒绝&#xff0c;所以&#xff0c;把要ISP返回的数据给允许通过 要求三 增加…

Lingo学习(三)——工厂合并、运算符、内置函数

一、工厂合并 &#xff08;一&#xff09; 工厂合并——生产二维矩阵 【引入】 sets: factory /1..6/ : a; plant /1..8/ : d; Cooperation(factory,p lant) : c, x; endsets 以上程序可…

Go语言入门之Map详解

Go语言入门之Map详解 1.基础定义 map是一个无序的&#xff0c;k-v键值对格式的集合 &#xff08;1&#xff09;特点 类型特点&#xff1a;map为引用类型&#xff0c;所以在函数中更新value值会永久改变顺序特点&#xff1a;map的遍历是无序的&#xff0c;因为底层是哈希表&am…

按下快门前的算法——对焦

对焦算法可以分为测距式&#xff0c;相位式&#xff0c;反差式。 其中测距式是通过激光&#xff0c;&#xff08;TOF&#xff0c;Time of Flight&#xff09;等主动式地得知物距&#xff0c;然后对焦。更常用的是后两者。 反差式CDAF&#xff08;Contrast Detection Auto Foc…

微调及代码

一、微调&#xff1a;迁移学习&#xff08;transfer learning&#xff09;将从源数据集学到的知识迁移到目标数据集。 二、步骤 1、在源数据集&#xff08;例如ImageNet数据集&#xff09;上预训练神经网络模型&#xff0c;即源模型。 2、创建一个新的神经网络模型&#xff…

【Python实战因果推断】31_双重差分2

目录 Canonical Difference-in-Differences Diff-in-Diff with Outcome Growth Canonical Difference-in-Differences 差分法的基本思想是&#xff0c;通过使用受治疗单位的基线&#xff0c;但应用对照单位的结果&#xff08;增长&#xff09;演变&#xff0c;来估算缺失的潜…

PostgreSQL 中如何处理数据的批量更新和事务日志管理?

文章目录 PostgreSQL 中数据的批量更新和事务日志管理 PostgreSQL 中数据的批量更新和事务日志管理 在数据库的世界里&#xff0c;数据的批量更新和事务日志管理就像是一场精心编排的舞蹈&#xff0c;需要精准的步伐和协调的动作。对于 PostgreSQL 而言&#xff0c;这两个方面…

LLM基础模型系列:Fine-Tuning总览

由于对大型语言模型&#xff0c;人工智能从业者经常被问到这样的问题&#xff1a;如何训练自己的数据&#xff1f;回答这个问题远非易事。生成式人工智能的最新进展是由具有许多参数的大规模模型驱动的&#xff0c;而训练这样的模型LLM需要昂贵的硬件&#xff08;即许多具有大量…

常见 Web漏洞分析与防范研究

前言&#xff1a; 在当今数字化时代&#xff0c;Web应用程序扮演着重要的角色&#xff0c;为我们提供了各种在线服务和功能。然而&#xff0c;这些应用程序往往面临着各种潜在的安全威胁&#xff0c;这些威胁可能会导致敏感信息泄露、系统瘫痪以及其他不良后果。 SQL注入漏洞 …