前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RPC 实战与原理 精简版

RPC 实战与原理 精简版

作者头像
Yano_nankai
发布2021-01-29 11:14:14
1.4K0
发布2021-01-29 11:14:14
举报
文章被收录于专栏:二进制文集二进制文集

什么是 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!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 RPC?
  • RPC 有什么作用?
  • RPC 步骤
  • 为什么需要序列化?
  • 零拷贝
    • 什么是零拷贝?
      • 为什么需要零拷贝?
        • 如何实现零拷贝?
          • Netty 的零拷贝有何不同?
          • 动态代理实现
          • HTTP/2 特性
          • 为什么需要服务发现?
            • 为什么不用 DNS?
            • 定时任务 & 时间轮
              • 定时任务的问题?
                • 时间轮的应用
                  • 时钟轮本质
                    • 时间轮在 RPC 的应用
                      • 时间轮实现
                      • 如何注册和发现服务?
                      • 如何实现 RPC 远程调用?
                      • 如何追踪微服务?
                      • 注册中心选型
                      • 开源 RPC 框架
                        • 限定语言
                          • 跨语言 RPC 框架
                          • Spring Cloud 微服务架构
                          • 代码、思维导图笔记下载
                          相关产品与服务
                          文件存储
                          文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档