golang中http服务的启动和优雅关闭

121 阅读1分钟

go-zero中的优雅关闭

image.png

使用方式:

// 注册路由
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服务

  1. 监听:listen

    ln, err := net.Listen("tcp", addr)

  2. 接受:Accept

  3. 分发: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

处理请求

  1. 读取请求信息
// 以http请求协议的模式,读取请求数据
req, err := readRequest(c.bufr)

2. 处理请求信息

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
   f(w, r)
}

3. 返回请求信息

w.conn.bufw.Flush()