关于go:41-Golang常用标准库nethttpserver
Go语言创立HTTP服务还是十分不便的,基于http.Server几行代码就能实现,本篇文章次要介绍http.Server的根本应用形式以及HTTP申请解决流程。当然,目前很多web服务都基于gin框架实现,所以咱们也会简略介绍下gin框架的一些应用套路。 http.Server 概述 基于http.Server只须要短短几行代码就能创立一个HTTP服务,最简略的只须要配置好监听地址,以及申请解决handler就能够了,如上面程序所示: package mainimport ( "fmt" "net/http")func main() { server := &http.Server{ Addr: "0.0.0.0:8080", } //注册路由(也就是申请解决办法),解决/ping申请,准确匹配(申请地址必须完全一致) http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello world")) }) //启动HTTP服务 err := server.ListenAndServe() if err != nil { fmt.Println(err) }}/*curl http://127.0.0.1:8080/pinghello worldcurl http://127.0.0.1:8080/ping/1404 page not found*/ 如下面程序所示,http.Server.Addr设置HTTP服务监听地址,如果没有设置,默认监听80端口;http.HandleFunc函数用于注册路由,也就是申请对应的解决办法,有两个参数:第一个参数含意是pattern,有两种匹配形式,"/ping"为准确匹配即申请地址必须等于"/ping",如申请"/ping/1"无奈匹配,而"/ping/"为前缀匹配,如申请"/ping/1"也会匹配胜利;第二个参数是函数类型,func(ResponseWriter, * Request),ResponseWriter可用于向客户端返回数据,Request代表以后HTTP申请。 函数http.Server.ListenAndServe用于启动HTTP服务,想想流程应该是怎么的呢?必定须要Listen吧(底层必定少不了socket,bind,listen三个零碎调用),其次呢?期待客户端连贯呗,也就是循环期待accept,一旦返回创立新的协程解决该客户端申请就行了(包含读取数据,解析HTTP申请,解决,返回数据)。还是比较简单的,整个流程的代码如下: func (srv *Server) ListenAndServe() error { ln, err := net.Listen("tcp", addr) return srv.Serve(ln)}func (srv *Server) Serve(l net.Listener) error { for { rw, err := l.Accept() c := srv.newConn(rw) // 子协程解决申请 go c.serve(connCtx) }}func (c *conn) serve(ctx context.Context) { for { //读取&解析HTTP申请 w, err := c.readRequest(ctx) //解决HTTP申请 serverHandler{c.server}.ServeHTTP(w, w.req) //完结&返回 w.finishRequest() if !w.conn.server.doKeepAlives() { return } }} 整个流程框架其实非常简单,与咱们料想的基本一致,当然这里咱们省略了很多细节问题。如,c.serve函数主流程为什么是一个for循环呢?会屡次解决申请吗?当然是的,因为HTTP协定keepalive存在,客户端建设连贯之后,能够基于这一个连贯发送多个HTTP申请。而且,个别解决HTTP申请是不是都有超时工夫,如何解决超时问题咱们也省略了,咱们只关注都有哪些超时配置,这些配置都定义在http.Server构造,如下: ...