Golang Golang创建WebServer其实很简单,并不需要象Java一样依赖配置web.xml、不需要写servlet、不需要Tomcat、更不需要Spring这类五花八门的第三方框架,Golang创建WebServer只需要Golang SDK自己足以,在我眼里beego、gin等这类所谓等封装式的框架也是多余的。
1. 最简单方式之一
package main
import (
"fmt"
"log"
"net/http"
)
// 这是接口响应和处理函数,从`r`读往`w`里写,就这么简单
func greet(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
}
func main() {
// 每个接口都应该被注册在路由上,那么这都mux就是路由
route := http.DefaultServeMux
// 往路由里注册接口响应URL和响应函数
route.HandleFunc("/", greet)
// 启动server,如果server crash了会打印log
log.Fatal(http.ListenAndServe(":8080", route))
}
2. 最简单的方式之二
package main
import (
"fmt"
"net/http"
)
func greet(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
}
func main() {
http.HandleFunc("/", greet)
http.ListenAndServe(":8080", nil)
}
你会发现route没了,不用路由了么?其实这是另一种懒写方式,用
http.HandleFunc()
方式注册接口是默认注册在http.DefaultServeMux
上的,然后http.ListenAndServe(":8080", nil)
这里的nil为nil,其实默认内部也会使用http.DefaultServeMux
的作为路由。
3. 允许参数配置的WebServer
package main
import (
"fmt"
"log"
"net"
"net/http"
)
func greet(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
}
func main() {
router := http.DefaultServeMux
router.HandleFunc("/", greet)
// 上面简单方式中其实内部会构建出来一个server用于启动http server
// 这里我们把server暴露出来,随后可以对其各种期望参数设置
server := http.Server{
Handler: router,
}
server.SetKeepAlivesEnabled(false)
server.ReadTimeout = 10000
// server.xxx = xxx // many other settings
listener, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatal(err)
}
log.Fatal(server.Serve(listener))
}
小插曲:因为Golang创建的WebServer默认是keep alive的,这将导致导致server和client每次建立的connection不会自动close,当http请求次数多了会占用很多内存,如果你的项目是只支持短连接的,那么
server.SetKeepAlivesEnabled(false)
将做到每次连接即用即断。
未完待续...
有疑问加站长微信联系(非本文作者)