09|即学即练:构建一个Web服务就是这么简单
该思维导图由 AI 生成,仅供参考
预热:最简单的 HTTP 服务
- 深入了解
- 翻译
- 解释
- 总结
本文以Go语言为例,通过简单的HTTP服务项目和图书管理API服务项目,向读者展示了如何使用Go语言轻松构建Web服务。文章首先介绍了如何创建一个最简单的HTTP服务,通过Go标准库的net/http包实现了一个简单的服务,展示了服务端处理客户端请求的过程。接着,文章详细介绍了图书管理API服务的业务逻辑,并给出了项目的结构布局和最终实现的源码文件分布情况。通过这些实例,读者可以初步了解Go语言构建Web服务的简单性和实用性。文章内容通俗易懂,适合初学者快速了解Go语言构建Web服务的基本原理和实践方法。文章还介绍了图书数据存储模块的实现和HTTP服务模块的优雅退出实现,展示了Go语言中模块化和接口设计的特点。整体而言,本文为读者提供了一个清晰的示例,帮助他们快速了解Go语言构建Web服务的基本流程和关键技术点。文章内容涵盖了HTTP服务模块的创建、处理函数的实现、middleware的使用以及程序的编译、运行与验证,为读者提供了全面的学习指导。
《Tony Bai · Go 语言第一课》,新⼈⾸单¥59
全部留言(87)
- 最新
- 精选
- 扣剑书生store.go提供了 图书 和 接口的模板 factory 用于生产 接口实例 memstore.go 用于具体实现一个接口实例,实现其方法,并把样例发送到工厂 server.go 用于把路由和接口的方法对接起来
作者回复: 👍
2021-11-30224 - 尧九之阳Go现在有流行的web服务器框架么?
作者回复: go最初有很多web框架,经过多年演进,目前gin这个web框架似乎成为了go社区的首选。
2021-11-10211 - 布凡终于实验成功: 以下几个点需注意: 1、项目应放到 gopath货goroot相关的目录下,否则本地包的引用会报错,报错信息如下:"could not import errors (cannot find package "errors" in any of c:\go\src\errors (from $GOROOT)...)" 2、如果是复制的代码应该注意文件格式,可能报错"package main: read unexpected NUL in input"
作者回复: 项目都是在mac/linux上做的。但理论上windows可以直接使用。你提到的项目放在gopath或goroot下是不必要的。支持go module模式后,如果启用了go module构建模式,放在哪个目录下都是可以的。 另外项目代码放在了github上,在文章末尾有链接。可直接clone后使用。
2021-11-0448 - 猫饼我果然还是太菜了 我开始看不懂了
作者回复: 先“照猫画虎”吧。一旦涉及此类实战小项目,必然会有没有系统学习的内容。后面学习新语法时,可以回过头来复习。
2021-11-0228 - 顷老师的这个示例,麻雀虽小,五脏俱全。不过main.go里有一点疑问:http.Server.Shutdown(ctx)被调用后,http.Server.ListenAndServe()方法马上会返回error吧,按照实例代码里的写法,接收到中断信号后,马上调用Shutdown方法,此时errChan会返回ErrServerClosed,select逻辑走完,main方法就退出了,而go的http包里示意了我们需要确保shutdown调用后,整个代码不能马上退出,请老师解惑。。
作者回复: 好问题! 首先errChan并不是等shutdown之后 listenAndServe报错的。而是等运行国产中,listenandserve一旦报错,程序可以退出。 接下来,我们再说说优雅退出。按照你的描述,我翻了一下net.http的文档: “Shutdown gracefully shuts down the server without interrupting any active connections. Shutdown works by first closing all open listeners, then closing all idle connections, and then waiting indefinitely for connections to return to idle and then shut down. If the provided context expires before the shutdown is complete, Shutdown returns the context's error, otherwise it returns any error returned from closing the Server's underlying Listener(s).” 我的理解是调用Shutdown后,ListenAndServe()方法的确会马上返回,不过这个无所谓了,listenandserver只是将listen端口关闭,不接受新连接了。 真正等待存量连接处理完毕的是shutdown方法,shutdown方法调用后,不是马上退出的哦。shutdown方法有一个ctx,专栏中传入了一个timeout ctx,时间为1s。即等待1s。关键就在这里。在生产环境,我们可能不能无限期等待程序退出,我们会设置一个timeout。如果shutdown在1s内完成等待,成功退出,这是最理想的。如果shutdown没有在1s内完成等待,即存量连接还没有处理完,那么按照我们的约定,我们也不能再等了。 当然这里只是demo,使用的timeout=1s。在生产中,你可以根据业务的类型以及经验值来等待。甚至可以进行无限等待,这完全取决于你的系统。
2022-02-2127 - lesserror感谢 Tony Bai 老师这样由浅入深,并且尽可能贴近实战的讲解。 有以下困惑,麻烦解忧。 1. 对于一个module中,相同的包名,go内部是根据文件位置的不同,加以区分的吧? 例如:bookstore/store 和 bookstore/internal/store 这两个 package 同名,但是文件的路径不同,所以并不会有什么问题。如果在同一个package中,导入另一个同名的package,最佳实践是取个别名,我的理解没错吧? 2. 另外在 memstore.go 中的 包导入语句中: factory "bookstore/store/factory",这个 默认使用的是factory名字,不需要再另起名字为factory吧? 3. 这门课中的知识和你在另外的一个平台的《改善Go语言编程质量的50个有效实践》的内容重合度大吗? 精力有限,如果重合度大,就专心看这个就好了。 4. 这门课会讲讲Go写RPC服务方面的知识吗? 这个在生产中挺常用的。
作者回复: 问题1. 你的理解没有错。 问题2. 可以不用另起,记得好像有些工具在格式化时会自动填上。 3. 定位不同,这个是入门专栏。那个进阶专栏。有很小部分有相似的地方,但讲解方式都做了调整和优化。建议学完这个专栏后,再去看看那个专栏。 4. rpc封装的很深,如果仅是使用的话,没啥东西。这个专栏更多聚焦于go语法以及尽量使用标准库的东西做一些实用程序和项目。
2021-11-0255 - includestdio.h作为基本0基础学go,这一节完全没看懂-,- 把后面的基础篇看完回来再试试吧
作者回复: 这一讲开头我就说了:“在这个小项目里,我希望你不要困在各种语法里,而是先跟着我““照猫画虎”地写一遍、跑一次,感受 Go 项目的结构,体会 Go 语言的魅力。” 😁 不用担心,往后学一学之后再来复习。
2022-03-2824 - 小明能在gitee 上也放一份吗?github现在已经没那么友好了
作者回复: good idea。已创建https://gitee.com/bigwhite/publication/tree/master/column/timegeek/go-first-course 供下载。
2022-03-2034 - 左耳朵东server/server.go 文件中 select 那里,第二个 case 的意思是定时 1 秒后就会触发,从而执行后面的 return,为什么服务没有终止一直在运行呢?麻烦老师解答一下
作者回复: 你说的是func (bs *BookStoreServer) ListenAndServe这个方法吧?这个函数等待1s后返回啊。但它启动的子goroutine依旧在运行的。子goroutine中bs.srv.ListenAndServe一直在工作,并提供服务。
2021-12-0334 - snow我看这里使用了mux包,我只用过gin包,请问这两个老师更喜欢哪个?以及这里选择mux的原因。
作者回复: 原则就是如果标准库中的mux可以满足,尽量不引用第三方包。如果标准库无法满足,尽量引用规模较小的包。gin是更大的web框架。除了mux,还有很多其他功能。如果不是项目必需,使用更“专一”的包可能更好。
2021-11-054