从0开始,创建一个高性能RPC框架

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 的源码解读
  • 超时机制、自定义协议、编解码、服务发现、负载均衡、连接池、拦截器、分布式链路追踪、认证鉴权、组件化、插件体系等多个特色知识点,经过先实现了一款超越 grpc 性能的 rpc 框架,然后再从头到尾来进行梳理得出的经验总结。

框架特色

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

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

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

框架架构如下:

具体特性如下:

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

章节预览思维导图如下:

为什么使用 go 实现

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

更多详情请关注,私信

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据