前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kitex源码阅读——脚手架代码是如何通过命令行生成的(二)

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

作者头像
白泽z
发布于 2022-08-18 06:26:40
发布于 2022-08-18 06:26:40
1K0
举报
文章被收录于专栏:Go与云原生开发Go与云原生开发

前言

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函数分为两个部分,下面分析。

以插件模式运行

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

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

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

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

  • 这里着重分析一下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地址:https://github.com/cloudwego/thriftgo

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微框架,通过实践印证了我们对源码的理解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员白泽 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kitex源码阅读——脚手架代码是如何通过命令行生成的(一)
Kitex文档:https://www.cloudwego.io/zh/docs/kitex/getting-started/
白泽z
2022/08/18
7830
Kitex源码阅读——脚手架代码是如何通过命令行生成的(一)
一分钟使用高性能框架 Hertz
Hertz[həːts] 是字节 CloudWeGo 团队一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。
程序猿Damon
2023/09/04
1.2K0
一分钟使用高性能框架 Hertz
入门 KiteX 基础篇
KiteX 是 bytedance 开源的高性能 RPC 框架,实现了高吞吐、高负载、高性能等居多特性,具体请看 KiteX 的实践,文章介绍多传输协议、消息协议时,说到 KiteX 支持的协议类型:Thrift、Protobuf 等,今天我们主要来实践如何利用 KiteX 基于对应的 IDL 生成对应协议的代码。
程序猿Damon
2022/12/05
3.8K0
入门 KiteX 基础篇
为什么大厂都要开发自己的脚手架?
每个初入大厂的前端同学,在真正投入开发之前的第一件事可能就是熟悉公司的脚手架,从那一刻起,你就抛弃了熟悉的cra、vue-cli、vite等,成为了合格的大厂人(误)
winty
2024/04/18
5590
为什么大厂都要开发自己的脚手架?
深入浅出RPC框架|青训营笔记
课程视频:https://live.juejin.cn/4354/yc_RPC-framework
白泽z
2022/08/18
4880
深入浅出RPC框架|青训营笔记
从源码的角度看Go语言flag库如何解析命令行参数!
我上周五喝酒喝到晚上3点多,确实有点罩不住啊,整个周末都在休息和睡觉,文章鸽了几天,想不到就有两个人跑了。
机智的程序员小熊
2021/08/12
8280
Go 命令行解析 flag 包之通过子命令实现看 go 命令源码
正式介绍子命令的实现之前,先了解下 flag 包中的一个类型,FlagSet,它表示了一个命令。
波罗学
2019/12/02
1.2K0
Kitex 支持 Dubbo 协议:助力多语言云原生生态融合
Kitex 是字节跳动基础架构服务框架团队推出的 Go 微服务 RPC 框架,支持 Thrift、Kitex Protobuf、gRPC 等消息协议,具有高性能、强可扩展的特点。于 2021 年 9 月正式开源后,已在多家外部企业成功落地,为他们带来了真实的成本、性能和稳定性收益。
深度学习与Python
2024/02/29
2520
Kitex 支持 Dubbo 协议:助力多语言云原生生态融合
【字节跳动】第十三讲 深入浅出RPC框架| 青训营笔记
江学武:目前就职于字节跳动基础架构服务框架团队,参与Kitex和ByteMesh的研发工作。
了凡银河系
2022/08/22
9380
【字节跳动】第十三讲 深入浅出RPC框架| 青训营笔记
Rust 赋能前端-开发一款属于你的前端脚手架
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder。
前端柒八九
2024/01/11
7070
Rust 赋能前端-开发一款属于你的前端脚手架
golang-flag - 命令行参数解析
在写命令行程序(工具、server)时,对命令参数进行解析是常见的需求。各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。如果命令行参数纯粹自己写代码解析,对于比较复杂的,还是挺费劲的。在 go 标准库中提供了一个包:flag,方便进行命令行解析。
landv
2019/07/03
7650
thrift:swift 命令行生成 IDL文件及Client java代码过程
本文介绍了从入门到精通的Java学习路线,包括基础知识、框架、实战项目等方面的内容。
10km
2018/01/03
2.7K0
从零撸一个CLI命令行脚手架工具
我想大部分同学肯定都是这样回答的:现在社区都有开箱即用的脚手架,像vue-cli、create-react-app这种,我们直接用脚手架来创建项目就可以了啊。
前端森林
2021/02/03
1.1K0
从零撸一个CLI命令行脚手架工具
(满满干货)从零实现命令行脚手架工具——自动初始化项目工程以及发布到NPM
这篇文章将带你从零实现一款命令行脚手架工具用于初始化项目以及如何发布到NPM。首先,我们所熟知的VueCLI就是采用命令行工具快速生成项目工程目录的,这样,我们每次开发项目前只需要在命令行中输入命令,然后就可以快速生成项目工程,非常方便。那么,这么方便的命令行工具是怎么实现的呢?下面我们就开始进入实战环节。
Vam的金豆之路
2021/12/01
6250
《前端那些事》从0到1开发简单脚手架
上一篇树酱讲《前端工程化那些事》,聊到脚手架,不过时间比较仓促,导致内容较少,而在我实践开发中,随着新项目愈来愈多,脚手架工具就起到提高效能的作用,借此机会跟小伙伴们分享下我是如何从0到1开发一个简单脚手架
树酱
2020/07/03
1.6K0
《前端那些事》从0到1开发简单脚手架
Go之现代命令行框架Cobra
老实说,今天是我第一次见到现代命令行框架这个名词,在此之前,我并不知道这个东西的作用是什么。下面一起来了解一下这个东西。
f1sh
2024/07/27
2930
前端开发3年了,竟然不知道什么是 Vue 脚手架?(上)
CLI -- Command-Line Interface 命令行界面,俗称脚手架。
呆呆
2021/12/01
7390
Week2-脚手架架构设计和框架搭建
和自动化构建工具(jenkins、travia)区别:自动化构建工具在服务端执行,无法覆盖本地操作且定制自动化的构建工具需要用到Java等后端语言,对前端不友好。
六个周
2022/10/28
1.3K0
Week2-脚手架架构设计和框架搭建
如何开发一个极简的前端脚手架
功能上,要满足登录,权限管理,菜单配置,用户管理,字典管理,角色管理等后台管理系统的常规功能,
虎妞先生
2023/10/16
4040
如何开发一个极简的前端脚手架
【架构师(第二篇)】脚手架架构设计和框架搭建
问题:jenkins,travis 等自动化构建工具已经很成熟了,为什么还要自研脚手架?
一尾流莺
2022/12/10
1.5K0
【架构师(第二篇)】脚手架架构设计和框架搭建
推荐阅读
相关推荐
Kitex源码阅读——脚手架代码是如何通过命令行生成的(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档