You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
9.4 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 开篇词 | 从 0 开始搭建一个企业级 Go 应用
你好,我是孔令飞,很高兴能在这里和你聊聊如何用 Go 构建企业级应用。
在过去的 5 年里,我一直在腾讯使用 Go 做大型企业级项目。比如说,腾讯云云函数 SCF、腾讯游戏容器平台 TenC、腾讯游戏微服务中台等。目前我在腾讯云负责容器服务 TKE 的相关研发工作,专注于云原生混合云领域的基础架构开发。
## “云”是大势所趋而Go是云时代的语言
最近几年,我发现腾讯很多团队的开发语言都在转 Go。其实不光腾讯像阿里、华为和百度这类国内一线大厂也都在积极转 Go。甚至不少团队所有项目都是用 Go 构建的。伴随而来的就是各个公司对Go研发工程师的需求越来越旺盛。那么 Go 为什么会变得这么火热呢?我认为,原因主要有两个方面。
一方面Go 是一门非常优秀的语言,它具有很多核心优势,例如:语言简单、语言层面支持并发编程、跨平台编译和自带垃圾回收机制等,这些优势是这些团队选择 Go 最根本的原因。
另一方面,也因为 Go 是云时代的语言。为什么这么说呢?下面,我来详细说说。
随着云计算平台的逐渐成熟,应用上云已经成为一个不可逆转的趋势了,很多公司都选择将基础架构/业务架构云化,例如阿里、腾讯都在将公司内部业务全面云化。可以说,全面云化已经是公司层面的核心 KPI了我们甚至可以理解为以后所有的技术都会围绕着云来构建。
**而云目前是朝着云原生架构的方向演进的,云原生架构中具有统治力(影响力)的项目绝大部分又是用 Go 构建的。**我们从下面这张云原生技术栈语言组成图中可以看到,有 63% 的具有统治力的云原生项目都是用 Go 来构建的。
![](https://static001.geekbang.org/resource/image/c6/51/c608623543c26b8f088bea958856f551.png "云原生技术栈")
> 完整的云原生技术栈可参考[云原生技术图谱](https://landscape.cncf.io/images/landscape.png)
因此,想要把基础架构/业务架构云化,离不开对这些云原生开源项目的学习、改造。而一个团队为了节省成本,技术栈最好统一。既然我们一定要会 Go而且 Go 这么优秀,那最好的方式就是将整个团队的语言技术栈 all in Go这也是 Go 为什么重要的另一个原因了。
那么,我们用 Go 做什么呢,当然是项目开发。但很多开发者在用 Go 进行项目开发时会面临一系列问题。
## 学习 Go 项目开发面临哪些问题?
我带过不少刚接触 Go 语言的开发者,他们为了学习 Go 项目开发,会上网搜很多 Go 相关的技术文章,也确实花了很多时间去学习。但是,当我做 Code Review 时,发现他们开发的代码仍然存在很多问题。
比如说,有个开发者写的代码依赖数据库连接,没法写单元测试。细问之后,我发现他参考的文章没有将数据库层跟业务层通过接口解耦。
再比如说,还有一些开发者开发的项目很难维护,项目中出现了大量的 common、util、const 这类 Go 包。只看包名,我完全不知道包所实现的功能,问了之后才发现他是参考了一个带有 dao、model、controller、service 目录的、不符合 Go 设计哲学的项目。
而这些问题其实只是冰山一角,总的来说,我们在学习 Go 项目开发时会面临以下4大类问题。
1. **知识盲区**Go 项目开发会涉及很多知识点,但自己对这些知识点却一无所知。想要学习,却发现网上很多文章结构混乱、讲解不透彻。想要搜索一遍优秀的文章,又要花费很多时间,劳神劳力。
2. **学不到最佳实践,能力提升有限**:网上有很多文章会介绍 Go 项目的构建方法,但很多都不是最佳实践,学完之后不能在能力和认知上带来最佳提升,还要自己花时间整理学习,事倍功半。
3. **不知道如何完整地开发一个 Go 项目**:学了很多 Go 开发相关的知识点、构建方法,但都不体系、不全面、不深入。学完之后,自己并不能把它们有机结合成一个 Go 项目研发体系,真正开发的时候还是一团乱,效率也很低。
4. **缺乏一线项目练手,很难检验学习效果**:为了避免闭门造车,我们肯定想学习一线大厂的大型项目构建和研发经验,来检验自己的学习成果,但自己平时又很难接触到,没有这样的学习途径。
为了解决这些问题我设计了《Go 语言项目开发实战》这个专栏希望帮助你成为一名优秀的Go开发者在职场中建立自己的核心竞争力。
## 这个专栏是如何设计的?
《Go 语言项目开发实战》这个专栏又是如何解决上述问题的呢?在这个专栏里,我会围绕一个可部署、可运行的企业应用源码,为你详细讲解实际开发流程中会涉及的技能点,让你彻底学会如何构建企业级 Go 应用,并解决 Go 项目开发所面临的各类问题。
一方面,你能够从比较高的视野俯瞰整个 Go 企业应用开发流程,不仅知道一个优秀的企业应用涉及的技能点和开发工作,还能知道如何高效地完成每个阶段的开发工作。另一方面,你能够深入到每个技能点,掌握它们的具体构建方法、业界的最佳实践和一线开发经验。
最后我还想强调一点,除了以上内容,专栏最终还会交付给你一套优秀、可运行的企业应用代码。这套代码能够满足绝大部分的企业应用开发场景,你可以基于它做二次开发,快速构建起你的企业应用。
说了这么多我们到底能学到哪些技能点呢我按照开发顺序把它们总结在下面这张图中图中包含了Go项目开发中大部分技能点。
![](https://static001.geekbang.org/resource/image/c4/8c/c4a4bdfc103f193d292b54e44510f28c.jpg)
除此之外,**专栏中的每个技能点我都会尽可能朝着“最佳实践”的方向去设计**。例如,我使用的 Go 包都是业界采纳度最高的包,而且设计时,我也会尽可能遵循 Go 设计模式、Go 开发规范、Go 最佳实践、go clean architecture 等。同时,我也会尽量把我自己**做一线Go项目研发的经验融合到讲解的过程中**,给你最靠谱的建议,这些经验和建议可以让你在构建应用的过程中,少走很多弯路。
为了让你更好地学习这门课程我把整个专栏划分为了6个模块。其中第1个模块是实战环境准备第2到第6个模块我会带着你按照研发的流程来实际构建一个应用。
**实战准备**我会先手把手带你准备一个实验环境再带你部署我们的实战项目。加深你对实战项目的理解的同时给你讲解一些部署的技能点包括如何准备开发环境、制作CA证书安装和配置用到的数据库、应用以及Shell脚本编写技巧等。
**实战第 1 站:规范设计**我会详细介绍开发中常见的10大规范例如目录规范、日志规范、错误码规范、Commit规范等。通过本模块你能够学会如何设计常见的规范为高效开发一个高质量、易阅读、易维护的 Go 应用打好基础。
**实战第 2 站:基础功能设计或开发**我会教你设计或开发一些Go应用开发中的基础功能这些功能会影响整个应用的构建方式例如日志包、错误包、错误码等。
**实战第 3 站:服务开发**我会带你一起解析一个企业级的Go项目代码让你学会如何开发Go应用。在解析的过程中我也会详细讲解Go开发阶段的各个技能点例如怎么设计和开发API服务、Go SDK、客户端工具等。
**实战第 4 站:服务测试**:我会围绕实战项目来讲解进行单元测试、功能测试、性能分析和性能调优的方法,最终让你交付一个性能和稳定性都经过充分测试的、生产级可用的服务。
**实战第 5 站:服务部署**:本模块通过实战项目的部署,来告诉你如何部署一个高可用、安全、具备容灾能力,又可以轻松水平扩展的企业应用。这里,我会重点介绍 2 种部署方式:传统部署方式和容器化部署方式,每种方式在部署方法、复杂度和能力上都有所不同。
最后,关于怎么学习这个专栏,我还想给你一些建议。
第一我建议你先学习这个专栏的图文内容再详细去读源码。学习过程中如果产生一些想法可以通过修改代码并查看运行结果的方式来加以验证。这个专栏的代码我都放在GitHub上你可以点击[这个链接](https://github.com/marmotedu/iam)查看。
第二,在专栏中,我不会详细去介绍每行代码,只会挑选一些核心代码来讲。一些没有讲到的地方,如果有疑问,你一定要在评论区留言,因为这个专栏我就是要带你攻克开发过程中的所有难题,千万不要让小问题积攒成大难题,那真的得不偿失。我可以承诺的是,留言回复可能会迟到,但绝不会缺席。
好啦从现在开始让我们一起开启这场充满挑战的Go项目实战旅途为真正开发出一个优秀的企业级Go应用成为一个Go资深开发者一起努力吧