Kitex源码阅读——脚手架代码是如何通过命令行生成的(二)

网友投稿 700 2022-11-27

Kitex源码阅读——脚手架代码是如何通过命令行生成的(二)

Kitex源码阅读——脚手架代码是如何通过命令行生成的(二)

前言

Kitex是字节跳动内部的Golang微服务RPC框架,先已开源。

在Kitex体验的文章中,我们使用Kitex从零构建了自己的服务,只要定义好​​IDL​​​(接口描述语言),按照Kitex提供的命令行规则,就可以生成支持​​Thrift​​​、​​Protobuf​​的客户端和服务端相关的脚手架代码,使得我们可以直接着手编写服务端的响应实现和客户端的请求发起逻辑。

这篇文章我们继续探究Kitex究竟是怎么生成脚手架代码的,通过​​上篇文章​​​的分析,已经明白​​main.go​​​文件中,​​init()​​​函数的作用是注册命令解析参数​​flag​​​,提供给后续使用Go原生命令行解析库​​flag​​​做解析。接下来我们继续分析​​main.go​​文件中剩余的部分,探究如何在解析得到命令行输入参数之后,根据参数内容完成脚手架代码的自动生成。

提醒:Kitex源码阅读系列的文章连贯性很大,建议按顺序阅读。并且随着源码的阅读,我会从零开始,不断扩展我们自己基于Kitex编写的kitexx框架的功能(目前kitexx已经拥有了解析命令行参数的功能) 。

源码分析

分析main.go的main()函数

通过观察注释,main函数分为两个部分,下面分析。

以插件模式运行

这一部分是一个​​switch​​结构,获取命令行的第一个参数值,如果满足则case条件则会调用给定的​​Run()​​​方法,完成初始化,并且执行完成后退出程序。虽然我们还没继续深入,但是可以猜测,这里kitex集成了​​protoc​​​和​​thriftgo​​创建客户端服务端脚手架的功能,这里根据命令行需求去调用对应代码生成逻辑。

只有在不满足这两个case的情况下,main函数继续执行,运行kitex自己的脚手架代码生成逻辑。这里我们先着重于分析kitex自己逻辑,越过这个部分。

以kitex模式运行

分析args.parseArgs()函数

用于解析命令行参数,并且对属于的命令行参数进行有效性检查,可以说整个args.parseArgs()都在完成各种检查。

关于​​a.buildFlags()​​​方法这里再说明一下,所有能在命令行输入的flag参数都是事先注册在​​FlagSet​​​中的,并且赋予默认值,随之使用​​flag库​​​解析命令行输入的​​flag​​​和紧跟着的​​value​​​之后,将会用输入​​value​​替换注册的​​flag​​的默认值,完成解析后,这些​​flag​​​的​​value​​已经保存了你需要创建的服务的各种信息,只要提供给脚手架生成部分的代码使用即可。

这里着重分析一下​​args.parseArgs()​​内最后路径检查方法​​a.checkPath​​的源码,因为其包含的内容较多。

通过分析​​checkPath()​​​函数,可以找到​​Kitex文档​​​中对应的下方​​-module​​参数需要择情况添加的原因,针对两种模式管理的go项目​​(go path / go mod)​​​,​​kitex工具​​采用不同的路径管理逻辑(因为最终要确定脚手架代码生成的位置)。

分析buildCmd()函数

​​cmd := buildCmd(&args, out)​​是main函数体完成参数初始化和检查后的核心部分,下面将具体分析:

由于​​buildCmd()​​​函数中​​lookupTool()​​函数比较重要,这里先深入分析:

再来看​​buildCmd()​​函数:

关于​​thriftgo​​:因为字节内部使用RPC的IDL为​​thrift​​格式,因此用Go语言实现了自己的thrift编译器​​thriftgo​​,它有着与​​apache/thrift​​编译工具相似的命令行接口,并且通过插件机制对其进行了增强。

thriftgo地址:​​github.com/cloudwego/t…​​

而​​protoc​​​则是对应于​​protobuf​​格式IDL的编译器,这样是使用Google原生的没有对其增强。

最后再调用​​cmd.Run()​​方法,则将执行这个定义好的外部命令。(要确保thriftgo编译工具已经安装)

小结

这里整体梳理一下通过命令行生成IDL定制的脚手架的过程:

向​​FlagSet​​​注册会有哪些命令行参数会被输入(​​flag​​键值对)解析输入的​​flag​​键值对并且保存,并且对其进行语法检查从​​FlagSet​​​中获取输入的参数,封装成外部命令​​Cmd​​​,用于调用​​thriftgo​​​或者​​protoc​​的命令​​cmd.Run()​​​在指定的文件路径中生成客户端和服务端脚手架代码​​kitex_gen​​

当然在我们分析main函数源码的时候,没有分析kitex命令行工具作为插件的工作流程,这里希望你触类旁通,尝试自己去分析一下。

为kitexx增加脚手架代码生成功能

编写kitexx框架

首先要确保你已经安装了​​thriftgo​​​编译工具,然后编写​​kitexx​​​工具的主函数,它的作用就是先通过​​kitexx​​​命令行获取到​​g参数​​​,指定​​thriftgo​​​将要编译IDL的生成语言为​​go​​​,然后就是将这些参数构建一个外部命令去调用​​thriftgo​​编译工具,在指定的文件夹构建脚手架代码。

这里为什么我知道驱动​​thriftgo​​​编译工具最少只需要​​-g参数​​​呢?因为​​thriftgo​​的代码仓库给出了最简单的使用方式:

编写IDL

然后使用​​go build -o ~/go/bin/kitexx​​​命令将其编译成一个可执行文件到​​$GOPATH/bin​​​目录下,接着编写IDL文件​​echo.thrift​​​,这里我使用​​thrift​​格式

测试kitexx功能

然后在命令行输入命令:​​kitexx -g go​​,就会在控制台显示:

并且在当前目录下生成了​​gen-go​​​文件,其中包含了生成的脚手架代码,当然由于​​kitexx​​​功能过于简单,我们输入的参数也仅仅只有一个​​-g​​,难免生成的脚手架十分单薄,但我们的目的已经达到了。

总结

通过第二篇文章的讲解,已经很清晰的介绍了​​kitex​​​工具是如何通过命令行,生成go语言RPC服务的脚手架代码的(小结部分我已经有所概括),并且我们也自研了拥有脚手架生成功能的​​kitexx微框架​​,通过实践印证了我们对源码的理解。

\

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:设计模式之Database/SQL与GORM实践|青训营笔记
下一篇:SpringBoot实现阿里云快递物流查询的示例代码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~