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

4 篇文章 0 订阅

前言

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

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

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

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

源码分析

分析main.go的main()函数

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

以插件模式运行

image-20220526144428523

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

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

以kitex模式运行

image-20220526150849105

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

image-20220526155539546

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

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

carbon (1)

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

image-20220526172249512

分析buildCmd()函数

image-20220527160800831

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

image-20220527165720125

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

image-20220527180839087

再来看buildCmd()函数:

carbon

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

image-20220527184426370

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

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

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

image-20220527184045191

小结

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

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

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

image-20220527190303831

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

编写kitexx框架

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

image-20220527193708804

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

image-20220527194453689

编写IDL

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

image-20220527194002662

测试kitexx功能

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

image-20220527194716462

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

image-20220527194804150

总结

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

\

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这篇文章中,我们将对 NJ4X 的 TypeScript 版本进行初步分析。首先,我们需要知道 NJ4X 是什么。NJ4X 是一个 MetaTrader 4(MT4)的 Java 接口,它允许使用 Java 或 C# 编写的策略与 MT4 进行通信。NJ4X-ts 是 NJ4X 的 TypeScript 版本,它允许使用 TypeScript 编写的策略与 MT4 进行通信。 在 NJ4X-ts 中,有一个核心类 NJ4XClient,它实现了与 MT4 服务器进行通信的功能。NJ4XClient 类中有一个属性 socket,它是一个 WebSocket 对象,用于与 MT4 服务器进行通信。NJ4XClient 类中也有一些方法,用于发送命令并处理服务器的响应。这些方法包括: - sendCommand(command: string): Promise<any>:发送命令并返回一个 Promise 对象,该对象会在接收到服务器响应后被解析。 - sendCommandWithTimeout(command: string, timeout: number): Promise<any>:与 sendCommand 方法类似,但它还接受一个超时时间参数,如果在超时时间内未收到服务器响应,则 Promise 对象会被拒绝。 - readResponse(): Promise<any>:读取服务器响应并返回一个 Promise 对象,该对象会在响应被解析后被解析。 在 NJ4X-ts 中,还有一些辅助类和函数,用于解析服务器响应和生成命令。这些类和函数包括: - NJ4XResponse:表示从服务器接收到的响应,它包含响应的状态码、错误信息和数据。 - NJ4XCommand:表示要发送到服务器的命令,它包含命令字符串和一个可选的参数对象。 - parseResponse(response: string): NJ4XResponse:将服务器响应字符串解析为 NJ4XResponse 对象。 - buildCommandString(command: string, params?: object): string:将命令字符串和参数对象转换为命令字符串。 这些类和函数的实现可以在 NJ4X-ts 的源代码中找到。 在下一篇文章中,我们将继续分析 NJ4X-ts 的源代码,了解更多关于 NJ4X-ts 的实现细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值