1.web工作方式

Web服务器的工作原理可以简单地归纳为:

  • 客户机通过TCP/IP协议建立到服务器的TCP连接
  • 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档
  • 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端
  • 客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果

2.Go搭建一个Web服务器

我们build之后,然后执行web.exe,这个时候其实已经在9090端口监听http链接请求了。
在浏览器输入http://localhost:9090
可以看到浏览器页面输出了Hello astaxie!

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "strings"
  7. )
  8. func sayhelloName(w http.ResponseWriter, r *http.Request) {
  9. r.ParseForm() //解析参数,默认是不会解析的
  10. fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
  11. fmt.Println("path", r.URL.Path)
  12. fmt.Println("scheme", r.URL.Scheme)
  13. fmt.Println(r.Form["url_long"])
  14. for k, v := range r.Form {
  15. fmt.Println("key:", k)
  16. fmt.Println("val:", strings.Join(v, ""))
  17. }
  18. fmt.Fprintf(w, "hello astaxie") //这个写入到w的是输出到客户端的
  19. }
  20. func main() {
  21. http.HandleFunc("/", sayhelloName) //设置访问的路由
  22. err := http.ListenAndServe(":9090", nil)
  23. if err != nil {
  24. log.Fatal("ListenAndServe: ", err)
  25. }
  26. }

3.Go如何使得Web工作

web工作方式的几个概念

Request:用户请求的信息,用来解析用户的请求信息,包括post、get、cookie、url等信息
Response:服务器需要反馈给客户端的信息
Conn:用户的每次请求链接
Handler:处理请求和生成返回信息的处理逻辑

分析http包运行机制

http包执行流程
1.创建Listen Socket,监听指定的端口,等待客户端请求到来。
2.Listen Socket接受客户端的请求,得到Client Socket,接下来通过Client Socket与客户端通信。
3.处理客户端的请求,首先从Client Socket读取HTTP请求的协议头,如果是POST方法,还可能要读取客户端提交的数据,然后交给相应的handler处理请求,handler处理完毕准备好客户端需要的数据,通过Client Socket写给客户端

4.Go的http包详解

Conn的goroutine

与我们一般编写的http服务器不同, Go为了实现高并发和高性能, 使用了goroutines来处理Conn的读写事件, 这样每个请求都能保持独立,相互不会阻塞,可以高效的响应网络事件。这是Go高效的保证。
客户端的每次请求都会创建一个Conn,这个Conn里面保存了该次请求的信息,然后再传递到对应的handler,该handler中便可以读取到相应的header信息,这样保证了每个请求的独立性。

  1. c, err := srv.newConn(rw)
  2. if err != nil {
  3. continue
  4. }
  5. go c.serve()

ServeMux的自定义(此处看不懂,暂时跳过)

我们前面小节讲述conn.server的时候,其实内部是调用了http包默认的路由器,通过路由器把本次请求的信息传递到了后端的处理函数。那么这个路由器是怎么实现的呢?
此处看不懂,暂时跳过