gRPC-go源码剖析与实战专栏介绍 - Go语言中文社区

gRPC-go源码剖析与实战专栏介绍


1、背景介绍

无论是分布式架构,还是微服务架构,服务之间如何高效、可靠性的通信是具有一定的挑战性的;那么,解决方案之一就是使用RPC通信;
而由google开发的grpc-go是一个高性能、开源和通用的RPC框架,面向移动和HTTP2设计。
在涉及到网络通信的领域内,经常可以看到grpc-go的身影;
目前,已经在Kubernetes、Docker、Istio等优秀开源框架中广泛应用;因此,有必要对grpc-go的核心原理进行深入了解,以便能够更好的为微服务架构,分布式架构提供安全、高效、可靠的网络通信服务。

2、专栏解读:

本专栏非常详细的介绍了grpc-go的源码,编写了近100篇文章来帮助大家了解每个功能的核心原理;

阅读本专栏不仅可以了解到grpc-go的核心原理;
如,如何建立rpc连接,rpc请求,滑动窗口(流量控制)原理,如何自定义平衡器解析器重试机制,加密,认证,如何让grpc-go支持lz4算法等等;如何基于wireshark进行抓包分析; 还可以从grpc-go源码中学到很多技巧:如,grpc-go框架是如何使用事件机制的,如何使用上下文的?如何比较两个数的大小?当某个步骤失败时如何对本步骤以及前面的步骤实现重试机制等等,对go语言的提高有很大的帮助;

本专栏最大的目的,希望您学完之后,该技术能够成为您的技术亮点;比如,在求职简历上可以表明熟读grpc-go源码,具备二次开发grpc-go源码的能力;经过自己的努力后,甚至可以称为grpc-go框架的源码贡献者;也是证明你go语言水平的一种能力;希望这一项技术能够称为您简历上的亮点之一。

3、专栏主要分为以下几个模块

3.1.模块1:grpc客户端是如何向grpc服务器端建立起rpc连接的

本模块主要介绍rpc链接建立阶段所涉及到的内容;
主要涉及到的内容:
  grpc客户端跟grpc服务器端整个交互过程主要经历过那些阶段;如何建立起的tcp链接?
如果rpc链接失败后,grpc客户端是否尝试重试链接,每次连接的间隔时间是如何设置的;等等

3.2.模块2:解析器原理以及实践介绍

本模块介绍解析器相关原理;
主要涉及到的内容:
  解析器是用来做什么的?如何实现一个解析器,如何注册一个解析器?对grpc框架内置的解析器介绍?如何使用consul来自定义解析器;

3.3.模块3:平衡器原理以及实践介绍

本模块介绍平衡器相关原理;
主要涉及到的内容:
  平衡器主要实现什么功能?客户端如何指定使用哪个平衡器呢?如何实现、注册、创建平衡器?pickFirst平衡器介绍、round_robin平衡器介绍、grpc+LoadBalancer平衡器介绍、grpc+nginx平衡器介绍、grpc+consul自定义解析器介绍等等;

3.4.模块4:grpc客户端是如何向grpc服务器端发起rpc请求的以及处理流程

本模块介绍的原理以及流程:是在rpc建立连接基础之上的;也就是rpc连接建立后,客户端如何调用本地方法,服务器端如何接收请求,执行请求,反馈执行结果给客户端。
主要涉及到的内容:
  在rpc请求阶段,主要经历了哪些过程;在客户端一侧,什么场景下,会触发流的创建?客户端是如何将请求服务的名称,方法名称等信息通知服务器端的?
以及如何将请求方法的参数值发送给服务器端的?客户端一侧,接收服务器端反馈执行结果的流程?grpc服务器端一侧,处理客户端的整体流程?
grpc服务器端对客户端的每次tcp请求,是单协程处理,还是多协程处理?等等;

3.5.模块5:帧接收原理介绍

本模块介绍帧接收器相关原理;每次客户端跟服务器端建立rpc连接后,就会创建各自的帧接收器,专门用来接收对方发送的帧;
主要内容涉及到:
  grpc客户端帧接收器的原理介绍;grpc客户端帧接收器是如何处理不同的帧的?grpc服务器端帧接收器的原理介绍;服务器端接收到客户端的头帧后,如何处理?等等

3.6.模块6:帧发送器原理介绍

本模块介绍帧发送器相关原理;每次客户端跟服务器端建立rpc连接后,就会创建各自的帧发送器,专门用来将各种类型的帧发送给对方;客户端跟服务器端的帧发送器原理是一样的。
主要内容涉及到:
  帧发送器的整体流程介绍;如何将帧数据再内存里进行存储和读取?在同一个进程里如何使用通知的方式消费数据帧?帧发送器处理帧时有什么特点?帧发送器的基本流程介绍?
为什么源码作者将帧发送器的代码如何设计?客户端一侧,头帧的整体处理流程介绍?等等

3.7.模块7:滑动窗口(流量控制)

本模块主要介绍grpc服务器端在接收客户端发送的数据帧时,是如何动态控制客户端发送的数据帧大小的;也可以称之为流量控制。
涉及到的内容:
  滑动窗口的整体流程介绍;帧发送器是如何将数据帧发送给服务器端的;在服务器端一侧,帧接收器是如何将接收到的数据帧存储到本地的?
数据帧缓存到recvBuffer前的流控?从recvBuffer里读取数据时,如何调整流控指标?服务器端在真正执行客户端的请求方法时,是如何完整的读取到请求参数值的?
如何计算本次发送的数据帧的大小?服务器端发送的设置帧、窗口更新帧是如何影响客户端的帧大小的?
基于wireshark对grpc进行抓包分析:如何配置wireshark能够抓取grpc包,多场景抓包测试用例分析;等等

3.8.模块8:取消功能cancellation

本模块对grpc框架中的取消功能cancellation进行介绍;
涉及到的内容:
  取消cancellation功能的基本原理介绍;取消功能实现什么效果?客户端一侧,是如何处理取消功能的?服务器端一侧,是如何处理取消功能的?等等

3.9.模块9:截止时间deadline

本模块对grpc框架中的截止时间Deadline进行介绍;
涉及到的内容:
  截止时间deadline跟取消功能cancellation的区别?截止时间可以发生在哪些阶段?客户端一侧,如何配置启动截止时间?
客户端一侧,当截止时间发生在不同的阶段,每个阶段是如何处理的?
服务器端一侧,是如何处理截止时间的?等等

3.10.模块10:健康检测health

本模块对grpc框架中的健康检测HealthChecking进行介绍;
涉及到的内容:
  客户端是如何判定服务器端的服务的健康状态的?健康检测原理的整体流程图介绍;客户端的链接状态时如何更新为Ready状态的?
客户端如何判断服务器端的服务能够正常提供服务呢?服务器端健康检测Watcher的核心思想?健康检测运行时场景的异常场景处理?等等

3.11.模块11:拦截器interceptor

本模块对grpc框架中的拦截器interceptor原理进行介绍;
涉及到的内容:
  拦截器的分类;客户端如何使用拦截器;服务器端如何使用拦截器;服务器端何时触发拦截器流程?客户端何时触发拦截器流程?
拦截器的调度策略,即拦截器的执行过程?等等

3.12.模块12:保持链接keepalive

本模块对grpc框架中的保持链接keepalive原理进行介绍;
涉及到的内容:
  保持链接跟健康检测的区别?服务器端keepalive的原理图?服务器端何时触发keepalive功能的启动?当链接处于不同状态时,服务器端如何处理链接?
客户端一侧keepalive的原理图?服务器端跟客户端交互处理goAway帧的流程图;等等

3.13.模块13:多路复用multiplex

本模块对grpc框架中多路复用multiplex原理进行介绍;
涉及到的内容:
  grpc采矿机是如何实现多路复用的;实现多路复用的基本思路?grpc框架中,服务器端是如何区分不同的服务请求的?一个服务器请求,可能存在多个http2数据帧,
服务器端是如何存储不同服务请求的http2数据帧的?如何按顺序存储?如何按顺序读取数据帧呢?等等

3.14.模块14:压缩特性compression

本模块对grpc框架中压缩特性compression原理进行介绍;
涉及到的内容:
  grpc框架是如何支持不同的压缩算法的?如何启动压缩特性?如何注册一个压缩算法?客户端一侧,压缩处理数据的原理?服务器端一侧,压缩处理数据的原理?
在客户端一侧,发送数据阶段,压缩器压缩数据的处理流程?在服务器端一侧,如何获取客户端采用的压缩算法呢?如何解压数据?如何让grpc框架支持lz4压缩算法呢?等等

3.15.模块15:重试机制retry

本模块对grpc框架中的重试机制retry原理进行介绍;
涉及到的内容:
  在grpc框架中什么场景下使用了重试机制?客户端一侧,如何启动、禁止重试机制功能?如何定义、使用重试策略呢?grpc框架中,实现重试机制的主体思路?
重试机制withRetry实现方式的特点?客户端是如何判断是不是允许重试呢?如果某个阶段失败了,客户端如何重试前几步的操作呢?等等

3.16.模块16:元数据metadata

本模块对grpc框架中的元数据metadata原理进行介绍;
涉及到的内容:
  客户端一侧,如何创建元数据?如何使用创建的元数据?如何将元数据信息存储到上下文中的呢?服务器端一侧,是如何接收元数据的?如何让服务端提供的服务中有能力使用元数据;等等

3.17.模块17:加密encryption

本模块对grpc框架中加密encryption原理进行介绍;
涉及到的内容:
  grpc框架支持哪几种加密?基于tls证书加密的测试用例介绍?基于ca的tls证书加密测试用例介绍?
链路建立阶段时的tls加密原理介绍:客户端一侧,加密原理介绍?服务器端加密原理介绍,介绍时配合wireshark抓包分析;如何配置wireshark能够抓取tls包?整体握手过程原理介绍;
数据帧发送阶段的tls加密介绍;如何使用在tls链路建立阶段双方协商好的数据作为加密数据的?使用协商好的加密数据开始对数据帧进行加密?等等

3.18.模块18:认证authentication

本模块对grpc框架中的认证authentication原理进行介绍;
涉及到的内容:
  如何理解认证?grpc+oauth2.Token认证方式介绍:如何配置认证?认证功能属于链路级别功能,还是属于流级别功能?服务器端一侧是如何获取认证信息的?如何来验证认证信息的?grpc+自定义认证方式介绍;grpc+Basic认证方式介绍:basic认证方式介绍;模拟Basic认证测试用例介绍;grpc+jwt认证方式介绍:jwt认证介绍;jwt-grpc-go认证测试用例介绍;客户端向服务器端发起授权码请求?如何具体校验jwt?如何生成jwt?等等

4、适宜人群

go语言研发工程师、go语言爱好者
微服务研发工程师
kubernetes开发工程师
docker开发工程师
中间件研发工程师
计算机相关专业的大学生、研究生
对grpc-go感兴趣的爱好者

专栏大纲

版权声明:本文来源Segmentfault,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://segmentfault.com/a/1190000039990893
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-13 18:01:17
  • 阅读 ( 1701 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢