Go 语言项目开发实战
孔令飞
腾讯云专家工程师,前 Red Hat、联想云工程师
41030 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 61 讲
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

23 | 应用构建实战:如何构建一个优秀的企业应用框架?

配置文件解析
命令行参数解析
命令行程序构建
选项模式
options.go
flag.go
config.go
cmd.go
app.go
启动函数
详细描述
命令行选项
二进制文件名
应用描述
服务启动
应用初始化
应用框架的构建
使用长选项
支持常见选项
清晰易读、扩展性强的应用框架
命令行选项和配置文件支持相互独立
没有帮助信息和使用信息
功能简单,扩展性差
封装成 Go 包
Viper 配置解析
集成 Pflag
Cobra 自带的能力
构建应用
目录下的文件
参数
使用 github.com/marmotedu/iam/pkg/app 包
启动流程
非 API 服务
API 服务
通过 Go 包供所有服务使用
用一种优雅的方式实现
找出相同的功能
功能升级的开发工作量大
理解成本高
重复造轮子
iam-apiserver 的命令行选项
优秀的包或工具
建议
三个坑
构建的应用程序特性
App 包设计和实现
创建应用实例
构建方式
应用的三大基本功能
解决方法
问题
课后练习
构建应用的注意事项
iam-apiserver 应用框架
构建应用的基础
构建优秀的企业应用框架
应用构建实战

该思维导图由 AI 生成,仅供参考

你好,我是孔令飞。今天我们来聊聊开发应用必须要做的那些事儿。
应用开发是软件开发工程师最核心的工作。在我这 7 年的 Go 开发生涯中,我构建了大大小小不下 50 个后端应用,深谙其中的痛点,比如:
重复造轮子。同样的功能却每次都要重新开发,浪费非常多的时间和精力不说,每次实现的代码质量更是参差不齐。
理解成本高。相同的功能,有 N 个服务对应着 N 种不同的实现方式,如果功能升级,或者有新成员加入,都可能得重新理解 N 次。
功能升级的开发工作量大。一个应用由 N 个服务组成,如果要升级其中的某个功能,你需要同时更新 N 个服务的代码。
想要解决上面这些问题,一个比较好的思路是:找出相同的功能,然后用一种优雅的方式去实现它,并通过 Go 包的形式,供所有的服务使用。
如果你也面临这些问题,并且正在寻找解决方法,那么你可以认真学习今天这一讲。我会带你找出服务的通用功能,并给出优雅的构建方式,帮助你一劳永逸地解决这些问题。在提高开发效率的同时,也能提高你的代码质量。
接下来,我们先来分析并找出 Go 服务通用的功能。

构建应用的基础:应用的三大基本功能

我们目前见到的 Go 后端服务,基本上可以分为 API 服务和非 API 服务两类。
API 服务:通过对外提供 HTTP/RPC 接口来完成指定的功能。比如订单服务,通过调用创建订单的 API 接口,来创建商品订单。
非 API 服务:通过监听、定时运行等方式,而不是通过 API 调用来完成某些任务。比如数据处理服务,定时从 Redis 中获取数据,处理后存入后端存储中。再比如消息处理服务,监听消息队列(如 NSQ/Kafka/RabbitMQ),收到消息后进行处理。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以Go语言为例,详细介绍了构建企业应用框架的关键步骤和技术要点。作者首先分析了应用的基础功能,包括命令行程序、命令行参数解析和配置文件解析。随后,通过具体的代码示例和详细解释,介绍了如何使用Cobra和Pflag构建应用框架,以及如何通过Viper实现命令行参数和配置文件的统一管理。文章还强调了分组和层级关系命名的技巧,以及配置项的校验和默认值设置的重要性。通过Cobra自带的能力,构建的应用框架具备了丰富的功能,如帮助信息、子命令、自动补全等。此外,通过Viper的灵活配置方式,使得应用的配置更加清晰和灵活。总结来说,本文为读者提供了构建优秀企业应用框架的实用指南,为Go开发者提供了宝贵的经验和技术参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言项目开发实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • ppd0705
    还没写过大应用,感觉这个框架有点复杂,慢慢品

    作者回复: 值得一品!

    2021-08-08
    2
    11
  • 二的根比方
    谢谢老师,有个问题是一般框架都遵循“依赖倒置”原则,请问go应用在构建时应该考虑那些点,谢谢

    作者回复: 这里其实就是要求,编程时,要面向接口编程,而非面向过程编程。

    2021-07-25
    2
    3
  • 雪枫
    照着项目抄都感觉有点费劲,所以要把这个项目吃透的话,大概需要多久的时间。

    作者回复: 不好说,分人,还分每天投入的时间

    2022-04-08
    2
  • lesserror
    孔老板,像Cobra、Viper、Pflag这三个包,是很多知名项目都使用的方案吗?

    作者回复: 对的,像kubernetes、istio、docker、etcd等都用的是这些。

    2021-10-16
    2
  • huntersudo
    老师好,最后一部分,第 4 步:配置文件解析,源码部分,得这样贴出来,才能和下文对的上 func addConfigFlag(basename string, fs *pflag.FlagSet) { fs.AddFlag(pflag.Lookup(configFlagName)) viper.AutomaticEnv() viper.SetEnvPrefix(strings.Replace(strings.ToUpper(basename), "-", "_", -1)) viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_")) cobra.OnInitialize(func() { if cfgFile != "" { viper.SetConfigFile(cfgFile) } else { viper.AddConfigPath(".") if names := strings.Split(basename, "-"); len(names) > 1 { viper.AddConfigPath(filepath.Join(homedir.HomeDir(), "."+names[0])) } viper.SetConfigName(basename) } if err := viper.ReadInConfig(); err != nil { _, _ = fmt.Fprintf(os.Stderr, "Error: failed to read configuration file(%s): %v\n", cfgFile, err) os.Exit(1) } }) }

    作者回复: 感谢反馈,我们适配下。

    2021-07-19
    2
  • 女干部
    像im这种即时通讯类的,是不是可以归类到消息处理服务中去

    作者回复: 还不能吧,我理解像cmq、kafka这类才是消息处理服务。 im更多指的直接面向用户的聊天工具。

    2021-07-19
    2
    2
  • 邵康
    想问一下,如何实现命令行补全功能?

    作者回复: cobra自带的。iamctl completion bash 会输出bash的自动补全脚本

    2022-06-10归属地:广东
    1
  • 多选参数
    像 kubernete 这样的是不是也是采用类似的应用构建方法?

    作者回复: 一样的构建方法

    2021-12-29
    1
  • Fan
    50 个后端应用都有啥类型的呀?分享下可好?

    作者回复: 太多了,比较大的比如云函数、容器服务、初始化系统、网关、微服务等等

    2021-08-12
    1
  • helloworld
    “例如:配置 HTTPS 的绑定端口,可以通过 --secure.bind-port 配置,也可以通过配置文件配置(命令行参数优先于配置文件): secure: bind-address: 0.0.0.0”,文中这块前后没呼应上.

    作者回复: 感谢反馈,我们更新下哈

    2021-07-21
    1
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部