zoukankan      html  css  js  c++  java
  • 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 微服务架构

    代码、思维导图笔记链接

    代码和思维导图在 GitHub 项目中,欢迎大家 star!

    coding 笔记、点滴记录,以后的文章也会同步到公众号(Coding Insight)中,希望大家关注_

  • 相关阅读:
    Unity性能优化-遮挡剔除
    unity AssetBundle
    unity中Animation与Animator的区别
    VS 项目没有“添加引用”选项
    VS 右键属性闪一下啥也打不开问题
    协程
    协程
    Python 线程和进程(2)
    线程锁
    ssh传文件加MD5
  • 原文地址:https://www.cnblogs.com/510602159-Yano/p/14326513.html
Copyright © 2011-2022 走看看