Go实现独立的Web服务器

本文介绍了如何使用Go语言的标准库net/http构建一个简单的Web服务器。从基础的HTTP服务器介绍开始,逐步讲解如何启动首个Web服务示例,包括服务的初始化、路由处理,并通过源码分析揭示了Go处理HTTP请求的内部机制。
摘要由CSDN通过智能技术生成

一. Web服务器

说起web服务器,相信大家都比较熟悉,比如Nginx、Apache、Tomcat等,通过代理或者反向代理方式为用户提供服务。如果使用这些组件,则需要部署Web服务器、项目代码等,而且相关配置等一堆,还是比较麻烦的,而且很多功能需要基于网关开发或者在项目代码中支持开发等。那么如果脱离这些Web服务器,我们是否可以实现一个Web服务器,完全自我可控?

二. Go实现Web服务

Golang本身提供了一个比较完善的Http服务的内置包,在业务开发中,只需要在此包基础上就可以实现一个功能丰富、强大的web服务器。

2.1 Golang标准库:net/http

net/http库实现了整套的http服务中的客户端、服务端接口,可以基于此轻松的发起HTTP请求或者对外提供HTTP服务。本期主要介绍基于此包实现对外提供HTTP服务。

server基本介绍

server服务的基本信息

type Server struct {
   
	Addr string // 定义服务监听的地址端口,如果为空,则默认监听80端口
	Handler Handler // 请求被处理的业务方,默认 http.DefaultServeMux
	TLSConfig *tls.Config // 可选的TLS配置,对外提供https服务
	ReadTimeout time.Duration // 读取客户端请求的超时时间,包含读取请求体
	ReadHeaderTimeout time.Duration // 读取请求头的超时时间,如果为空,则使用 ReadTimeout, 如果两者都没有,则没有超时时间
	WriteTimeout time.Duration // 服务响应的超时时间
	IdleTimeout time.Duration // 长链接空闲的超时时间
	MaxHeaderBytes int // 客户端请求头的最大大小,默认为1MB
	ConnState func(net.Conn, ConnState) // 指定可选的回调方法,当客户端连接状态发生改变时
	ErrorLog *log.Logger // 连接错误、handlers异常或者文件系统异常时使用,默认使用标准库的logger接口
	onShutdown []func() // 服务停止时触发的方法调用
}

基于以上server结构,Golang标准库提供了如下几个服务接口

func (srv *Server) Close() error // 立即关闭所有的活跃监听以及所有的连接,包括新建的连接、活跃的或者空闲的连接
func (srv *Server) ListenAndServe() error // 启动服务监听tcp连接以及将请求转发到handler中
func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error // 支持https服务
func (srv *Server) Shutdown(ctx context.Context) error // 实现优雅关闭连接
2.2 启动首个web服务示例
2.2.1 Web服务示例

最简单的Server:


package main
    
import (
    "fmt"
    "net/http"
)
    
func helloWorldHandler(w http.ResponseWriter, r *http.Request) {
   
    fmt.Fprintf(w, "Hello world\n")
}
    
func main() {
   
    http.HandleFunc("/", helloWorldHandler)
    srv := http.Server{
   
        Addr: ":9090",
    }
    er := srv.ListenAndServe()
    if er !&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值