创建http service的不同姿势


本文摘自网络,作者,侵删。

  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-zero 微服务框架

云边端架构easydss内Go语言如何生成归档文件?

Go语言指针数组

Go语言常量

Golang Gorm 事务极简封装

Golang代码能不能加密

Golang笔记之基本组成元素

手撸Golang 基本数据结构与算法 图的最短路径  狄克斯特拉算法

阅读Golang 切片(slice)底层源码

Go中x/sync/semaphore解读

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...