本文共 1889 字,大约阅读时间需要 6 分钟。
深入RPC原理
为什么要学习RPC
在分布式系统中,RPC(Remote Procedure Call)是一种常用的进程间通信方式。它允许程序在不直接操作另一台机器的情况下,调用另一台机器上的函数或方法。RPC的核心特点是简化远程调用,使开发者无需显式管理网络通信细节。
TCP/UDP协议
TCP协议
TCP(传输控制协议)是一种面向连接的、可靠的流协议。它通过三次握手建立连接,确保数据传输的顺序性和完整性。TCP的主要特点包括:
- 面向连接:连接建立前需要经过三次握手,断开时需要四次挥手。
- 可靠性:通过序列号和确认机制保证数据传输的完整性。
- 流控制:通过滑动窗口机制避免数据过载。
UDP协议
UDP(用户数据包协议)是一种无连接的、不可靠的数据报协议。其特点包括:
- 无连接:连接建立和断开不需要额外的握手过程。
- 不可靠性:数据包可能丢失或乱序,需要上层协议进行处理。
- 高效率:传输速度快,但数据传输不保证可靠性。
HTTP和RPC协议
HTTP协议
HTTP是一种应用层协议,用于在客户端和服务器之间传输网页内容。其特点包括:
- 无状态性:每次请求服务器时,服务器不需要记住客户端的状态信息。
- 请求-响应模式:客户端发起请求,服务器返回响应。
- 连接管理:支持持续连接(keep-alive)和分段传输(chunked encoding)。
RPC协议
RPC是一种进程间通信方式,允许程序在不直接操作另一台机器的情况下,调用另一台机器上的函数或方法。其特点包括:
- 简化远程调用:开发者无需显式管理网络通信细节。
- 分布式设计:支持分布式系统中的服务间通信。
- 解耦服务:服务间可以直接进行方法调用,无需依赖彼此。
HTTP和RPC对比
| 对比项 | HTTP | RPC |
| 传输协议 | 基于TCP协议 | 可以基于TCP或HTTP协议 |
| 传输效率 | 不适合大数据传输 | 适合大数据传输 |
| 性能消耗 | JSON序列化效率低 | 自定义序列化效率高 |
| 负载均衡 | 需配置Nginx、HAProxy | 内置负载均衡策略 |
| 服务治理 | 需手动通知配置 | 自动化服务发现与通知 |
主流RPC框架
- Dubbo:阿里巴巴开源的RPC框架,支持Java。
- Motan:微博开源的RPC框架,支持Java。
- Tars:腾讯开源的RPC框架,支持C++。
- Spring Cloud:国外Pivotal公司开源的RPC框架。
- gRPC:Google开源的跨语言RPC框架。
- Thrift:Facebook最初开发的跨语言RPC框架。
应用场景
- 分布式操作系统:进程间通讯。
- 分布式软件设计:服务间远程通信。
- 远程数据库服务:客户端访问数据库服务器。
- 分布式应用程序设计:简化远程调用逻辑。
- 分布式程序调试:通过反向RPC实现调试功能。
RPC调用流程
客户端通过本地调用的方式调用服务。 客户端存根接收请求,进行序列化和地址查找。 消息通过网络传输到服务端。 服务端存根解码消息,调用本地服务。 服务返回结果,客户端存根进行反序列化和处理。 序列化技术
序列化技术将对象转换为二进制数据,主要优点包括:
- 性能高效:二进制数据传输速度快。
- 压缩率高:相比于JSON等文本格式,二进制数据体积更小。
- 扩展性强:支持动态类型,适应新字段添加。
动态代理
动态代理通过生成代理类实现接口调用,核心特点包括:
- 透明性:调用透明化,用户无需关心远程调用逻辑。
- 功能扩展:代理类可以添加额外功能,如连接管理、日志记录。
服务注册与发现
服务注册与发现通过注册中心实现服务发现,主要流程包括:
- 服务注册:服务提供方发布服务信息到注册中心。
- 服务订阅:服务消费方从注册中心获取服务信息。
- 心跳检测:维护服务状态,确保服务可用性。
网络IO模型
网络IO模型分为阻塞IO和多路复用模型:
- 阻塞IO:单线程模型,适合低并发场景。
- 多路复用IO:多线程模型,适合高并发场景。
零拷贝技术
零拷贝技术通过减少内核与用户空间的数据拷贝,提升网络通信效率。Netty框架通过直接内存和组合缓冲区实现零拷贝。
时间轮
时间轮通过定时任务实现任务调度,减少不必要的轮询,提升系统性能。Dubbo框架使用HashedWheelTimer实现时间轮。
异步处理机制
异步处理通过Future方式实现,服务端和调用端都支持异步调用,提升系统吞吐量。
路由与负载均衡
路由通过服务注册中心实现,负载均衡策略包括随机、轮询、权重等,Dubbo默认使用随机负载均衡策略。
熔断限流
熔断限流通过控制请求流量,保护服务节点免受过载。Sentinel框架提供滑动窗口限流策略,实现服务自我保护。
转载地址:http://gssz.baihongyu.com/