RPC 实战与原理

文章目录

  • 什么是 RPC?
  • RPC 有什么作用?
  • RPC 步骤
  • 为什么需要序列化?
  • 零拷贝
    • 什么是零拷贝?
    • 为什么需要零拷贝?
    • 如何实现零拷贝?
    • Netty 的零拷贝有何不同?
  • 动态代理实现
  • HTTP/2 特性
  • 为什么需要服务发现?
    • 为什么不用 DNS?
  • 定时任务 & 时间轮
    • 定时任务的问题?
    • 时间轮的应用
    • 时钟轮本质
    • 时间轮在 RPC 的应用
    • 时间轮实现
  • 如何注册和发现服务?
  • 如何实现 RPC 远程调用?
  • 如何追踪微服务?
  • 注册中心选型
  • 开源 RPC 框架
    • 限定语言
    • 跨语言 RPC 框架
  • Spring Cloud 微服务架构

什么是 RPC?

Remote Procedure Call,远程过程调用。

RPC 有什么作用?

  • 屏蔽远程调用、本地调用的区别
  • 隐藏底层网络通信的复杂性,让我们更专注于业务

RPC 步骤

在这里插入图片描述

为什么需要序列化?

  • 网络传输必须是「二进制」,调用方的参数都是对象
  • 请求↔二进制消息体

零拷贝

什么是零拷贝?

在这里插入图片描述

为什么需要零拷贝?

网卡等操作,只能通过内核操作应用程序要发送网络数据,需要将数据复制到内核

如何实现零拷贝?

虚拟内存

  • mmap + write
  • sendfile

Netty 的零拷贝有何不同?

  • 一个请求,可能拆分成多个数据包
  • 数据包的组合在用户空间,解决用户空间内存的拷贝处理问题,CompositeByteBuf
  • 也包括用户空间、内核空间的数据拷贝:Direct Buffers

动态代理实现

  • JDK:只能代理接口
  • Javassist操作底层字节码,不需要反射,性能好
  • Byte Buddy:更容易的 API,速度比 Javassist 快,Spring、Jackson 使用

HTTP/2 特性

  • 多路复用,同一链路双向发送stream数据
  • Header 压缩

为什么需要服务发现?

公共的“通讯录”

为什么不用 DNS?

  • DNS多级缓存,且缓存时间长
  • 需要搭建负载均衡,额外成本

定时任务 & 时间轮

定时任务的问题?

  • future 启动线程进行异步编程,sleep
  • 如果5秒超时,高并发的
  • 让CPU额外轮询遍历,浪费CPU

时间轮的应用

  • 延迟消息
  • 订单过期(10分钟未付款,取消订单)

时钟轮本质

减少额外的扫描操作

时间轮在 RPC 的应用

调用端请求的超时处理,节省CPU

时间轮实现

Netty的 TimeWheel

如何注册和发现服务?

  • RPC Server 提供服务,向 Registry 注册自身
  • RPC Client 调用服务,从 Registry 拉取服务列表
  • Server 节点变更时,同步变更,Client 感知刷新本地的「服务节点列表」

在这里插入图片描述

实现:

  • 注册中心 API
  • 服务健康状态监测:ZooKeeper 的会话超时控制机制
  • 服务状态变更通知:ZooKeeper 的 Watcher 机制

如何实现 RPC 远程调用?

  • 客户端、服务端如何建立网络连接:HTTP、Socket
  • 服务端如何处理请求:NIO(使用 Netty
  • 数据传输采用什么协议
  • 数据如何序列化、反序列化:JSON,PB,Thrift

如何追踪微服务?

核心理念:调用链,全局唯一的 ID 将同一请求串联起来,从而还原调用关系,统计系统指标。

在这里插入图片描述

注册中心选型

  • 高可用
    • 集群部署:多个实例
    • 多机房部署:一个机房断电等不可抗因素
  • 数据一致性
    • CP 型:ZooKeeper(Redis),强一致性,机房间断网,注册中心不可用
    • AP 型:牺牲一致性,保证可用性。Eureka

开源 RPC 框架

限定语言

  • Dubbo、Nacos:Java,阿里
  • Motan:Java,微博
  • Tars:C++,腾讯(已支持多语言)
  • Spring Cloud:Java
    • 网关 Zuul
    • 注册中心 Eureka
    • 服务超时熔断 Hystrix
    • 调用链监控 Sleuth
    • 日志分析 ELK

跨语言 RPC 框架

  • gRPC:HTTP/2
  • Thrift:TCP

Spring Cloud 微服务架构

在这里插入图片描述

两岸猿声啼不住,轻舟已过万重山   --李白《早发白帝城》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DDD领域驱动设计系列-原理篇-战术设计

概述 上篇战略设计产出了领域及问题域领域模型;详见:DDD领域驱动设计系列-原理篇-战略设计-CSDN博客 战术设计篇聚焦如何落地,包含实际解决方案模型落地,架构分层(Clean,CQRS),Rep…

04-C++ 类和对象-02

类和对象-02 1. this 指针 1.1 概念: 谁调用this所在的函数,this就存储谁的地址,即指向谁 。 1.2 特点: 在当前类的非静态成员函数中调用本类非静态成员时,默认有this关键字静态成员函数,没有this指针…

Neovim+ctag浏览、编辑源代码

Neovimctag浏览、编辑源代码 一 配置安装vim及 ctags vim应该可以不用装,直接装neovim,这里我是先装了vim再装的neovim Ctags必须装,后面用neovim telescope索引函数时才有效 vim复制系统粘贴板:vim输入模式下,按shi…

低功耗16位MCU:R7F100GLL3CFA、R7F100GLN2DLA、R7F100GLN3CFA、R7F100GLN2DFA是新一代RL78微控制器

产品介绍: RL78/G23低功耗MCU可在41μA/MHz CPU运行频率下工作,功耗低,停止4KB SRAM保持时为210nA。该MCU设有snooze模式排序器,可显著降低间歇工作时的功耗。RL78/G23组具有1.6V至5.5V宽工作电压范围,频率高达32MHz。…

bean生命周期源码(三)

书接上文 文章目录 一、Bean的销毁逻辑1. 简介2. Bean销毁逻辑的注册3. Bean的销毁过程 一、Bean的销毁逻辑 1. 简介 前面我们已经分析完了Spring创建Bean的整个过程的源码,在创建bean的核心方法中doCreateBean这一个核心方法中,在方法的最后面有这么…

SpringCloudAlibaba Seata在Openfeign跨节点环境出现全局事务Xid失效原因底层探究

原创/朱季谦 曾经在SpringCloudAlibaba的Seata分布式事务搭建过程中,跨节点通过openfeign调用不同服务时,发现全局事务XID在当前节点也就是TM处,是正常能通过RootContext.getXID()获取到分布式全局事务XID的,但在下游节点就出现获…

ros2+gazebo+urdf:ros2机器人使用gazebo的urdf文件中的<gazebo>部分官网资料

原文链接SDFormat extensions to URDF (the gazebo tag) — Documentation 注意了ros2的gazebo部分已经跟ros1的gazebo部分不一样了: Toggle navigation SpecificationAPIDocumentationDownload Back Edit Version: 1.6 Table of C…

我在代码随想录|写代码Day-Day之总结篇

我是用笔手写的我觉得这样可以对个人记忆会更好,而且理解更深解释也更清楚 下面是手写笔记 总结部分----- 第一章 二分 二分模版 图片可能反了下不过没有关系 图形打印模版题 第二章 链表 链表基本操作和疑问 链表代码操作和解析----5大操作 删除部分 对结点的操作 反了反了…

关于个人Git学习记录及相关

前言 可以看一下猴子都能懂的git入门,图文并茂不枯燥 猴子都能懂的git入门 学习东西还是建议尽可能的去看官方文档 权威且详细 官方文档 强烈建议看一下GitHub漫游指南及开源指北,可以对开源深入了解一下,打开新世界的大门! …

若依SQL Server开发使用教程

1. sys_menu表中的将菜单ID修改为自动ID,解决不能增加菜单的问题,操作流程如下: 解决方案如下 菜单栏->工具->选项 点击设计器,去掉阻止保存要求更新创建表的更改选项,点确认既可以保存了 2 自动生成代码找不表的解决方案…

C语言--直接插入排序【排序算法|图文详解】

一.直接插入排序介绍🍗 直接插入排序又叫简单插入排序,是一种简单直观的排序算法,它通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法描述: 假设要排序…

idea 找不到 Free MyBatis plugin

idea 找不到 free mybatis plugin 可以使用mybatisX替换: 插件安装成功后,重启idea。

【English】水果单词小小汇总~~

废物研究生,只要不搞科研干啥都是开心的,啊啊啊啊啊科研要命。作为一个水果怪(每天不吃水果就要命的那种哈哈哈哈)突然发现竟然就知道什么apple、banana、orange!惭愧惭愧,正好兴致正浓,来整理一…

Java HashMap在遍历时删除元素

文章目录 1. HashMap数据结构1.1 数组单向链表红黑树1.2 指定初始容量,省去多次扩容步骤1.3 获取map内容:Map.Entry 2. 遍历集合时删除元素3. computeIfAbsent()方法 1. HashMap数据结构 jdk是1.8版本 HashMap 线程不安全 ConcurrentHashMap 线程安全 1.…

jvm_下篇_补充_MAT从入门到精通

MAT从入门到精通 概述安装mac安装指定jdk配置内存 使用配置获取dump文件Overview下功能解释HistogramDominator TreeLeak SuspectsOverview功能说明结尾Thread_Overview OQLHeap Dump OverviewFind Object by address 概述 尽管JVM提供了自动内存管理的机制,试图降…

golang的jwt学习笔记

文章目录 初始化项目加密一步一步编写程序另一个参数--加密方式关于StandardClaims 解密解析出来的怎么用关于`MapClaims`上面使用结构体的全代码实战项目关于验证这个项目的前端初始化项目 自然第一步是暗转jwt-go的依赖啦 #go get github.com/golang-jwt/jwt/v5 go get githu…

小狐狸ChatGPT系统 H5前端底部菜单导航文字修改方法

小狐狸ChatGPT系统后端都前端都是编译过的,需要改动点什么非常难处理,开源版修改后也需要编译后才能使用,大部分会员也不会使用,像简单的修改下底部菜单文字、图标什么的可以对照处理。这里以小狐狸ChatGPT系统1.9.2版本H5端为例&…

Unity向量按照某一点进行旋转

Unity向量按照某一点进行旋转 一、unity的旋转二、向量按照原点进行旋转注意案例 三、向量按照指定位置进行旋转案例 一、unity的旋转 首先要知道一点就是在Unity的旋转中使用过四元数进行旋转的,如果对一个物体的rotation直接赋值你会发现结果不是你最终想要的结果…

Kubectl 部署有状态应用(上)

前面介绍了Deployment以及如何部署无状态应用。 Kubectl 部署无状态应用Deployment Controller详解(上)Deployment Controller详解(下) 本文将继续介绍如何在k8s上部署有状态应用。 有状态和无状态服务的区别 无状态&#xff…

数组元素反序

和前面的字符串逆向输出有异曲同工之妙 第一位和最后一位交换位置,然后用比大小循环 那么接下来修改一下这个程序,我们接下来解释一下p的概念 画图解释: 在最前面的 定义的时候,我们将p(0)定义在了1上&…