从 0 到 1 开发一款高性能 rpc 框架

本小册主要从一个开发者的角度,从技术选型到编码实现,从 0 到 1去实现一款高性能 rpc 框架,主要技术点包括 client 和 server 通讯、超时机制实现、协议的制定、传输层 transport 实现、编解码、序列化、连接池、服务发现、负载均衡、拦截器、分布式链路追踪、认证鉴权、组件化、插件体系、框架性能优化等。
1.6K+ 购买
打开
作者 DIU哥
发布时间 2020-04-09 16:02
更新时间 2020-07-29 03:50

作者介绍

花名 DIU哥,毕业于武汉大学信息管理学院,2016年春招进入阿里手淘基础架构部,负责双十一流量模型和devops平台的搭建。2018年从离开阿里,入职腾讯,负责腾讯QQ某产品后端工作。有着高并发场景下服务的治理和优化经验。发表过《go 入门》、《go 源码解读》等多个专栏。

小册介绍

RPC (Remote Procedure Call),即远程过程调用。它允许本地计算机调用另一台远程计算机上的程序,不需要了解底层网络细节,从而使得整个过程就像本地调用一样方便。

相信社区上现在还有不少人对前后端交互或者远程系统间调用的理解还是停留在 http 调用的层面。以 http 协议的形式发起的调用,其实就是一种 rpc 调用。在分布式/微服务环境中,前端/客户端发起的一个调用,可能会经过后端数十个服务,所以每个服务之间的通信效率就显得非常重要。http1.x 是文本协议,文本协议的传输效率比较低下,这必然会导致整个链路的耗时成本增加。所以如何解决分布式/微服务环境中的服务间的通信问题,是我们通向一个资深工程师的必经之路。这就是 rpc 框架设计的初衷。

一提到 rpc ,大家可能就条件反射地想到 java 的 dubbo 和 google 的 grpc。但是假如把对 dubbo 和 grpc 了解能到 50% 以上的人筛选一遍,可能就十不足一。为什么呢?

因为绝大多数开发者仅仅是框架的使用者,很少会去看框架的源码。就算去看源码,可能也会非常吃力、云里雾里。原因有二:

  • 第一是因为一款 rpc 框架牵涉面比较比较广,牵涉到网络通信、协议、序列化、打解包、连接池、服务发现、负载均衡、分布式链路追踪、监控、日志、认证鉴权、并发处理、性能等多个知识点,所以对开发者的要求非常高。
  • 第二,我们知道,一款框架刚成型时,也就是从 0 到 1 的过程,代码是比较原始,也是比较好读懂的。但是后续从 1 到 100 的过程,可能经过层层重构和迭代,此时你再去读源码,可能就会比较吃力。因为你需要剥开后续的层层框架新增的能力,才能去体会框架实现者最初的实现和设计。

我们的 gorpc 框架就提供给了大家一个各项功能完整的,刚实现从 0 到 1这个过程的框架。并且一步步给大家解析了每个功能的具体实现思路和实现过程,这是非常难得的

本小册主要从一个开发者的角度,从技术选型到编码实现,从 0 到 1去实现一款高性能 rpc 框架,主要技术点包括 client 和 server 通讯、超时机制实现、协议的制定、传输层 transport 实现、编解码、序列化、连接池、服务发现、负载均衡、拦截器、分布式链路追踪、认证鉴权、组件化、插件体系、框架性能优化等。

小册特色

  • 100 % 实战,完全从实战角度出发,所有的技术点拆解都是都会进行代码实现。所有的代码都会完全暴露给读者进行参考。
  • 讲述框架从 0 到 1 去进行框架设计、技术选型和实现的过程,而不是从 1 到 100 的源码解读
  • 超时机制、自定义协议、编解码、服务发现、负载均衡、连接池、拦截器、分布式链路追踪、认证鉴权、组件化、插件体系等多个特色知识点,绝对是网络上无法 google 和百度到的纯原创,经过先实现了一款超越 grpc 性能的 rpc 框架,然后再从头到尾来进行梳理得出的经验总结。

框架特色

我们知道,其实世面上有非常多的 rpc 框架了。java 有阿里的 dubbo、微博的 motan 等,go 有 grpc、rpcx、go-micro 等。那 gorpc 框架跟这些框架有什么优势呢?个人进行总结一下,

  • grpc :基于 http2,google 官方支持,周围生态比较完善,但是 grpc 性能在 rpc 框架偏低。
  • rpcx : 个人开发和维护的框架,组件化和标准化做得不是很好。
  • go-micro : 没有深入研究这款框架,但是源码非常偏 java 风格,像是一个用 go 语言写的 java 框架。

所以如果我们自己去实现一款框架,我们希望这款框架的核心特点是:简单易用、高性能、可插拔

框架架构如下:

具体特性如下:

  • 高性能,性能远远超过 grpc ,详情可以参考 性能
  • 支持 反射, 代码生成 两种调用方式
  • 可插拔 所有插件都是可插拔、支持业务自定义的
  • 多协议支持,目前支持 tcp、udp、http,后续会支持更多协议
  • 实现了拦截器,支持业务自己定义拦截器
  • 实现了连接池,支持业务自定义连接池
  • 支持服务发现,提供了基于 consul 的默认服务发现实现,支持业务自定义服务发现实现。
  • 支持负载均衡 ,提供了随机、轮询、加权轮询、一致性哈希等默认负载均衡实现,支持业务自定义负载均衡实现。
  • 支持分布式链路追踪,遵循业界 opentracing 规范,提供了基于 jaeger 的分布式链路追踪默认实现,支持业务自定义。
  • 支持多种序列化方式,框架默认采用 protocolmsgpack 序列化,用代码生成方式调用会使用 protocol 序列化。用反射方式调用会采用 msgpack 序列化,支持业务自定义序列化方式。
  • 更多特性正在陆续支持中 ......

章节预览

  • 第一章 : RPC原理
  • 第二章 : RPC框架概览
  • 第三章 : 框架搭建 —— server
  • 第四章 : 框架搭建 —— client
  • 第五章 : 框架搭建 —— 传输层transport实现
  • 第六章 : 超时机制
  • 第七章 : 自定义协议实现
  • 第八章 : 协议编解码实现
  • 第九章 : 序列化实现
  • 第十章 : 日志模块实现
  • 第十一章 : 连接池实现
  • 第十二章 : 拦截器实现
  • 第十三章 : 组件可插拔实现
  • 第十四章 : 插件体系实现
  • 第十五章 : 服务发现原理及选型
  • 第十六章 : 服务发现实现
  • 第十七章:负载均衡实现
  • 第十八章:分布式链路追踪原理及选型
  • 第十九章:分布式链路追踪实现
  • 第二十章:认证鉴权实现
  • 第二十一章:代码生成工具实现
  • 第二十二章:框架性能测试
  • 第二十三章:框架性能优化
  • 第二十四章:总结及展望

你会学到什么?

通过此小册,你可以使用 go 语言从框架搭建、client 和 server 通讯、超时机制实现、协议的制定、传输层 transport 实现、编解码、序列化、连接池、服务发现、负载均衡、拦截器、分布式链路追踪、认证鉴权、组件化、插件体系、框架性能优化等等多方面从 0 到 1 一步步 coding 来完成一个高性能的 rpc 框架。

为什么使用 go 实现

相比于 java 和 c++ 的厚重性和一些历史包袱而言,go 更加简洁、优雅。并且 go 天然支持高并发。这些特点使得 go 目前得到越来越广泛的关注和使用。我们使用 go 实现是因为 go 的这些语言特性,同时也因为 go 实现的框架源码的非常易读,有助于学习和成长。go 入门也非常简单,3 天左右即可入门,降低我们课程的入门成本。

适宜人群

  1. 一定的后台基础
  2. 一定的语言基础,最好是 go,当然,java、c++ 也没有关系,需要花 2 ~ 3 天学习 go 语法。

社区推荐

之前被 gocn 官方社区推荐,如下:

购买须知

  1. 本小册为图文形式内容服务,共计 N 节;
  2. 全部文章预计 x 月 x 日更新完成;
  3. 购买用户可享有小册永久的阅读权限;
  4. 购买用户可进入小册微信群,与作者互动;
  5. 掘金小册为虚拟内容服务,一经购买成功概不退款;
  6. 掘金小册版权归北京北比信息技术有限公司所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布/发表,违者将依法追究责任;
  7. 在掘金小册阅读过程中,如有任何问题,请邮件联系 xiaoce@xitu.io
  1. 第一章:RPC 原理
  2. 第二章:RPC 框架概览
  3. 第三章:框架搭建——server
  4. 第四章:框架搭建——client
  5. 第五章:框架搭建——transport 实现
  6. 第六章:超时机制
  7. 第七章:自定义协议实现
  8. 第八章:协议编解码实现
  9. 第九章:序列化实现
  10. 第十章:日志模块实现
  11. 第十一章:连接池实现
  12. 第十二章:拦截器实现
  13. 第十三章:组件可插拔实现
  14. 第十四章:插件体系实现
  15. 第十五章:服务发现原理及选型
  16. 第十六章:服务发现实现——concul
  17. 第十七章:负载均衡实现
  18. 第十八章:分布式链路追踪原理及选型
  19. 第十九章:分布式链路追踪实现——jaeger
  20. 第二十章:认证鉴权实现
  21. 第二十一章:代码生成工具实现
  22. 第二十二章:框架性能测试
  23. 第二十三章:框架性能优化
  24. 第二十四章:总结与展望