ZOU YING

Coding 💻, Gopher 🐶, AI 🤖️

RSS订阅

关于

Golang:http service

源码解析系列。从这篇文章开始,将分享Golang中的http router的工作原理。

总体

本系列文章是对http service进行一系列分析,通过分析go自带的库和开源社区热门的web框架,最终实现一个自己的web框架。

主要分为:

  1. 使用go自带的net/http搭建http service
  2. net/http的实现原理
  3. 开源社区中热门的http router的实现原理
  4. 如何编写一个自己的http router框架

这篇文章是该系列的第一篇文章,主要是介绍go自身的使用和原理。

Go net/http

使用

首先看Go默认的http router是如何工作的。

看一个简单的例子,

package main

import (
	"fmt"
	"html"
	"log"
	"net/http"
)

func fooHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
}

func main() {
	http.HandleFunc("/foo", fooHandler)

	log.Fatal(http.ListenAndServe(":8080", nil))
}

注册了两个http的处理函数(HandleFunc)分别在/foo/barAPI。

运行:

go run main.go

调用:

curl http://localhost:8080/foo

# Hello, "/foo"

curl http://localhost:8080/

# 404 page not found
  1. 注册了一个函数用于处理http请求

    • /foo:通过fooHandler进行处理
    • HTTP service启动并监听:8080端口,等待客户端请求
  2. 客户端使用curl发起HTTP GET请求时,Golang根据调用的接口路径调用了不同的函数进行处理

源码分析

如何把客户端的请求与服务器中HTTP处理函数关联起来,这也是路由器的工作。

主要代码:

主要围绕这两个函数进行分析。

http.HandleFunc

HandleFunc为DefaultServeMux注册一个给定模式的http请求的处理函数。

具体的模式匹配规则如下,参考ServeMux文档说明

  • 匹配模式名字:

    • 固定的(fixed)、带根路径(/),例如:"/favicon.ico"
    • 子节点的根路径,例如:"/images/"
  • 最长匹配规则:例如“/images/”和“/images/thumbnails/”分别对应两个处理函数,请求“/images/thumbnails/123”将匹配“/images/thumbnails/”对应的处理函数。

© 2018 - 2019 Ying Zou.

You can Contact Me