HTTP 协议 与 golang web 应用服务
本文仅是介绍 golang web 应用与服务的 hello world 的工作原理,开发工具等。
本文要点:
1. 分布式计算 “C/S架构”知识
2. HTTP 协议基础知识;协议分析工具 curl
3. Golang web 应用搭建、工作原理、源代码阅读、程序设计技巧
4. Web 应用框架,压力测试工具 ab前提条件:
1. OO 思想在 Golang 应用
2. OS 并发基础知识
3. 了解 socket 通讯与 stream
4. 了解 python tornado 框架、Java web 应用服务器框架最好
本文档代码位置:https://github.com/pmlpml/golang-learning/tree/master/web
1、C/S 架构
在分布式计算中,计算机之间协作最基础、最简单的结构就是 C/S 架构 。一个 进程 扮演 Server 提供服务,一个或多个 进程 扮演 Client 发起服务请求。C/S架构( Client–Server model )应用及其广泛,从关系数据库服务、到web应用、电子邮局、FTP服务、以及我们现在见到的大多数 云服务 都是C/S架构应用。
C/S架构通讯模型如图所示:
+----------+ Request -> +----------+
| |--------------------------------->| |
| Client | | Server |
| |<---------------------------------| |
+----------+ <- Response +----------+
这里,我们看出C/S架构通讯非常简单。如同 client 问“你吃过了吗?”,server 回答“吃了红烧肉”,但是,server 不能主动反问“你吃了吗?”。 问题是为什么要做这样的限制……
当然,在许多应用中也需要突破这样的限制,于是就有了一些辅助技术手段… 例如 websocket
C/S架构编程手段很多,用socket直接编程不是很方便吗?如果仅编写一个没有任何工业用途的 “toy” 程序,可以这样做。 但是,一个好的服务程序,必须满足 高可靠、高可用(7*24) 、高性能 、可伸缩 、高开发效率 、安全 、可扩展 等特性。例如,做一个服务全球的订票服务系统开发,就必须支持这些特性。 基于 HTTP 协议的 web service,不仅开发简单,而且能满足产业界的要求,随着“云服务”技术的发展,近几年大规模普及。
2、HTTP 协议基础
The Hypertext Transfer Protocol ( HTTP ) is an application protocol for distributed, collaborative, hypermedia information systems.
HTTP 协议是一个复杂的协议, 支持虚拟主机、消息路由(负载均衡)、分段下载、缓存服务、安全认证等等。 HTTP 也是非常简单文本协议。 客户端与服务器建立 TCP 连接后,客户端发出 Request 文本, 服务器端返回 Response 文本。
HTTP 是应用层协议,传输建立在传输层 TCP 协议基础之上。 例如:用户在浏览器中输入 http://www.sysu.edu.cn/
浏览器与服务器之间发生了什么呢?
- 浏览器:请求 DNS 解析
www.sysu.edu.cn
得到121.46.26.52
- 浏览器:用 socket 与 服务器
121.46.26.52:80
发起TCP
连接请求 - 服务器:
Accept
客户端请求,建立该连接 - 浏览器:向服务器写信息(字符流),Request
- 服务器:按浏览器的请求,返回客户端信息(字符流)Response
- 浏览器:断开连接,让双方释放资源
其中: Request 与 Response 的约定,就是 HTTP 协议。 HTTP/1.1 标准就是 RFC 2616。
2.1 HTTP 协议基本格式
Request 文本格式
它是三段式的文本(命令行、header、body)
GET / HTTP/1.1 #第一行:第一个单词 - 方法;第二个单词 - uri; 协议与版本
Host: www.example.com #第2-n行,都是 key:value 格式,称为 headers
...
CRLF #header 结束标识
message-body #按heahder指令处理
Request methods
Request第一行第一个单词( 大写 ), 例如 GET、HEAD、POST、PUT、DELETE等。
- GET 读取 uri 指向的信息
- HEAD 查询 uri 指向的信息
- PUT 写入 uri 指向的信息
- DELETE 写入 uri 指向的信息
- POST 提交表单
URI & URL
统一资源标识(URI),即要访问对象(文件)的路径和参数
统一资源定位符(URL)。例如: