创建http service的不同姿势

生活简单些 · · 474 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

  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)将做到每次连接即用即断。

未完待续...


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:生活简单些

查看原文:创建http service的不同姿势

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

474 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传