教你搭建一个简单的Go Web服务器

栏目: Go · 发布时间: 5年前

内容简介:今天给大家分享一篇搭建一个GO web服务器,HelloWorld!!在学习Go语言有一个很好的起点,Go语言官方文档很详细,今天我们学习的Go Web服务器的搭建就需要用到Go语言官方提供的标准库 net/http,通过http包提供了HTTP客户端和服务端的实现。同时使用这个包能很简单地对web的路由,静态文件,模版,cookie等数据进行设置和操作。如果对http概念不是太清楚的朋友可以自行google。

今天给大家分享一篇搭建一个GO web服务器,HelloWorld!!

教你搭建一个简单的Go Web服务器

Go语言标准库 - net/http

在学习 Go 语言有一个很好的起点,Go语言官方文档很详细,今天我们学习的Go Web服务器的搭建就需要用到Go语言官方提供的标准库 net/http,通过http包提供了HTTP客户端和服务端的实现。同时使用这个包能很简单地对web的路由,静态文件,模版,cookie等数据进行设置和操作。如果对http概念不是太清楚的朋友可以自行google。

http包建立Web服务器

package main 
import ( 
    "fmt" 
    "net/http" 
    "strings" 
    "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 Wrold!") //这个写入到w的是输出到客户端的 
} 
func main() { 
    http.HandleFunc("/", sayhelloName) //设置访问的路由 
    err := http.ListenAndServe(":9090", nil) //设置监听的端口 
    if err != nil { 
        log.Fatal("ListenAndServe: ", err) 
    } 
} 

上面的代码我们在IDE中编译后并运行成功后,这个时侯我们就可以在9090端口监听http链接请求了。

教你搭建一个简单的Go Web服务器

上图中,我们在浏览器中输入了 http://localhost:9090 ,可以看到浏览器页面中输入出 Hello World!

这个时侯如果我们在浏览器地址后面加一些参数试试:http://localhost:9090?url_long=111&url_long=222,看看浏览器中输出什么?服务器端输出的又是什么?

教你搭建一个简单的Go Web服务器

浏览器中输出图片

教你搭建一个简单的Go Web服务器

服务器端输出图片

我们看到了上面的代码,要编写一个Web服务器是不是很简单,只要调用http包的两个函数就可以了。

如果以前你是.NET程序员,那你也许就会问,我们的IIS服务器不需要吗?Go就是不需要这些,因为他直接就监听了TCP端口了。

我们看到Go通过简单的几行代码就已经运行起来一个Web服务了,而且这个Web服务内部有支持高并发的特性。现在Web服务已经搭建完成了,那我们现在来了解一个这个服务是怎么运行起来的呢?

Web工作方式的几个概念

以下几个为服务器段的概念

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

分析http包运行机制

教你搭建一个简单的Go Web服务器

Go实现Web服务的工作模式流程图

这个过程我们需要清楚以下三个问题,则就清楚Go是如何让Web运行起来了

  • 如何监听端口?

通过上面的代码我们看到Go是通过一个函数ListenAndServe来处理这些事情的,这个底层其实这样处

理的:初始化一个server对象,然后调用了net.Listen("tcp", addr),也就是底层用TCP协议搭建了一个服

务,然后监控我们设置的端口。

Go http包的源码,这里我们可以看到整个http处理过程

func (srv *Server) Serve(l net.Listener) error { 
    defer l.Close() 
    var tempDelay time.Duration // how long to sleep on accept failure 
    for { 
        rw, e := l.Accept() 
        if e != nil { 
            if ne, ok := e.(net.Error); ok && ne.Temporary() { 
                if tempDelay == 0 { 
                    tempDelay = 5 * time.Millisecond 
                } else { 
                    tempDelay *= 2 
                } 
                if max := 1 * time.Second; tempDelay > max { 
                    tempDelay = max 
                } 
                log.Printf("http: Accept error: %v; retrying in %v", e, tempDelay) 
                time.Sleep(tempDelay) 
                continue 
            } 
            return e 
        } 
        tempDelay = 0 
        if srv.ReadTimeout != 0 { 
            rw.SetReadDeadline(time.Now().Add(srv.ReadTimeout)) 
        } 
        if srv.WriteTimeout != 0 { 
            rw.SetWriteDeadline(time.Now().Add(srv.WriteTimeout)) 
        } 
        c, err := srv.newConn(rw) 
        if err != nil { 
            continue 
        } 
        go c.serve() 
    } 
    panic("not reached") 
} 
  • 如何接收客户端请求?

上面代码执行监控端口之后,调用了srv.Serve(net.Listener)函数,这个函数就是处理接收客户端的请求信 息。这个函数里面起了一个for{},首先通过Listener接收请求,其次创建一个 Conn,最后单独开了一个 goroutine,把这个请求的数据当做参数扔给这个conn去服务:go c.serve()。这 个就是高并发体现了, 用户的每一次请求都是在一个新的goroutine去服务,相互不影响。

  • 如何分配handler?

conn首先会解析request:c.readRequest(),然后获取相应的handler:handler := c.server.Handler,也就是我们刚才在调用函数ListenAndServe时候的第二个参数,我们前面例子传递的是nil,也就是为空,那么默认获取handler = DefaultServeMux,那么这个变量用来做什么的呢?对,这个变量就是一个路由器,它用来匹配url跳转到其相应的handle函数,那么这个我们有设置过吗?有,我们调用的代码里面第一句不是调用了http.HandleFunc("/", sayhelloName)嘛。这个作用就是注册了请求/的路由规则,当请求uri为"/",路由就会转到函数sayhelloName,DefaultServeMux会调用ServeHTTP方法,这个方法内部其实就是调用sayhelloName本身,最后通过写入response的信息反馈到客户端。

教你搭建一个简单的Go Web服务器

一个http连接处理流程

至此我们的三个问题已经全部得到了解答,你现在对于Go如何让Web跑起来的是否已经基本了解


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Data Structures and Algorithms with JavaScript

Data Structures and Algorithms with JavaScript

Michael McMillan / O'Reilly Media / 2014-2-22 / USD 28.51

If you’re using JavaScript on the server-side, you need to implement classic data structures that conventional object-oriented programs (such as C# and Java) provide. This practical book shows you how......一起来看看 《Data Structures and Algorithms with JavaScript》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具