前言

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

Kitex文档:https://www.cloudwego.io/zh/docs/kitex/getting-started/

Kitex体验:https://juejin.cn/post/7098966260502921230

Kitex源码阅读—脚手架代码的生成(一):https://juejin.cn/post/7100867939829563422

IDLThriftProtobuf
main.goinit()flagflagmain.go

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

源码分析

分析main.go的main()函数

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

以插件模式运行

switchRun()protocthriftgo

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

以kitex模式运行

分析args.parseArgs()函数

  • 用于解析命令行参数,并且对属于的命令行参数进行有效性检查,可以说整个args.parseArgs()都在完成各种检查。
a.buildFlags()FlagSetflag库flagvaluevalueflagflagvalue
args.parseArgs()a.checkPath
checkPath()Kitex文档-module(go path / go mod)kitex工具

分析buildCmd()函数

cmd := buildCmd(&args, out)
buildCmd()lookupTool()
buildCmd()
thriftgothriftthriftgoapache/thrift

thriftgo地址:https://github.com/cloudwego/thriftgo

protocprotobuf
cmd.Run()

小结

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

FlagSetflagflagFlagSetCmdthriftgoprotoccmd.Run()kitex_gen

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

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

编写kitexx框架

thriftgokitexxkitexxg参数thriftgogothriftgo
thriftgo-g参数thriftgo

编写IDL

go build -o ~/go/bin/kitexx$GOPATH/binecho.thriftthrift

测试kitexx功能

kitexx -g go
gen-gokitexx-g

总结

kitexkitexx微框架