go-zero中的优雅关闭
使用方式:
// 注册路由
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})
// 启动HTTP服务
if err := http.ListenAndServe(":8080", nil); err != nil {
panic(err)
}
注册路由:
·路由信息放入到此结构体对应的实例中
type ServeMux struct {
mu sync.RWMutex
m map[string]muxEntry //路由和处理函数
es []muxEntry // slice of entries sorted from longest to shortest.
hosts bool // whether any patterns contain hostnames
}
路由重复注册,会产生panic
if _, exist := mux.m[pattern]; exist {
panic("http: multiple registrations for " + pattern)
}
启动HTTP服务
-
监听:listen
ln, err := net.Listen("tcp", addr)
-
接受:Accept
-
分发:goroutine处理连接上的请求
for {
rw, err := l.Accept()
省略.......
c := srv.newConn(rw)
go c.serve(connCtx)
}
TCP连接上提供的方法
type Conn interface {
Read(b []byte) (n int, err error)
Write(b []byte) (n int, err error)
Close() error
SetReadDeadline(t time.Time) error
SetWriteDeadline(t time.Time) error
处理请求
- 读取请求信息
// 以http请求协议的模式,读取请求数据
req, err := readRequest(c.bufr)
2. 处理请求信息
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
3. 返回请求信息
w.conn.bufw.Flush()