23 | 应用构建实战:如何构建一个优秀的企业应用框架?
孔令飞
该思维导图由 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
《Go 语言项目开发实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(20)
- 最新
- 精选
- ppd0705还没写过大应用,感觉这个框架有点复杂,慢慢品
作者回复: 值得一品!
2021-08-08211 - 二的根比方谢谢老师,有个问题是一般框架都遵循“依赖倒置”原则,请问go应用在构建时应该考虑那些点,谢谢
作者回复: 这里其实就是要求,编程时,要面向接口编程,而非面向过程编程。
2021-07-2523 - 雪枫照着项目抄都感觉有点费劲,所以要把这个项目吃透的话,大概需要多久的时间。
作者回复: 不好说,分人,还分每天投入的时间
2022-04-082 - lesserror孔老板,像Cobra、Viper、Pflag这三个包,是很多知名项目都使用的方案吗?
作者回复: 对的,像kubernetes、istio、docker、etcd等都用的是这些。
2021-10-162 - 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-192 - 女干部像im这种即时通讯类的,是不是可以归类到消息处理服务中去
作者回复: 还不能吧,我理解像cmq、kafka这类才是消息处理服务。 im更多指的直接面向用户的聊天工具。
2021-07-1922 - 邵康想问一下,如何实现命令行补全功能?
作者回复: cobra自带的。iamctl completion bash 会输出bash的自动补全脚本
2022-06-10归属地:广东1 - 多选参数像 kubernete 这样的是不是也是采用类似的应用构建方法?
作者回复: 一样的构建方法
2021-12-291 - Fan50 个后端应用都有啥类型的呀?分享下可好?
作者回复: 太多了,比较大的比如云函数、容器服务、初始化系统、网关、微服务等等
2021-08-121 - helloworld“例如:配置 HTTPS 的绑定端口,可以通过 --secure.bind-port 配置,也可以通过配置文件配置(命令行参数优先于配置文件): secure: bind-address: 0.0.0.0”,文中这块前后没呼应上.
作者回复: 感谢反馈,我们更新下哈
2021-07-211
收起评论