一. 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 !&