怎么进行RPC实战与原理的分析
怎么进行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实战与原理的分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注蜗牛博客行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论