从0开始手撸一个高性能rpc框架
RPC(RemoteProcedureCall),即远程过程调用。它允许本地计算机调用另一台远程计算机上的程序,不需要了解底层网络细节,从而使得整个过程就像本地调用一样方便。
相信社区上现在还有不少人对前后端交互或者远程系统间调用的理解还是停留在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、gomicro等。那gorpc框架跟这些框架有什么优势呢?个人进行总结一下,grpc:基于http2,google官方支持,周围生态比较完善,但是grpc性能在rpc框架偏低。rpcx:个人开发和维护的框架,组件化和标准化做得不是很好。gomicro:没有深入研究这款框架,但是源码非常偏java风格,像是一个用go语言写的java框架。
所以如果我们自己去实现一款框架,我们希望这款框架的核心特点是:简单易用、高性能、可插拔
框架架构如下:
具体特性如下:高性能,性能是grpc的3。5倍支持反射,代码生成两种调用方式可插拔所有插件都是可插拔、支持业务自定义的多协议支持,目前支持tcp、udp、http,后续会支持更多协议实现了拦截器,支持业务自己定义拦截器实现了连接池,支持业务自定义连接池支持服务发现,提供了基于consul的默认服务发现实现,支持业务自定义服务发现实现。支持负载均衡,提供了随机、轮询、加权轮询、一致性哈希等默认负载均衡实现,支持业务自定义负载均衡实现。支持分布式链路追踪,遵循业界opentracing规范,提供了基于jaeger的分布式链路追踪默认实现,支持业务自定义。支持多种序列化方式,框架默认采用protocol和msgpack序列化,用代码生成方式调用会使用protocol序列化。用反射方式调用会采用msgpack序列化,支持业务自定义序列化方式。
章节预览思维导图如下:
为什么使用go实现
相比于java和c的厚重性和一些历史包袱而言,go更加简洁、优雅。并且go天然支持高并发。这些特点使得go目前得到越来越广泛的关注和使用。我们使用go实现是因为go的这些语言特性,同时也因为go实现的框架源码的非常易读,有助于学习和成长。
更多详情请关注,私信