RPC 实战与原理 精简版
- 什么是 RPC?
- RPC 有什么作用?
- RPC 步骤
- 为什么需要序列化?
- 零拷贝
- 动态代理实现
- HTTP/2 特性
- 为什么需要服务发现?
- 定时任务 & 时间轮
- 如何注册和发现服务?
- 如何实现 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:Java,阿里
- Motan:Java,微博
- Tars:C++,腾讯(已支持多语言)
- Spring Cloud:Java
- 网关 Zuul
- 注册中心 Eureka
- 服务超时熔断 Hystrix
- 调用链监控 Sleuth
- 日志分析 ELK
跨语言 RPC 框架
- gRPC:HTTP/2
- Thrift:TCP
Spring Cloud 微服务架构

代码、思维导图笔记链接
代码和思维导图在 GitHub 项目中,欢迎大家 star!
coding 笔记、点滴记录,以后的文章也会同步到公众号(Coding Insight)中,希望大家关注_

RPC 实战与原理 精简版的更多相关文章
- 微信小程序实战之百思不得姐精简版
原文:微信小程序实战之百思不得姐精简版 微信小程序基本组件和API已撸完,总归要回到正题的,花了大半天时间做了个精简版的百思不得姐,包括段子,图片,音频,视频,四个模块.这篇就带着大家简述下这个小的A ...
- NETCore Bootstrap Admin 通用后台管理权限 [3]: 精简版任务调度模块
前言 NETCore 里说到任务调度,大家首先想到的应该是大名鼎鼎的 QuartzNET 与 Hangfire,然而本篇介绍的却都不是,而是 Bootstrap Admin(以下简称 BA)通用后台权 ...
- Linux上oracle精简版客户端快速部署
RHEL6 + Oracle 11g客户端快速部署 需求:只是用到客户端的sqlplus, sqlldr功能. 方案:用精简版实现客户端的快速部署 1.上传oracle精简版客户端到服务器/tmp目录 ...
- 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)
轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...
- ArcGIS10.2.1精简版、ArcGIS_Desktop10_Tutorial、破解文件等下载地址
原版ArcGIS for Desktop的ISO文件一般都在4.5G以上,一般人用不上里面很多工具,下载回来又浪费时间,现推出ArcGIS10.2.1精简版(里面只包含主程序.Data Interop ...
- TeamViewer12.0.71503(远程控制软件)精简版 单文件企业版介绍
TeamViewer 是一款能在任何防火墙和 NAT 代理的后台用于远程控制,桌面共享和文件传输的简单且快速的解决方案.为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamViewer 即可 ...
- Log4j快速使用精简版
Log4j快速使用精简版 1.导入log4j-1.2.17.jar包 2.在src根目录下创建log4j.properties文件 log4j.rootLogger=INFO, CONSOLE, FI ...
- VMware10.06精简版安装后台运行
VMware10.06精简版安装时会出现一个安装功能选择菜单,里面有一条后台运行必选功能,一般人会跳过条.当你打算在服务器上用vmware时,一定要安装后台运行服务,否则你无法换出正在运行的后台虚拟机 ...
- [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)
利用周末时间将整个电脑格式化,换成了ubuntu系统- 所谓:扫清屋子再请客! 但是有些软件只在win上有,于是还是考虑装个虚拟机来个——逐步过度策略,一点点地从win上转移到linux上 我的系统是 ...
随机推荐
- 恶补了 Python 装饰器的六种写法,你随便问~
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 今天给大家分享一下关于装饰器的知识点,内容非常干,全程高能,认真吸收看完,一定会对装饰器有更深的理解 ...
- 【剑指offer】01 二维数组中的查找
题目地址:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照 ...
- 容器编排系统K8s之PV、PVC、SC资源
前文我们聊到了k8s中给Pod添加存储卷相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14180752.html:今天我们来聊一下持久存储卷相关话题 ...
- Dubbo服务引用源码解析③
上一章分析了服务暴露的源码,这一章继续分析服务引用的源码.在Dubbo中有两种引用方式:第一种是服务直连,第二种是基于注册中心进行引用.服务直连一般用在测试的场景下,线上更多的是基于注册中心的方式 ...
- 如何写出安全的、基本功能完善的Bash脚本
每个人或多或少总会碰到要使用并且自己完成编写一个最基础的Bash脚本的情况.真实情况是,没有人会说"哇哦,我喜欢写这些脚本".所以这也是为什么很少有人在写的时候专注在这些脚本上. ...
- Code Review 最佳实践
ref: Code review Best Practices 文章将了以下内容: 3w:why.what.when 进行 code review code review 之前的准备 执行 code ...
- http协议中的缓存机制
强缓存 - expires,服务器给客户端一个过期日期,如(2020-12-12),过了该时间,客户端请求服务器重新获取.存在问题:客户端与服务端存在时间差,会导致过期时间不准确 - Cache-co ...
- swing桌面四子棋程序开发过程中遇到的一些问题记录(二)
第二个遇到的问题是将JButton按钮设置成透明的按钮.首先UI给我一张透明的图片,如果我直接给Button按钮设置背景图片的话,是没有透明的效果的,只会留下白色的底,设置前后的效果如下图 制作透明的 ...
- Class 类文件结构
本文部分摘自<深入理解 Java 虚拟机第三版> 概述 我们知道,Java 具有跨平台性,其实现基础就是虚拟机和字节码存储格式.Java 虚拟机不与 Java 语言绑定,只与 Class ...
- Redis性能篇(二)CPU核和NUMA架构的影响
Redis被广泛使用的一个很重要的原因是它的高性能.因此我们必要要重视所有可能影响Redis性能的因素.机制以及应对方案.影响Redis性能的五大方面的潜在因素,分别是: Redis内部的阻塞式操作 ...