【2-1:RPC设计】

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.mzph.cn/diannao/45850.shtml

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

相关文章

【C++ | 虚函数】虚函数详解 及 例子代码演示(包含虚函数使用、动态绑定、虚函数表、虚表指针)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

Matlab-Simulink模型保存为图片的方法

有好多种办法将模型保存为图片,这里直接说经常用的 而且贴到Word文档中清晰、操作简单。 simulink自带有截图功能,这两种方法都可以保存模型图片。选择后直接就复制到截切板上了。直接去文档中粘贴就完事了。 这两个格式效果不太一样,第一种清…

JS登录页源码 —— 可一键复制抱走

前期回顾 https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501 登录页预览效果 <!DOCTYPE html> <html lang"en"><head…

通信协议 | 一文玩转UART协议就够了

文章目录 协议基础1、UART简介2、UART特性3、UART协议帧3.1、起始位3.2、数据位3.3、奇偶校验位3.4、停止位 4、UART通信步骤 最详细的UART通讯协议分析Verilog代码实现UART接口模块驱动 协议基础 1、UART简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&…

制造业ERP源码 ERP系统源码 ERP小程序源码

制造业ERP源码 ERP系统源码 ERP小程序源码 资料&#xff1a; 委外工厂管理 客户列表 车间管理 供应商管理 账户管理 商品管理 仓库管理 职员管理 自取地址管理 司机管理 辅助资料 客户等级 供应商分类 客户分类 商品分类 支出类别管理 收入类别管…

uniapp使用多列布局显示图片,一行两列

完整代码&#xff1a; <script setup>const src "https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/shuijiao.jpg" </script><template><view class"content"><view class"img-list"><image :src"src…

KnoBo:医书学习知识,辅助图像分析,解决分布外性能下降和可解释性问题

KnoBo&#xff1a;从医书中学习知识&#xff0c;辅助图像分析&#xff0c;解决分布外性能下降问题 提出背景KnoBo 流程图KnoBo 详解问题构成结构先验瓶颈预测器参数先验 解法拆解逻辑链对比 CLIP、Med-CLIPCLIPMed-CLIPKnoBo 训练细节预训练过程OpenCLIP的微调 构建医学语料库文…

【经典面试题】是否形成有环链表

1.环形链表oj 2. oj解法 利用快慢指针&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…

前端练习小项目——方向感应名片

前言&#xff1a;在学习完HTML和CSS之后&#xff0c;我们就可以开始做一些小项目了&#xff0c;本篇文章所讲的小项目为——方向感应名片 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习之前&#xff0c;先让我们看一…

Java中的代理机制

代理的概述 代理&#xff1a;给目标对象提供一个代理对象&#xff0c;并且由代理对象控制着对目标对象的引用&#xff08;跟多态一样&#xff09; mybatis、spring都运用了代理机制 跳过创建类的过程&#xff0c;直接产生对象 简单来说&#xff0c;我们使用代理对象来代替对…

【Python】日期和时间模块

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言时间元组datetime 模块datetime类获取当前日期和时间 timedelta类日期和时间运算 strftime()方法格式化时间日期格式化符号 strptime()方法 Time 模块Time 模块内置函数Time 模…

编译适用于 Apple Silicon Macs 的 Chromium 教程

本教程将指导你如何在 Apple Silicon Macs 上编译 Chromium&#xff0c;包括所需的系统要求、工具安装、源码获取、环境配置、编译和运行步骤。 一、系统要求 Apple Silicon Mac&#xff08;如 M1、M2&#xff09;。安装 Xcode 和 macOS SDK&#xff08;通过 App Store 安装最…

AWDAWFAAFAWAWFAWF

创建两张表&#xff1a;部门&#xff08;dept&#xff09;和员工&#xff08;emp&#xff09; 创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称 创建视图v_dept_emp_count(dept…

Ubuntu使用Nginx部署uniapp打包的项目

使用uniapp导出web项目&#xff1a; 安装&#xff1a; sudo apt install nginx解压web.zip unzip web.zip移动到/var/www/html目录下&#xff1a; sudo cp -r ~/web/h5/ /var/www/html/重启Nginx&#xff1a; sudo service nginx restart浏览器访问&#xff1a;http://19…

Java高频面试基础知识点整理4

干货分享&#xff0c;感谢您的阅读&#xff01;背景​​​​​​高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09; 最全文章见&#xff1a;Java高频面试基础知识点整理 &#xff08;一&#xff09;Java基础高频知识考点 针对人员&#xff1a; 1.全部人员都…

算法学习笔记(8.4)-完全背包问题

目录 Question&#xff1a; 图例&#xff1a; 动态规划思路 2 代码实现&#xff1a; 3 空间优化&#xff1a; 代码实现&#xff1a; 下面是0-1背包和完全背包具体的例题&#xff1a; 代码实现&#xff1a; 图例&#xff1a; 空间优化代码示例 Question&#xff1a; 给定n个物品…

Tomcat组件概念和请求流程

Tomcat:是一个Servlet容器(实现了Container接口)&#xff0c;容器分层架构从上到下分为。Engine(List<Host>)->Host(List<Context>)->Context(List<Wrapper>)->Wrapper(List<Servlet>); Engine:引擎&#xff0c;Servlet 的顶层容器&#xff0…

UML建模案例分析-类图中的关系

概要 类图之间的关系比较多&#xff0c;绝大多数情况下重点关注的还是关联关系、组合、聚合这三种&#xff0c;最终是如何对应到代码上的。 例子 以订单为例&#xff1a;订单和订单项之间是组合关系&#xff0c;这和数据库实体之间不一样。数据库实体有主外键&#xff0c;开…

Java聚合跑腿系统对接云洋聚合跑腿系统源码低价快递小程序APP公众号源码

一站式解决方案 &#x1f680;引言&#xff1a;跑腿服务的市场需求与聚合趋势 在快节奏的现代生活中&#xff0c;跑腿服务成为了越来越多人的选择。为了满足这一市场需求&#xff0c;各大跑腿平台纷纷涌现。然而&#xff0c;如何将这些平台进行有效整合&#xff0c;提供更为便…

比特币交易繁忙的一天

早晨:市场开盘与准备工作 6:00 AM - 全球市场监测 交易员们早早起床,开始监测全球市场动态,尤其是亚洲市场的动向。通过查看新闻、分析报告和市场数据,了解可能影响比特币价格的因素。 7:00 AM - 团队会议 召开晨会,讨论当天的交易策略。团队分析前一天的交易情况,评…