专业 Golang HTTP 服务器

wentingrohwer · 2018-05-18 14:38:22 · 7464 次点击 · 预计阅读时间 4 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2018-05-18 14:38:22 的文章,其中的信息可能已经有所发展或是发生改变。

如何使用 Go 启动新的 Web 项目,使用路由,中间件和让我们加密认证。

Golang 有一个很棒的自带 http 服务器软件包,不用说就是: net/http, 它非常简单,但是功能非常强大。 定义处理路由的函数,端口是 80。

package main

import (
    "io"
    "net/http"
)
func main() {
    http.HandleFunc("/", helloWorldHandler)
    http.ListenAndServe(":80", nil)
}
func helloWorldHandler(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello world!")
}

不错,但是我们可以使用一个更加强大的路由器,比如 Gorilla 包:gorilla/mux http://www.gorillatoolkit.org/pkg/mux

它实现了一个请求路由器和一个调度器。 它允许您创建具有命名参数的路由,限制 HTTP 动词(译注:即限制为 GET、POST 等)和主机或域名管理。

img
Gorilla Routing in action!
大猩猩路由在行动!

通过简单的配置就可以轻松管理更多路由

在之前的例子上使用 Gorilla,使我们能够使用简单配置轻松管理多条路线:

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/products/{key}", ProductHandler)
    r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
    r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)
    http.Handle("/", r)
}

使用 Alice 来管理我们的中间件

如果您使用网络服务器软件包,中间件模式非常常见。 如果您还没有看到它,您应该在 201 5年 Golang UK Conference 上观看Mat Ryer 的视频,了解中间件的强大功能。(完整的博客文章在这里)

视频链接:https://youtu.be/tIm8UkSf6RA

另一篇关于中间件模式的文章http://www.alexedwards.net/blog/making-and-using-middleware 正如作者的描述(Github):

Alice 提供了一种便捷的方式来链接您的HTTP中间件功能和应用程序处理程序。

简单说,它把

Middleware1(Middleware2(Middleware3(App)))

转换到

alice.New(Middleware1, Middleware2, Middleware3).Then(App)

我们的第一个例子,加上 Alice 之后:

func main() {
    errorChain := alice.New(loggerHandler, recoverHandler)
    r := mux.NewRouter()
    r.HandleFunc("/products/{key}", ProductHandler)
    r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
    r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)
    http.Handle("/", errorChain.then(r))
}

你可以串联许多 handler,如下描述了两个:

func loggerHandler(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        h.ServeHTTP(w, r)
        log.Printf("<< %s %s %v", r.Method, r.URL.Path, time.Since(start))
    })
}

loggerHandlerrecoverHandler:

func recoverHandler(next http.Handler) http.Handler {
    fn := func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if err := recover(); err != nil {
                log.Printf("panic: %+v", err)
                http.Error(w, http.StatusText(500), 500)
            }
        }()
        next.ServeHTTP(w, r)
    }
    return http.HandlerFunc(fn)
}

现在,我们有一个配有强大的路由包的 HTTP 服务器。 您还可以轻松管理中间件,以快速扩展应用程序的功能。

img

Alice 使中间件无处不在!


HTTP 服务器不错,但 HTTPS 服务器更好!

使用 Let's Encrypt 服务,简单快捷的创建一个安全的HTTP服务器 。 Let's Encrypt 使用 ACME协议 来验证您是否控制指定的域名并向您颁发证书。 这就是所谓的认证,是的,有一个自动认证软件包:acme / autocert

m := autocert.Manager{
    Prompt:     autocert.AcceptTOS,
    HostPolicy: autocert.HostWhitelist("www.checknu.de"),
    Cache:      autocert.DirCache("/home/letsencrypt/"),
}

使用 tls 创建 http.server

server := &http.Server{
    Addr: ":443",
    TLSConfig: &tls.Config{
        GetCertificate: m.GetCertificate,
    },
}
err := server.ListenAndServeTLS("", "")
if err != nil {
log.Fatal("ListenAndServe: ", err) }

img

完成了!


via: https://medium.com/@ScullWM/golang-http-server-for-pro-69034c276355

作者:Thomas P  译者:wentingrohwer  校对:polaris1119

本文由 GCTT 原创编译,Go语言中文网 荣誉推出


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

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

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