跟我一起源码阅读之gRPC开篇

**前言:**很多程序员都知道,通过学习优秀的开源框架可以很大程度上解锁更多编码姿势和花样。但是没有目的,没有方法的去阅读开源项目,很容易就被庞大繁杂的代码给迷晕了!那么该如何以正确的姿势去阅读开源项目呢?请各位看官品鉴此文,跟我一起庖丁解牛,来阅读gRPC框架吧!

阅读此文你将收获

  • 了解什么是RPC
  • 了解该如何以正确的姿势阅读源码
  • 以gRPC为例来试验该如何阅读源码

大纲

  1. 什么是RPC
  2. 为什么要阅读源码
  3. 如何阅读源码
  4. 从gRPC开始的源码阅读

一、什么是RPC

第一次反思什么是RPC这个问题的时候,还是在夜读群里,有个哥们问怎么进行RPC调用,我说用gRPC,有个百度的老哥反问,如果没有gRPC怎么办?
跟我一起源码阅读之gRPC开篇
那么我们来看看什么是RPC呢?Remote Procedure Call(远程过程调用),说人话就是让你调用远程方法和调用本地(一个工程内)方法一样!

如何做到呢?

  1. 是不是撸码的时候调用个远程方法和本地调用方法一样?
  2. 既然是远程方法,那么调用的时候那些网络细节,与通信协议是否应该屏蔽好,让我们专注于业务开发?

这就是RPC!

其实RPC在我们日常生活中非常常见,MQ的客户端向broker消费消息的通信过程是RPC,Redis客户端向Redis请求操作的通信过程也是RPC。RPC就是整个系统架构中的血管,网络!

二、为什么要阅读源码

2.1 我的系统出问题了而我却不知道系列

在业务开发中,我们常常会选择各种开源软件作为项目架构的组成部分,例如用于缓存的Redis,用于消息队列的kafka或者Rocket MQ等等。

但很多开发同学长期停留在使用阶段,用到了,遇到了就去百度或者谷歌一下。这样的操作方式,一旦遇上了“疑难杂症”从哪里找一位老中医来给系统诊脉呢?
跟我一起源码阅读之gRPC开篇

所以请以正确的姿势,正确的态度来面对你所使用的开源项目!那就是掌握其原理和实现细节,知其然亦知其所以然!当你的系统出现问题的时候,根据其一些表征现象,大概就能定位到问题,然后解决掉他!

2.2 我们团队没有大牛,所以我菜的正常系列

最近新冠肺炎疫情闹了一个笑话,一哥们出门,保安拦住他不让他出去,说你不戴口罩不准出去,那哥们说我出去就是为了买口罩!( ̄▽ ̄)"

很多时候像我一样的普通程序员也面临这样的这样的问题,没有高手帮忙code review,代码姿势提升不上来。没有技术大牛领头研究一些技术,自己像无头苍蝇一样东搞搞西搞搞,最后收效甚微!

如果你存在这些问题,那么就请你阅读源码!
跟我一起源码阅读之gRPC开篇

2.3 为什么阅读源码能让你进步

因为通过正确的姿势阅读优秀的开源项目,你会从这个项目里收获正确写代码的姿势,例如在路由方面的设计,gin和beego有什么不同?gin的context是怎么用的?那么中间件呢?iris和gin还有beego有什么区别?这些问题一旦你弄明白后你在框架设计路由和中间件的意识就已经直追行业大佬水平了!

还有某些让人头疼的“学院派”知识,例如网络,协议等等。通常没经历过高并发项目的同学会认为这些没啥用,因为平时用不上,随便怎么玩机器资源也不会被耗尽。但是如果你的项目流量一旦过大,各种问题都会暴露,这些问题是有迹可循的,但是如果你不甚了解这些基础知识,就算把问题的一堆线索暴露在你面前,你也只能干瞪眼~

跟我一起源码阅读之gRPC开篇

可别跟我说贵司用户量小,学不学都一样,反正用不上,我想套用一句装逼的话:

业务开发工程师,你真的愿意做一辈子 CRUD boy 吗?

三、如何阅读源码

不少人阅读源码的时候首先把项目给down下来,用IDE打开,然后找到main函数,从main函数开始一行行往下读,半天不到就不知道自己看到哪里去了,好像是这么回事,但又好像不是这样。感觉自己看懂了点,可是懂了的这些有是干啥的?

此之谓阅读源码从入main到放弃
跟我一起源码阅读之gRPC开篇

正确的源码阅读姿势为:

  • 阅读文档了解项目:

    1. 软件整体结构
    2. 了解其功能特性
    3. 涉及关键技术
    4. 实现原理
    5. 周边生态
  • 有一定的认知和感受

    1. 这个项目是干什么的?
    2. 能解决哪些问题?
    3. 适合在哪些场景使用?
    4. 适合在哪些场景使用?
    5. 如何使用?
  • 带着问题读源码

  • 执行目标

    1. 画出主要流程的流程图
    2. 画出主要流程的时序图

以问题为模块的阅读源码方式,花费少,收益高,阅读一部分就有一部分的收获,有一部分的提高

四、从gRPC开始的源码阅读

再从第一节了解了RPC是什么之后,我们将以gRPC为目标来实践第三节源码阅读的方法论!

A high-performance, open source universal RPC framework
gRPC官网

通过官方文档我们可以了解到gRPC的使用说明和方法,下图是一个典型的RPC调用图,内容不多,但是隐藏的信息可不少!

跟我一起源码阅读之gRPC开篇

从上图和文档中我们可以了解到,用gRPC来进行远程服务调用就仅仅需要gRPC Stub(Client)用Proto Request向远方的gRPC Server发起服务调用,然后远方的gRPC Server通过Proto Response(s)将调用结果返回给gRPC Stub。

实际上真的这么简单就能进行远程服务调用了吗?

当然不是,之所以这么简单的原因是gRPC这个RPC框架帮我们封装好了一切,让我们真正的像调用本地方法一样调用远程服务!

这些被屏蔽的细节,是我们后续系列文章将要探索和学习的内容。此前,我们不妨先分析分析,梳理一下,gRPC究竟做了啥?

跟我一起源码阅读之gRPC开篇

一个gRPC从开始发起请求到返回总共要经历过序列化,编解码,以及网络传输这些内容。这些东西在我们使用gRPC框架做远程服务调用的时候完全感知不到!

至于gRPC的stub之间的连接管理,健康检查,负载均衡,异常重试,优雅启停机,熔断限流等等更是我们可以从gRPC源码中所能够获得的知识!

跟我一起源码阅读之gRPC开篇

上图是我画的gRPC源码阅读的知识树,我希望在接下来的gRPC源码阅读系列文章中,能够和大家一起将其补全,成为自己的技能树!

尾声与说明

这几千个文字远远不足以表达我内心想说的话,像冰山一样,浮在水面上的永远只有一小部分。在接下来的文章中,我会尽我所能,将源码阅读以一种轻松愉快的方式表达出来。

说明:

第三节源码阅读的方法论来自李玥老师极客时间专栏《消息队列高手课-09 | 学习开源代码该如何入手?》

源码学习的思维导图在这里 https://github.com/first-giver/MindMapping.git

期待下期与各位读者再见!