【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.rhkb.cn/news/375998.html

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

相关文章

STM32Cubemx配置生成 Keil AC6支持代码

文章目录 一、前言二、AC 6配置2.1 ARM ComPiler 选择AC62.2 AC6 UTF-8的编译命令会报错 三、STM32Cubemx 配置3.1 找到stm32cubemx的模板位置3.2 替换文件内核文件3.3 修改 cmsis_os.c文件3.4 修改本地 四、编译对比 一、前言 使用keil ARM compiler V5的时候,编译…

M J更改图像生成方式的参数选项

一个完整的/imagine命令可能包含几个内容,例如图像 URL、图像权重、算法版本和其他开关。 /imagine参数应遵循以下顺序: /imagine prompt: https://example/tulip.jpg a field of tulips in the style of Mary Blair --no farms --iw .5 --ar 3:2 在这种情况下,“开关”是指…

如何压缩pdf文件大小,怎么压缩pdf文件大小

在数字化时代,pdf文件因其稳定的格式和跨平台兼容性,成为了工作与学习中不可或缺的一部分。然而,随着pdf文件内容的丰富,pdf文件的体积也随之增大,给传输和存储带来了不少挑战。本文将深入探讨如何高效压缩pdf文件大小…

【保姆级教程】CenterNet的目标检测、3D检测、关键点检测使用教程

一、代码下载 仓库地址:https://github.com/xingyizhou/CenterNet?tab=readme-ov-file 二、目标检测 2.1 下载预训练权重 下载预训练权重ctdet_coco_dla_2x.pth放到models文件夹下 下载链接:https://drive.google.com/file/d/18Q3fzzAsha_3Qid6mn4jcIFPeOGUaj1d/edit …

《昇思25天学习打卡营第19天|生成式-Pix2Pix实现图像转换》

学习内容:Pix2Pix实现图像转换 1.模型简介 Pix2Pix是基于条件生成对抗网络(cGAN, Condition Generative Adversarial Networks )实现的一种深度学习图像转换模型,该模型是由Phillip Isola等作者在2017年CVPR上提出的&#xff0c…

热题系列9

剑指 Offer 39. 数组中出现次数超过一半的数字 给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半&am…

防火墙nat策略实验和多出口实验和智能选路实验

要求 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8,分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9,多出口环境基于带宽比例进行选路&#xff0c…

GuLi商城-商品服务-API-品牌管理-OSS获取服务端签名(续)

如何进行服务端签名直传_对象存储(OSS)-阿里云帮助中心 gulimall-third-party服务的代码: package com.nanjing.gulimall.thirdparty.controller;import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.utils.BinaryUtil; impor…

电脑如何快速删除相同的文件?分享5款重复文件删除工具

您有没有发现最近电脑运行速度变慢了?启动时间变得更长,甚至完成简单任务也难以如常?这可能是因为重复文件堆积所致。我们发现,清理或移动这些重复的文件和文件夹可以产生惊人的效果。通过删除不必要的重复文件和垃圾文件&#xf…

【C++】:继承[下篇](友元静态成员菱形继承菱形虚拟继承)

目录 一,继承与友元二,继承与静态成员三,复杂的菱形继承及菱形虚拟继承四,继承的总结和反思 点击跳转上一篇文章: 【C】:继承(定义&&赋值兼容转换&&作用域&&派生类的默认成员函数…

YOLOv5白皮书-第Y5周:yolo.py文件解读

本文为365天深度学习训练营 中的学习记录博客 原作者:K同学啊|接辅导、项目定制 本次训练是在前文《YOLOv5白皮书-第Y2周:训练自己的数据集》的基础上进行的。 前言 文件位置:./models/yolo.Py 这个文件是YOLOv5网络模型的搭建文件,如果你想改进YOLOv5&…

three.js官方案例webgpu_reflection.html学习记录

目录 ​1 判断浏览器是否支持 2 THREE.DirectionalLight 2.1DirectionalLightShadow 3 Texture 3.1 .wrapS 3.2 .wrapT 3.3 .colorSpace 4 创建地面 5 WebGPURenderer 6 OrbitControls 控制器 7 屏幕后处理 import * as THREE from three;import { MeshPhongNodeMa…

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

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

基于FPGA的千兆以太网设计(1)----大白话解释什么是以太网

1、什么是以太网? 还记得初学以太网的时候,我就被一大堆专业名词给整懵了:什么以太网,互联网,MAC,IP,局域网,万维网,网络分层模型等等等等。慢着!我学的不是以太网吗?怎么出来这么一大堆东西? 啊!以太网究竟是什么?别急,我接下来就尽量用通俗的大白话来给你解释…

AURORA仿真

AURORA 仿真验证 定义:AURORA是一种高速串行通信协议,通常用于在数字信号处理系统和其他电子设备之间传输数据。它提供了一种高效的方式来传输大量数据,通常用于需要高带宽和低延迟的应用中。AURORA协议通常由Xilinx公司的FPGA器件支持&#…

Linux C | 管道open打开方式

Linux C | 管道open打开方式 1.参考 1. 管道 2.现象 是的,这段代码在调用 open(AUDIOIN_FIFO, O_RDONLY) 时可能会被阻塞。原因是 FIFO(命名管道)在以只读模式打开时,如果没有其他进程以写模式打开该 FIFO,open 调用将…

Argo CD入门、实战指南

1. Argo CD概述 1.1 什么是 Argo CD Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。 1.2 为什么选择 Argo CD 应用程序定义、配置和环境应具有声明性并受版本控制。应用程序部署和生命周期管理应自动化、可审计且易于理解。 2. Argo CD基础知识 在有效使用 Ar…

MySQL-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

299k stars利用Public APIs提升开发效率:探索APILayer提供的开源资源

299k stars利用Public APIs提升开发效率:探索APILayer提供的开源资源 在现代软件开发中,API(应用程序接口)是实现应用间通信和功能扩展的关键工具。公共API(Public APIs)则为开发者提供了宝贵的资源&#…

微积分-导数7(关联变化率)

例一 空气被充入一个球形气球中,使其体积以每秒100立方厘米的速度增加。当气球的直径为50厘米时,气球半径的增加速度是多少? 解答:球体的体积公式为 V 4 3 π r 3 V \frac{4}{3}\pi r^3 V34​πr3 为了使用给定的信息&#x…