大家好,我是无闻,咱们又见面了。很多人会通过我的 GitHub 用户名 @unknwon 了解到我。作为一个 Go 语言爱好者和开源作者,我在 GitHub 上发布了许多 Go 语言相关的开源项目,其中不乏与 Web 开发相关的,包括 Macaron Web 框架和 Gogs 项目。在 2013 年,我通过 GitHub 发布了一套使用 Go 语言进行 Web 开发的视频教程《Go Web 基础》,许多同学在学习完成之后觉得不够过瘾,认为只是学到了某一个 Web 框架的具体用法,而不是真正地从 Go 语言的角度去学习开发一套 Web 应用组件。出于这个原因,我觉得非常有必要通过另一套课程来详解如何在 Go 语言中从零构建一套属于自己的 Web 应用开发体系。
Go 语言具有天然高并发、易于部署和低内存占用的特性,因此越来越多的开发者选择使用 Go 语言作为 Web 应用和后台服务的首选语言,常见的有网站开发、API 服务、网关服务和代理服务等等。最近几年,基于 Go 语言的 Web 框架也如雨后春笋般地争相推出,包括 Revel、Martini、Gin、Echo 和 Beego 等等。然而,许多同学都仅仅停留在知道如何使用一个具体框架的层面上,而不甚理解每个框架底层的核心理念和通用技术。这不仅会导致开发能力受限于某个具体的框架,也会因为对底层逻辑的不了解而在开发调试过程中产生不必要的误解,无端消耗了宝贵的开发资源。
大多数情况下,有经验的开发者可以通过阅读开源框架的源代码来理解它们的底层逻辑和技术,但经验尚浅的同学就只能通过有限的使用文档来了解框架的具体用法,但对其底层的实现却一问三不知。这门课程的目的就是为了解决众多同学们求不到甚解的不利处境,争取让每一位同学都有所收获,成为更好的自己。
学习本课程需要具备基础的 Go 语言知识,如果是刚开始学习 Go 语言的同学,建议先通过其它渠道完成基本语法和编写简单程序的学习。
本课程分为六大部分,涵盖了从基础开发到组件开发,再从应用开发到应用的部署与维护,完成从开发到部署的一套流程讲解。
这部分内容将会从 Go 语言的标准库入手,讲解 Go 语言标准库对 Web 开发的相关支持,并学习它们的基本用法。包括在 Go 语言中运行 HTTP 服务器的多种方法、标准库模板系统、表单的提交与处理、文件的上传与处理、Cookie 的读取与写入等等。此外,还有 HTTP 相关的认证与测试,包括了 HTTP 基本认证(HTTP Basic Authentication)、HTTP 摘要认证(HTTP Digest Authentication)以及如何在 Go 语言中实现 HTTP 的单元测试。
这部分内容将会基于 Go 语言标准库带领同学们从零开发属于自己的 Web 应用基础组件,包含了数据绑定与验证、模板渲染与缓存、会话管理(内存形式和文件形式等)、缓存管理(内存形式和文件形式等)、如何防止跨站请求伪造和重放攻击、基本安全防护(XSS和密码哈希等)等等。最后,通过实现一个自定义路由栈来将各个组件更加融洽地结合在一起。
这部分内容涉及相对而言更加高级的组件开发,包括实现验证码校验、建立反向代理服务、连接 SQL 和 NoSQL 数据库,以及如何拥有一个属于自己的二步验证功能。由于功能涉及面广,大多数功能需要使用第三方作者开发的开源类库辅助我们开发,因为有效地将较为底层的第三方组件集成到自身应用也是开发过程中非常重要的一环,毕竟脱离了 Web 的范畴后,每一项底层技术都可以作为一门单独的课程进行讲解学习。
这部分内容专注于和主流技术方案的集成,因而将会涉及到使用更多的第三方组件,包括如何使用 Go 语言进行 RPC 通信、gRPC 通信和 WebSocket 通信,以及如何通过 OAuth2 标准使用第三方网站的授权进行身份验证操作等等。每一项技术都会通过一个具体的小程序来进行展示,保证同学们不会只拥有理论知识却不知道如何下手。
这部分内容会从实战入手,通过开发一个短网址应用涵盖 Go 语言 Web 开发的方方面面,将之前所学的所有组件和知识融合在一起,完成一次大合唱。首先,会实现最基本的 Web 界面,让用户能够通过浏览器访问我们的应用,并基于内存生成和转化对应的短链接。接着,为我们的应用添加 REST API 接口,让同学们对使用 Go 语言开发 API 服务也有一定的实践。然后,我们会通过与 PostgreSQL 对接,实现数据的持久化,带领同学们学习 Go 语言对数据库的相关操作。最后,利用 Redis 和相关组件实现热点数据的缓存,加速我们的应用。
这部分内容是基于在应用开发完成之后我们所需要做的事情,包括使用 Travis CI 和 Drone CI 进行持续集成(Continuous Integration)、通过二进制和 Docker 对应用进行部署,以及如何使用 Kubernetes 进行服务的管理与维护。Docker 和 Kubernetes 分别作为容器化(Containerization)和容器编排(Container Orchestration)方案的事实标准,学习如何使用它们无论是对于自我提升还是成为一个 DevOps 都具有非凡的意义和价值。
这部分内容是基于应用分发之后,我们通过其它手段对我们的服务进行监控及报警,包括使用当下非常流行的 Prometheus 和 Grafana 的组合。
正所谓换汤不换药、万变不离其宗,每个 Web 框架之间的逻辑并不是相互独立的,不同的只是上层的封装和接口的设计理念。只有理解其中的道理,才能做到举一反三和融会贯通。要知道,地基的坚实程度,决定了摩天大楼的高度。
最后,希望同学们通过学习该套课程来帮助深化理解开发一款 Web 框架所需要具备的核心组件以及相关概念,从而做到知其然知其所以然,实现以理解为驱动的学习。