分享
  1. 首页
  2. 文章

golang实现一个简易的http路由及其原理

ssdut_buster · · 5678 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

  1. 前提:实现一个http路由必须要了解net/http包,主要是go/src/net/http/server.go文件
  2. go实现一个web路由主要做三件事:
    • 监听端口
    • 接收客户端的请求
    • 为每个请求分配对应的handler(对应到php中就是将请求转发到相应的controller和action)

下面是一个简单的实现路由的逻辑

package main
import (
 "fmt"
 "net/http"
)
func rootGateWay(w http.ResponseWriter, r *http.Request) {
 println("Welcome to Chris's homepage! ")
}
func defaultGateWay(w http.ResponseWriter, r *http.Request) {
 fmt.Fprintf(w, "Hello jingjing")
 println("Welcome to Chris's homepage! ")
}
func main() {
 http.HandleFunc("/", defaultGateWay) 
 http.ListenAndServe(":8080", nil)
}
//访问http://host:8080/ 即可看到Hello jingjin

由上面这个例子可知,我们只执行了两步就完成了一个简易的web路由,分别执行了HandleFunc以及ListenAndServe两个函数。那这两个函数中又分别执行了什么操作呢

先看下面这段源码:

//调用默认ServerMux的HandleFunc方法
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { 
 DefaultServeMux.HandleFunc(pattern, handler)
}
//把方法handler转换成HandlerFunc类型,即实现了Handler接口;再执行Handle方法
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
 mux.Handle(pattern, HandlerFunc(handler))
}
//路由器注册一个handler给指定的parttern
func (mux *ServeMux) Handle(pattern string, handler Handler) {
 ....
}

不难看出,执行HandleFunc其实就是为某一规则的请求注册处理器。

下面我们看看ListenAndServe都干了什么,看下面一段源码:

func ListenAndServe(addr string, handler Handler) error {
 //初始化一个Server Struct 赋值server的地址和Handler,不过Handler经常性为空,因为会使 //用DefaultServeMux
 server := &Server{Addr: addr, Handler: handler} 
 return server.ListenAndServe()
}
//通过tcp网络监听addr地址 
func (srv *Server) ListenAndServe() error {
 addr := srv.Addr
 if addr == "" { 
 addr = ":http"
 }
 ln, err := net.Listen("tcp", addr)
 if err != nil {
 return err
 }
 //for死循环一直接受http request, 每个请求开启一个新的goroutine处理
 return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
}

由此,我们可以简单归纳出上文代码所做的操作:

  • 为不同的url规则注册路由handler
  • 创建server并监听端口
  • for循环一直接收request并并发处理

PS: 这一期的还是比较简单,下一期争取实现一个真正能满足业务需求的http路由和web


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:ssdut_buster

查看原文:golang实现一个简易的http路由及其原理

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
5678 次点击
1 回复 | 直到 2025年05月15日 08:34:33
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏