1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-29 16:22:21 +00:00

Merge pull request #277 from lewgun/patch-17

golang -> go & other fix typo
This commit is contained in:
chai2010 2018-08-09 18:10:22 +08:00 committed by GitHub
commit eb2339a345
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,6 +1,6 @@
# 5.1 web 开发简介 # 5.1 web 开发简介
由于 golang 的 `net/http` 提供了基础的路由函数组合,并且也提供了丰富的功能函数。所以在 golang 社区里有一种观点认为用 golang 写 api 不需要框架。其看法也存在一定的道理,如果你的项目路由在个位数,URI 固定且不通过 URI 来传递参数,那么使用官方库也就足够。但在复杂场景下,官方的 http 库还是有些力不从心。例如下面这样的路由: 因为Go的 `net/http`包提供了基础的路由函数组合与丰富的功能函数。所以在社区里流行一种用Go编写api不需要框架的观点;在我们看来,如果你的项目的路由在个位数、URI 固定且不通过 URI 来传递参数,那么确实使用官方库也就足够。但在复杂场景下,官方的 http 库还是有些力有不逮。例如下面这样的路由:
``` ```
GET /card/:id GET /card/:id
@ -13,14 +13,14 @@ GET /card/:id/relations
可见是否该用框架还是要具体问题具体分析的。 可见是否该用框架还是要具体问题具体分析的。
golang 的 web 框架大致可以分为这么两类: Go的Web框架大致可以分为这么两类:
1. router 框架 1. Router框架
2. mvc 类框架 2. MVC类框架
使用哪种框架上,大多数情况下都是看个人的喜好和公司技术人员的背景。例如公司有很多技术人员是 php 出身,那么他们一定会非常喜欢像 beego 这样的框架,但如果公司有很多 C 程序员,那么他们的想法可能是越简单越好。比如很多大厂的 C 程序员可能甚至都会去用 C 去写很小的 CGI 程序,可能本身并没有什么意愿去学习你的 MVC 或者更复杂的 web 框架,他们需要的只是一个非常简单的路由(甚至连路由都不需要,只需要一个基础的 http 协议处理库来帮他省掉没什么意思的体力劳动)。 框架的选择上大多数情况下都是依照个人的喜好和公司的技术栈。例如公司有很多技术人员是PHP出身那么他们一定会非常喜欢像beego 这样的框架,但如果公司有很多 C 程序员,那么他们的想法可能是越简单越好。比如很多大厂的 C 程序员甚至可能都会去用 C 去写很小的 CGI 程序,他们可能本身并没有什么意愿去学习MVC或者更复杂的 web 框架,他们需要的只是一个非常简单的路由(甚至连路由都不需要,只需要一个基础的HTTP协议处理库来帮他省掉没什么意思的体力劳动)。
golang 的 net/http 库提供的就是这样基础的功能,写一个 http echo server 只需要三十秒 Go的 net/http 包提供的就是这样的基础功能,写一个 http echo server 只需要30s
```go ```go
//brief_intro/echo.go //brief_intro/echo.go
@ -50,7 +50,7 @@ func main() {
``` ```
如果你 30 秒没有完成这个程序,检查一下自己的打字速度是不是慢了。 开个玩笑。这个例子是为了说明如果你想写一个 http 协议的小程序有多么简单。如果你面临的情况比较复杂,例如几十个接口的企业级应用,直接用 net/http 库就显得不太合适了。 如果你过了30s还没有完成这个程序请检查一下你自己的打字速度是不是慢了(开个玩笑 :D)。这个例子是为了说明在Go中写一个HTTP协议的小程序有多么简单。如果你面临的情况比较复杂,例如几十个接口的企业级应用,直接用 net/http 库就显得不太合适了。
我们来看看开源社区中一个 kafka 监控项目中的做法: 我们来看看开源社区中一个 kafka 监控项目中的做法:
@ -146,11 +146,11 @@ func handleKafka(app *ApplicationContext, w http.ResponseWriter, r *http.Request
} }
``` ```
因为默认的 http 库中的 mux 不支持带参数的路由,Burrow 这个项目使用了非常蹩脚的字符串 Split 和乱七八糟的 switch case 来达到自己的目的,但实际上却让本来应该很集中的路由管理逻辑变得复杂,散落在系统的各处,难以维护和管理。如果读者细心地看过这些代码之后,可能会发现其它的几个 handler 函数逻辑上较简单,最复杂的也就是这个 handleKafka。但实际上我们的系统总是从这样微不足道的混乱开始积少成多最终变得难以收拾。 因为默认的net/http包中的 mux 不支持带参数的路由,所以Burrow 这个项目使用了非常蹩脚的字符串 Split 和乱七八糟的 switch case 来达到自己的目的,但实际上却让本来应该很集中的路由管理逻辑变得复杂,散落在系统的各处,难以维护和管理。如果读者细心地看过这些代码之后,可能会发现其它的几个 handler 函数逻辑上较简单,最复杂的也就是这个 handleKafka。但实际上我们的系统总是从这样微不足道的混乱开始积少成多最终变得难以收拾。
简单地来说,只要你的路由带有参数,并且这个项目的 api 数目超过了 10就尽量不要使用 net/http 中默认的路由。在 golang 开源圈应用最广泛的 router 是 httpRouter很多开源的 router 框架都是基于 httpRouter 进行一定程度的改造。关于 httpRouter 路由的原理,会在本章节的 router 一节中进行详细的阐释。 根据我们的经验,简单地来说,只要你的路由带有参数,并且这个项目的 api 数目超过了 10就尽量不要使用 net/http 中默认的路由。在Go开源界应用最广泛的 router 是 httpRouter很多开源的 router 框架都是基于 httpRouter 进行一定程度的改造的结果。关于 httpRouter 路由的原理,会在本章节的 router 一节中进行详细的阐释。
再来回顾一下文章开头说的,开源界有这么几种框架,第一种是对 httpRouter 进行简单的封装,然后提供定制的 middleware 和一些简单的小工具集成比如 gin主打轻量易学高性能。第二种是借鉴其它语言的编程风格的一些 MVC 类框架,例如 beego方便从其它语言迁移过来的程序员快速上手快速开发。还有一些框架功能更为强大除了 db 设计,大部分代码直接生成,例如 goa。不管哪种框架适合读者背景的就是最好的。 再来回顾一下文章开头说的,开源界有这么几种框架,第一种是对 httpRouter 进行简单的封装,然后提供定制的 middleware 和一些简单的小工具集成比如 gin主打轻量易学高性能。第二种是借鉴其它语言的编程风格的一些 MVC 类框架,例如 beego方便从其它语言迁移过来的程序员快速上手快速开发。还有一些框架功能更为强大除了 db 设计,大部分代码直接生成,例如 goa。不管哪种框架适合读者背景的就是最好的。
本章的内容除了会展开讲解 router 和 middleware 的原理,还会以现在工程界面临的问题结合 golang 来进行一些实践性的说明。希望没有接触过相关内容的读者能够有所受用 本章的内容除了会展开讲解 router 和 middleware 的原理外,还会以现在工程界面临的问题结合 Go 来进行一些实践性的说明。希望能够对没有接触过相关内容的读者有所帮助