博客
关于我
深入RPC原理
阅读量:94 次
发布时间:2019-02-26

本文共 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/

    你可能感兴趣的文章
    Numpy矩阵与通用函数
    查看>>
    numpy绘制热力图
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    Numpy闯关100题,我闯了95关,你呢?
    查看>>
    nump模块
    查看>>
    Nutch + solr 这个配合不错哦
    查看>>
    NuttX 构建系统
    查看>>
    NutUI:京东风格的轻量级 Vue 组件库
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NutzWk 5.1.5 发布,Java 微服务分布式开发框架
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    NUUO网络视频录像机 upload.php 任意文件上传漏洞复现
    查看>>
    Nuxt Time 使用指南
    查看>>
    NuxtJS 接口转发详解:Nitro 的用法与注意事项
    查看>>
    NVDIMM原理与应用之四:基于pstore 和 ramoops保存Kernel panic日志
    查看>>
    NVelocity标签使用详解
    查看>>
    NVelocity标签设置缓存的解决方案
    查看>>
    Nvidia Cudatoolkit 与 Conda Cudatoolkit
    查看>>
    NVIDIA GPU 的状态信息输出,由 `nvidia-smi` 命令生成
    查看>>
    nvidia 各种卡
    查看>>