go web的试行流程

日期: 2019-12-06 15:14 浏览次数 :

前言

本文为转载,原文:Golang Web学习(13)—— 搭建简单的Web服务器

Request:用户请求的信息,用来解析用户的请求信息,包括post,get,Cookie,url等信息
go web的试行流程。Response:服务器需要返回给客户端的信息
Conn:用户的每次请求链接
Handler;处理请求和生成返回信息的处理逻辑

大家可能乍一看,通过TCP/IP层连接两个进程会感觉可怕, 但是在Go语言中可能比你想象的要简单的多。下面话不多说了,来一起看看详细的介绍吧。

Golang

Go实现Web的简单流程

1、创建Listen Socket,监听指定的端口,等待客户端请求的到来。

2、Listent Socket接受客户端的请求,得到Client Socket,接下来Client Socket与客户端通信

3、处理客户端的请求,首先从 Client Socket读取HTTP请求的协议头,如果是POST方法,还可能要读取客户端请求的数据然后交给相应的Handler处理请求,handler处理完毕准备好客户端需要的数据,通过Client Socket传给客户端

TCP/IP层发送数据的应用场景

1、Web工作方式

我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要 浏览的内容。在这个看似简单的用户行为背后,到底隐藏了些什么呢?

对于普通的上网过程,系统其实是这样做的:浏览器本身是一个客户端,当你输入URL的 时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过 IP地址找到IP对应的服务器后,要求建立TCP连接,等浏览器发送完HTTP Request (请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回 HTTP Response(响应)包;客户端收到来自服务器的响应后开始渲染这个Response包 里的主体(body),等收到全部的内容随后断开与该服务器之间的TCP连接。

用户访问一个web站点的过程

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

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

流程问题

一、如何监听端口

二、如何接收客户端请求

三、如何分配handler(分配到相应的函数来处理请求)

当然很多情况下,不是大多数情况下,使用更高级别的网络协议毫无疑问会更好,因为可以使用华丽的API, 它们隐藏了很多技术细节。现在根据不同的需求,有很多选择,比如消息队列协议, gRPC, protobuf, FlatBuffers, RESTful网站API, websocket等等。

2、golang搭建一个web服务

前面已经简单的介绍了web服务器的工作原理,那么如何用golang搭建一个web服务呢?
下面先看个例子

package webser

import (
    "strings"
    "fmt"
    "net/http"
    "log"
)

func sayHelloName(w http.ResponseWriter, r *http.Request){
    r.ParseForm()
    fmt.Println(r.Form)
    fmt.Println("path: ", r.URL.Path)
    fmt.Println("scheme: ", r.URL.Scheme)
    fmt.Println(r.Form["url_long"])
    for k, v := range r.Form{
        fmt.Println("key: ", k)
        fmt.Println("val: ", strings.Join(v, " "))
    }
    fmt.Fprintf(w, "hello chain!")
}

func Start(){
    http.HandleFunc("/", sayHelloName)
    err := http.ListenAndServe(":9090", nil)
    if err != nil{
        log.Fatal("ListenAndServe: ", err)
    }
}

然后在main函数中调用start方法

package main
import (
    "gostu_demo/webser"
)
func main(){
    webser.Start()
}

go run main.go命令运行程序。
之后在浏览器中输入地址http://localhost:9090,看下结果。

浏览器结果

控制台打印

在url中加入参数试试http://localhost:9090?url_long=111&url_long=222

浏览器结果

控制台打印

我们看到上面的代码,要编写一个web服务器很简单,只要调用http包的两个函数就可以了。
Go通过简单的几行代码就已经运行起来一个web服务了,而且这个Web服务内 部有支持高并发的特性,我将会在接下来的两个小节里面详细的讲解一下go是如何实现 Web高并发的。

解答:

然而在一些特殊的场景下,特别是小型项目,选择任何其他方式都会感觉太臃肿了,更不用说你需要引入额外的依赖包了。

3、Go如何使得Web工作

前面小节介绍了如何通过Go搭建一个Web服务,我们可以看到简单应用一个net/http包 就方便的搭建起来了。那么Go在底层到底是怎么做的呢?

一、如何监听端口

通过ListenAndServe来监听,

1、初始化一个server对象,

2、调用net.Listen("tcp",addr),即底层使用tcp协议搭建了一个服务,然后监控端口