Skip to content

Latest commit

 

History

History
76 lines (47 loc) · 3.16 KB

Golang构建HTTP服务之net-http库源码笔记.md

File metadata and controls

76 lines (47 loc) · 3.16 KB

一个最简单的Golang实现的http服务器

package main

import (
	"fmt"
	"net/http"
)

// 所谓的http服务器,主要在于server端如何接受client端的request请求,并向client端返回response
func IndexHandle(w http.ResponseWriter, req *http.Request) {
	fmt.Fprintln(w, "Hello Golang")
}
func main() {
	http.HandleFunc("/", IndexHandle)
	http.ListenAndServe(":9090", nil)
}

​ 接收request的过程中,最重要的莫过于路由(router),即实现一个Multiplexer器。Go中既可以使用内置的mutilplexer --- DefautServeMux,也可以自定义。Multiplexer路由的目的就是为了找到处理器函数(handler),后者将对request进行处理,同时构建response。

简单总结就是下面这个流程:

Client -> Requests -> Multiplexer(router) -> handler -> Response -> Client

因此理解go中的http服务最重要就是要理解Multiplexer和handler,Golang中的Multiplexer基于ServeMux结构同时也实现了Handler接口type ServeMux struct {
	mu    sync.RWMutex
	m     map[string]muxEntry
	hosts bool // whether any patterns contain hostnames
}
  • handler函数:具有func(w http.ResponseWriter, r *http.Request)签名的函数
  • handler处理器(函数):经过HandlerFunc结构包装的handler函数,它实现了ServeHTTP接口方法的函数。调用handler处理器的ServeHTTP方法时,即调用handler函数本身。
  • handler对象:实现了Handler接口ServeHTTP方法的结构
handler处理器和handler对象的差别在于一个是函数另外一个是结构它们都有实现了ServeHTTP方法很多情况下它们的功能类似下文就使用统称为handler这算是Golang通过接口实现的类动态类型吧go的http服务都是基于handler进行处理

创建HTTP服务

创建一个http服务大致需要经历两个过程首先需要注册路由即提供url模式和handler函数的映射其次就是实例化一个server对象并开启对客户端的监听net/http包暴露的注册路由的api很简单,http.HandleFunc选取了DefaultServeMux作为multiplexerfunc HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}
那么什么是DefaultServeMux呢实际上DefaultServeMux是ServeMux的一个实例当然http包也提供了NewServeMux方法创建一个ServeMux实例默认则创建一个DefaultServeMux注册好路由之后启动web服务还需要开启服务器监听http的ListenAndServer方法中可以看到创建了一个Server对象并调用了Server对象的同名方法监听开启之后一旦客户端请求到底go就开启一个协程处理请求主要逻辑都在serve方法之中serve方法比较长其主要职能就是创建一个上下文对象然后调用Listener的Accept方法用来 获取连接数据并使用newConn方法创建连接对象最后使用goroutein协程的方式处理连接请求因为每一个连接都开起了一个协程请求的上下文都不同同时又保证了go的高并发serve也是一个长长的方法