书籍介绍
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 实现、编解码、序列化、连接池、服务发现、负载均衡、拦截器、分布式链路追踪、认证鉴权、组件化、插件体系、框架性能优化等。
本书目录
第一章:RPC 原理
第二章:RPC 框架概览
第三章:框架搭建——server
第四章:框架搭建——client
第五章:框架搭建——transport 实现
第六章:超时机制
第七章:自定义协议实现
第八章:协议编解码实现
第九章:序列化实现
第十章:日志模块实现
第十一章:连接池实现
第十二章:拦截器实现
第十三章:组件可插拔实现
第十四章:插件体系实现
第十五章:服务发现原理及选型
第十六章:服务发现实现——consul
第十七章:负载均衡实现
第十八章:分布式链路追踪原理及选型
第十九章:分布式链路追踪实现——jaeger
第二十章:认证鉴权实现
第二十一章:代码生成工具实现
第二十二章:框架性能测试
第二十三章:框架性能优化
第二十四章:总结与展望
本书特色
- 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 的分布式链路追踪默认实现,支持业务自定义。
- 支持多种序列化方式,框架默认采用 protocol 和 msgpack 序列化,用代码生成方式调用会使用 protocol 序列化。用反射方式调用会采用 msgpack 序列化,支持业务自定义序列化方式。
- 更多特性正在陆续支持中 ……
适宜人群
- 一定的后台基础
- 一定的语言基础,最好是 go,当然,java、c++ 也没有关系,需要花 2 ~ 3 天学习 go 语法。
作者介绍
花名 DIU哥,毕业于武汉大学信息管理学院,2016年春招进入阿里手淘基础架构部,负责双十一流量模型和devops平台的搭建。2018年从离开阿里,入职腾讯,负责腾讯QQ某产品后端工作。有着高并发场景下服务的治理和优化经验。发表过《go 入门》、《go 源码解读》等多个专栏。