前言
本文主要是对Go语言Zinx 源码框架 深入学习。前面已经读了关于Go的基础知识书籍, 希望通过具体开源项目学习下别人写法,进而对Go有更深刻了解。
官网地址: zinx.me
简单介绍:Zinx主要用于客户端 和 服务端通过TCP建立链接,然后对客户端触达的消息进行处理。zinx已经在很多企业进行开发使用,具有一定的价值。
为什么选择Zinx源码看?
-
从star量/近期代码提交量看不算太低 。
-
对TCP通信部分有过较多接触。
-
当然最重要的是项目可以run起来。
能学到什么?
-
可以对看过的知识进行巩固。遇到不懂的用法,反过来在看基础知识,相互加深。
-
更重要的是了解源码作者框架设计思想。怎么设计类,怎么架构的等等。
为什么会新开一个分支?
代码是看不会的,需要多写。
因此即使是大部分文件结构相同,也会挨着手敲一遍。再回过头多看几遍,每次都会逐行修复注释。
最终确保理解项目架构。
文字再多的描述反而累赘,选择 类图和泳道图 来描述出来,方便感兴趣的同学快速吸收。
类架构设计图
类框架设计,类之间依赖关系。 下图描述了Zinx框架类设计思路。
流程交互图
类交互图。下图描述了TCP服务创建,到客户端调用过程。从时序角度来看类调用链路。
个人感悟
框架优点:
-
各个模块职责清晰,单独功能都拆出来。
-
框架可插拔性高,例如 ConnectStart、PreHandler、PostHandler、ConnectEnd等hook都预留。
-
里面有些类是单例的,或者每次都需要实例的。作者思路很清晰(在类架构图中可以体现到)。
框架缺点:
-
给最终用户写的Router,也就是消息处理函数,设计不合理。 传入的request对象权限太大了,可以通过request获得最高级别的单例 Server。 我想在大型团队合作中,这块会出极大风险,容易误操作Server,进而导致整个服务不可用。
-
Connect对象设计不够抽象。 本质上来说MsgHander不关心是TCP/UDP 设置还是上层的HTTP等,当前设计的过于狭隘。 例如:我想在某些场景下由TCP降级为UDP发送,或者websocket链接降级为http请求。本质上来说当前做不到。
再简单的说:MessageHandler消息处理单元,不需要关注消息是通过什么方式给我的,维持与客户端关系那是Connection对象的事情。