[golang]net/http库实现原理阅读

net/http实现原理阅读

原理图

在这里插入图片描述

net/http处理Http请求的基本流程

  1. 服务端创建socket,绑定并监听指定的IP地址和端口;ListenAndServer(...)
  2. 客户端与Listen Socket连接,确认请求后,客户端得的Client Socket,客户端通过这个与Listen Socket通信;srv.Server(...)
  3. 服务端创建一个go程来处理客户端请求,读取header和数据,交给相应的handler处理,结果通过Client Socket交给客户端;c.server(...)

包中的关键接口或结构体

  • Server结构体

    • 定义与http服务器相关的参数
  • Handler接口

    • 所有请求的Handler、路由均需满足该接口

    • type Handler interface {
             
      	ServeHTTP(ResponseWriter, *Request)
      }
      
  • ServeMux结构体

    • ServeMux是一种HTTP请求多路复用器。它根据已注册的列表匹配每个请求的URL,并调用与URL最匹配的处理程序。

    • 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
      }
      
    • muxEntry类型,则是保存了Handler请求处理器和匹配的模式字符串

    • type muxEntry struct {
             
          h        Handler // 这个路由表达式对应哪个handler
          pattern  string  //匹配字符串
      }
      
  • http.HandlerFunc函数类型

Http服务器执行流程

开启监听

服务器中的http.ListenAndServer()方法启动服务:

func ListenAndServe(addr string, handler Handler) error {
   
	server := &Server{
   Addr: addr, Handler: handler}
	return server.ListenAndServe()
}

生成了Server结构体,调用其方法ListenAndServe

func (srv *Server) ListenAndServe() error {
   
	if srv.shuttingDown() {
   
		return ErrServerClosed
	}
	addr := srv.Addr
	if addr == "" {
   
		addr = ":http"
	}
	ln, err := net.Listen("tcp", addr)
	if err != nil {
   
		return err
	}
	return srv.Serve(ln)
}

net.Listen来进行对地址的监听,返回一个listener,传递给server.Serve()方法;

func (srv *Server) Serve(l net.Listener) error {
   
	if fn := testHookServerServe; fn != nil 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值