深入浅出RPC框架|青训营笔记

简介: 由于课程涉及到的RPC知识需要自己对其有较为全面的理解后才能比较好的get到课程中提及的各种框架设计的点,因此我建议阅读Kitex框架的源码,再结合课程目录去体会Kitex设计的初衷。

课程资料

课程视频:https://live.juejin.cn/4354/yc_RPC-framework

课程导学:https://juejin.cn/post/7099665398655615006/#heading-0

课后作业:https://juejin.cn/post/7099742161540743198/

由于课程涉及到的RPC知识需要自己对其有较为全面的理解后才能比较好的get到课程中提及的各种框架设计的点,因此我建议阅读Kitex框架的源码,再结合课程目录去体会Kitex设计的初衷,笔记就以罗列概况为主,以备后续对比查阅。

基本概念

需要解决的问题

  • 函数映射
  • 数据转换成字节流
  • 网络传输

image-20220527101616829

RPC的好处

  • 单一职责,有利于分工协作和运维开发
  • 可扩展性强
  • 故障隔离,服务整体更可靠

使用RPC的问题

  • 服务宕机,对方如何处理?
  • 调用时发生网络异常,如何保证消息的可达性?
  • 请求量突增导致服务无法及时处理,有哪些应对措施?

分层设计

image-20220527102227284

编解码层

  • 语言特定的格式:一些语言内建了将内存对象编码为字节序列的支持,如Java的java.io.Serializable
  • 文本格式:JSON、XML、CSV,具有可读性
  • 二进制编码:具有跨语言,高性能优点,如Thrift的BinaryProtocol、Protobuf等

协议层

  • 特殊结束符:一个特殊字符作为每个协议单元结束标志

image-20220527103559317

  • 变长协议:定长加不定长的部分组成,其中定长的部分需要描述不定长内容长度

image-20220527103613720

网络通信层

image-20220527104019494

关键指标

稳定性&易用性&扩展性

  • 熔断:保护调用方,防止被调用的服务出现问题而影响整个链路
  • 限流:保护被调用方,防止大流量把服务压垮
  • 超时控制:避免浪费资源在不可用的节点上
  • 请求成功率

    • 负载均衡
    • 重试
  • 长尾请求

    • 网络抖动
    • GC
    • Backup Request(解决方式)
  • 注册中间件:以上的功能都通过注册中间件的方式启用

观测性

  • Log(日志)、Metric(监控)、Tracing(追踪)
  • 内置观测性服务

高性能

  • 高吞吐
  • 低延迟
  • 手段:

    • 连接池
    • 多路复用
    • 高性能编解码协议
    • 高性能网络库

企业实践

Kitex是字节跳动内部的Golang微服务RPC框架,先已开源。

Kitex文档:https://www.cloudwego.io/zh/docs/kitex/getting-started/

Kitex体验:https://juejin.cn/post/7098966260502921230

Kitex源码阅读—脚手架代码的生成(一):https://juejin.cn/post/7100867939829563422

整体架构

image-20220527112335990

自研网络库

原生网络库的问题

  • 原生库无法感知连接状态

在使用连接池时,池中存在失效的连接,影响连接池的复用。

  • 原生库存在goroutine暴涨的风险

一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能。

自研网络库 — Netpoll

  • 解决无法感知连接状态

引入epoll主动监听机制,感知连接状态

  • 解决goroutine暴涨的风险

建立goroutine池,复用goroutine

  • 提升性能

引入Nocopy Buffer,向上层提供NoCopy 的调用接口,编解码层面零拷贝

扩展性设计

支持多协议,也支持灵活的自定义协议扩展

image-20220527113831443

性能优化

网络库优化

  • 调度优化

    • epoll_wait在调度上的控制
    • gopool重用goroutine,降低同时运行携程数
  • LinkBuffer

    • 读写并行无锁,支持nocopy地流式读写
    • 高效扩缩容
    • Nocopy Buffer池化,减少GC
  • Pool

    • 引入内存池和对象池,减少GC开销

编解码优化

  • Codegen

    • 预计算并分配内存,减少内存操作次数,包括内存分配和拷贝
    • inline减少函数调用次数和避免不必要的反射操作
    • 自研了Go语言实现的Thrift IDL解析和代码生成器,支持完善的Thrift IDL语法和语义检查,并支持了插件机制 — Thriftgo
  • JIT

    • 使用JIT编译技术改善用户体验的同时带来更强的编解码性能,减轻用户维护生成代码的负担
    • 基于JIT编译技术的高性能动态Thrift 编解码器 — Frugal

合并部署

  • 微服务过于微小,传输和序列化开销越来越大
  • 将亲和性强的服务实例尽可能调度到同一个物理机,远程RPC调用优化为本地IPC调用

小结

由于课程关于RPC框架的理解需要结合具体的使用经验,因此我推荐尝试开始独立阅读Kitex的源码,可以从边缘组件开始,如:分析是如何通过命令行创建脚手架代码的,等逐渐熟悉源码分析的方法之后,可以尝试阅读核心组件的源码,再结合课程的组织目录,仔细体会Kitex的设计。

相关文章
|
28天前
|
自然语言处理 负载均衡 API
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
gRPC 是一种现代开源高性能远程过程调用(RPC)框架,支持多种编程语言,可在任何环境中运行。它通过高效的连接方式,支持负载平衡、跟踪、健康检查和身份验证,适用于微服务架构、移动设备和浏览器客户端连接后端服务等场景。gRPC 使用 Protocol Buffers 作为接口定义语言,支持四种服务方法:一元 RPC、服务器流式处理、客户端流式处理和双向流式处理。
|
4月前
|
Dubbo 网络协议 Java
RPC框架:一文带你搞懂RPC
这篇文章全面介绍了RPC(远程过程调用)的概念、原理和应用场景,解释了RPC如何工作以及为什么在分布式系统中广泛使用,并探讨了几种常用的RPC框架如Thrift、gRPC、Dubbo和Spring Cloud,同时详细阐述了RPC调用流程和实现透明化远程服务调用的关键技术,包括动态代理和消息的编码解码过程。
RPC框架:一文带你搞懂RPC
|
3月前
|
XML 负载均衡 监控
分布式-dubbo-简易版的RPC框架
分布式-dubbo-简易版的RPC框架
|
4月前
|
XML 存储 JSON
(十二)探索高性能通信与RPC框架基石:Json、ProtoBuf、Hessian序列化详解
如今这个分布式风靡的时代,网络通信技术,是每位技术人员必须掌握的技能,因为无论是哪种分布式技术,都离不开心跳、选举、节点感知、数据同步……等机制,而究其根本,这些技术的本质都是网络间的数据交互。正因如此,想要构建一个高性能的分布式组件/系统,不得不思考一个问题:怎么才能让数据传输的速度更快?
|
6月前
|
存储 缓存 Linux
【实战指南】嵌入式RPC框架设计实践:六大核心类构建高效RPC框架
在先前的文章基础上,本文讨论如何通过分层封装提升一个针对嵌入式Linux的RPC框架的易用性。设计包括自动服务注册、高性能通信、泛型序列化和简洁API。框架分为6个关键类:BindingHub、SharedRingBuffer、Parcel、Binder、IBinder和BindInterface。BindingHub负责服务注册,SharedRingBuffer实现高效数据传输,Parcel处理序列化,而Binder和IBinder分别用于服务端和客户端交互。BindInterface提供简单的初始化接口,简化应用集成。测试案例展示了客户端和服务端的交互,验证了RPC功能的有效性。
416 6
|
5月前
|
分布式计算 负载均衡 数据安全/隐私保护
什么是RPC?有哪些RPC框架?
RPC(Remote Procedure Call,远程过程调用)是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节,使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分布式计算系统,其中不同的组件可以分布在不同的计算机上,但它们之间可以像在同一台机器上一样相互调用。
162 8
|
5月前
|
网络协议 Dubbo Java
什么是RPC?RPC和HTTP对比?RPC有什么缺点?市面上常用的RPC框架?
选择合适的RPC框架和通信协议,对于构建高效、稳定的分布式系统至关重要。开发者需要根据自己的业务需求和系统架构,综合考虑各种因素,做出适宜的技术选型。
482 1
|
5月前
|
负载均衡 Java
使用Java实现RPC框架
使用Java实现RPC框架
|
5月前
|
负载均衡 Java
|
6月前
|
分布式计算 资源调度 网络协议
分布式系统详解--框架(Hadoop--RPC协议)
分布式系统详解--框架(Hadoop--RPC协议)
48 0