呜呜呜我要拿Go赢他~ 入门,Web 模块Server

2023-11-15 13:14:51 浏览数 (4)

前言

继续接入上章节的06-呜呜呜我要拿Go赢他~ 入门,基础语法type 的文章现在要学的Web 模块Server

Http Server 实现

在 Go 语言中,net/http 包提供了构建 HTTP 服务器的功能。HTTP 服务器可以处理客户端发起的请求,并返回响应。通过使用 net/http 包,可以轻松地创建出高性能、可扩展的 Web 服务。

上次我们通过几行代码就实现了 web 应用

代码语言:go复制
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, Golang!")
}

Web 核心

在框架对比的时候,我们注意到对于一个 Web 框架来说,至少要提供三个抽象:

• 代表服务器的抽象,这里我们称之为 Server

• 代表上下文的抽象,这里我们称之为 Context

• 路由树

在 Go 语言中,net/http 包提供了构建 Web 服务的核心功能

  1. HTTP 请求和响应:net/http 包定义了 http.Request 和 http.Response 结构体,分别表示客户端发起的 HTTP 请求和服务器返回的 HTTP 响应。http.Request 结构体包含了请求的方法、URL、头部、正文等信息,而http.Response 结构体包含了响应的状态码、头部、正文等信息。
  2. HTTP 服务器:net/http 包提供了 http.Server 结构体,用于创建和运行 HTTP 服务器。http.Server 结构体包含了服务器的地址、证书、超时设置等信息。可以使用 http.ListenAndServe 或 http.ListenAndServeTLS 函数启动 HTTP 服务器。
  3. 路由:net/http 包提供了简单的路由功能,可以使用 http.HandleFunc 函数为不同的路径设置处理器函数。处理器函数接收两个参数:http.ResponseWriter 和 *http.Request,分别用于向客户端写入响应和获取请求的详细信息。
  4. 中间件:虽然 net/http 包本身没有提供中间件功能,但可以使用第三方中间件库,如 github.com/gin-gonic/gin,为 HTTP 服务器添加额外的功能,如日志记录、身份验证等。
  5. TLS 支持:net/http 包支持 TLS,可以使用 http.ListenAndServeTLS 函数启动一个支持 TLS 的 HTTPS 服务器。

Server

对于一个 Web 框架来说,我们首先要有一个整体代表服务器的抽象,也就是 Server。

Server 从特性上来说,至少要提供三部分功能:

• 生命周期控制:即启动、关闭。如果在后期,我们还要考虑增加生命周期回调特性

• 路由注册接口:提供路由注册功能

• 作为 http 包到 Web 框架的桥梁

imgimg

http.Handler 接口

http 包暴露了一个接口,Handler。

它是我们引入自定义 Web 框架相关的连接点。

imgimg

接口定义 Version One

Server 定义:只组合 http.Handler

优点:

• 用户在使用的时候只需要调用 http.ListenAndServe 就可以

• 和 HTTPS 协议完全无缝衔接

• 极简设计

缺点:

• 难以控制生命周期,并且在控制生命周期的时候增加回调支持

• 缺乏控制力:如果将来希望支持优雅退出的功能,将难以支持

imgimg

接口定义 Version Two

Server 定义:组合 http.Handler 并且增加 Start 方法。

优点:

• Server 既可以当成普通的 http.Handler 来使用,又可以作为一个独立的实体,拥有自己的管理生命周期的能力

• 完全的控制,可以为所欲为

缺点:

• 如果用户不希望使用 ListenAndServeTLS,那么 Server 需要提供 HTTPS 的支持

imgimg

版本一和版本二都直接耦合了 Go 自带的 http 包,如果我们希望切换为 fasthttp 或者类似的 http 包,

则会非常困难。


imgimg

最后

本期结束咱们下次再见

0 人点赞