1.1 大型可扩展web应用的特点:
可扩展
- 纵向扩展 - go在一个线程上可以运行上千个goroutines
- 横向扩展 - go程序编译成静态二进制文件,可以在多个系统上运行
模块化:go经常用来创建微服务,多个微服务可以组成一个大型应用
可维护:go语言语法简单,包管理灵活,文档工具(godoc)使用简单,内置测试功能
高性能:go性能接近于C,且同时可执行上千个goroutines
1.2 web应用如何工作
通过HTTP协议传输数据
web application: 传输数据给用户使用
web service: 传输数据给其它应用使用
1.3 简单介绍HTTP
HTTP是无状态的,基于文本的,使用客户端-服务器计算模型的请求-响应协议
无状态:本次的“请求-响应”与上一次的“请求-响应”没有关系
基于文本:不用特殊的协议分析器,就可以很容易的定位错误
HTTP 0.9:1990年,第一个版本
HTTP 1.0:1996年
HTTP 1.1:1999年
HTTP 2.0:正在起草
1.4 web应用的发展
(1)提供静态内容
(2)提供动态内容
CGI:每一个连接创建一个CGI进程,CGI进程从环境变量、标准输入中读取数据,处理数据,然后向标准输出输出数据,处理完毕后退出
SSI:server-side includes,它是可以包含在HTML中的一些指令。当HTML文件被请求时,这些指令被执行,并将输出结果嵌入HTML文件中,然后发送给客户端
1.5 HTTP请求
HTTP请求由以下部分组成:
- 请求行
- 零或多个请求头
- 空行
- 消息体 (optional)
请求行
- 请求方法 (0.9版本只有GET,1.0版本增加POST、HEAD,1.1版本增加另外5个:PUT、DELETE、OPTIONS、TRACE、CONNECT,一些实现又增加了PATCH)
- URI
- HTTP版本
注意:浏览器仅支持GET和POST方法
请求头
Accept、Accept-Charset、Authorization、Cookie、Content-Length、Content-Type、Host、Referrer、User-Agent
1.6 HTTP响应
- 状态行
- 零或多个响应头
- 空行
- 消息体(optional)
状态行
- 状态码 (1XX, 2XX, 3XX, 4XX, 5XX)
- 状态码相应的描述
响应头
Allow, Content-Length, Content-Type, Date, Location, Server, Set-Cookie, WWW-Authenticate
1.7 URI
URN: uniform resource name
URL: uniform resource locator
URI: uniform resource identifier
URI是URN和URL的总称
URI的一般格式::[?][#]
1.8 HTTP/2介绍
HTTP/2是HTTP的新版本,专注于性能,是一个二进制协议。在Go 1.6中使用HTTPS时,自动使用HTTP/2,之前的版本可以通过
golang.org/x/net/http2
包使用HTTP/2
1.9 web app的组成
handlers: 处理HTTP请求,执行需要的工作
handlers调用template engine。在MVC结构中,handlers是M和C(C一般比较小,仅负责路由、HTTP的封包和解包,M较大,包含应用逻辑和数据,
V是返回给client的HTML)
template engine: 产生HTML,并返回给客户端。
静态模板:HTML夹杂着占位符号,静态模板引擎直接将占位符号替换成正确的数据。静态模板引擎有:CTemplate、Mustache等
动态模板:HTML夹杂着占位符号以及某种编程语言的结构(条件语句、迭代器、变量等)。动态模板引擎有:JSP、ASP、ERB等
1.10 Hello Go
术语handler通常用于事件触发的回调函数