阅读net/http源码

阅读net/http源码

参考资料:golang web应用开发

Conn

golang http中使用goroutines来为每个请求都创建一个conn来实现高并发和高性能

c, err := srv.newConn(rw)
if err != nil {
	continue
}
go c.serve()

因此每个请求不会互相堵塞,并且每个请求互相独立不会影响

ServeMux

ServeMux实质上是一个路由器,它的定义如下:

type ServeMux struct {
	mu sync.RWMutex   //锁,因为涉及并发
	m  map[string]muxEntry  // 路由表
	hosts bool // 是否在任意的规则中带有host信息
}

路由表项如下:

type muxEntry struct {
	explicit bool   // 是否完全匹配
	h        Handler // 处理函数
	pattern  string  //匹配字符串
}

处理函数如下:

type Handler interface {
	ServeHTTP(ResponseWriter, *Request)  // 路由
}

路由:

func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) {
	if r.RequestURI == "*" {
		w.Header().Set("Connection", "close")
		w.WriteHeader(StatusBadRequest)
		return
	}
	h, _ := mux.Handler(r)
	h.ServeHTTP(w, r)
}

路由会判断是否已到头,若到头则返回,并关闭链接,不然就继续多路路由,继续传递。

总结

其实http源代码我并没有看的太懂。。。
这篇总结基本是跟着golang web应用开发写的,自己也算了解了一些基本流程和大概,但并没有太多新的见解,如果ta和老师觉得这篇阅读分享质量太低就无视吧。。 纯当写个乐子了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值