--- date: 2021-01-24 --- - [什么是 RPC?](#什么是-rpc) - [RPC 有什么作用?](#rpc-有什么作用) - [RPC 步骤](#rpc-步骤) - [为什么需要序列化?](#为什么需要序列化) - [零拷贝](#零拷贝) - [什么是零拷贝?](#什么是零拷贝) - [为什么需要零拷贝?](#为什么需要零拷贝) - [如何实现零拷贝?](#如何实现零拷贝) - [Netty 的零拷贝有何不同?](#netty-的零拷贝有何不同) - [动态代理实现](#动态代理实现) - [HTTP/2 特性](#http2-特性) - [为什么需要服务发现?](#为什么需要服务发现) - [为什么不用 DNS?](#为什么不用-dns) - [定时任务 & 时间轮](#定时任务--时间轮) - [定时任务的问题?](#定时任务的问题) - [时间轮的应用](#时间轮的应用) - [时钟轮本质](#时钟轮本质) - [时间轮在 RPC 的应用](#时间轮在-rpc-的应用) - [时间轮实现](#时间轮实现) - [如何注册和发现服务?](#如何注册和发现服务) - [如何实现 RPC 远程调用?](#如何实现-rpc-远程调用) - [如何追踪微服务?](#如何追踪微服务) - [注册中心选型](#注册中心选型) - [开源 RPC 框架](#开源-rpc-框架) - [限定语言](#限定语言) - [跨语言 RPC 框架](#跨语言-rpc-框架) - [Spring Cloud 微服务架构](#spring-cloud-微服务架构) # 什么是 RPC? `Remote Procedure Call,远程过程调用。` # RPC 有什么作用? * 屏蔽远程调用、本地调用的区别 * `隐藏底层网络通信的复杂性`,让我们更专注于业务 # RPC 步骤 ![](http://yano.oss-cn-beijing.aliyuncs.com/2021-01-24-083532.png) # 为什么需要序列化? * 网络传输必须是「二进制」,调用方的参数都是对象 * 请求↔二进制消息体 # 零拷贝 ## 什么是零拷贝? ![](http://yano.oss-cn-beijing.aliyuncs.com/2021-01-24-083627.png) ## 为什么需要零拷贝? `网卡`等操作,只能通过`内核操作`,`应用程序`要发送网络数据,需要将`数据复制到内核`。 ## 如何实现零拷贝? 虚拟内存 * 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 感知刷新本地的「服务节点列表」 ![](http://yano.oss-cn-beijing.aliyuncs.com/2021-01-24-084337.png) 实现: * 注册中心 API * 服务健康状态监测:ZooKeeper 的会话超时控制机制 * 服务状态变更通知:ZooKeeper 的 Watcher 机制 # 如何实现 RPC 远程调用? - 客户端、服务端如何建立网络连接:HTTP、Socket - 服务端如何处理请求:NIO(使用 `Netty`) - 数据传输采用什么协议 - 数据如何序列化、反序列化:JSON,PB,Thrift # 如何追踪微服务? 核心理念:调用链,`全局唯一的 ID` 将同一请求串联起来,从而还原调用关系,统计系统指标。 ![](http://yano.oss-cn-beijing.aliyuncs.com/2021-01-24-084849.png) # 注册中心选型 * `高可用` * 集群部署:多个实例 * 多机房部署:一个机房断电等不可抗因素 * `数据一致性` * `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 微服务架构 ![](http://yano.oss-cn-beijing.aliyuncs.com/2021-01-24-085008.png)