怎么进行RPC实战与原理的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
什么是 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 微服务架构
关于怎么进行RPC实战与原理的分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注云行业资讯频道了解更多相关知识。