0

我正在寻找一个快速的 go 框架,我偶然发现了 fasthttp https://github.com/valyala/fasthttp,这是根据开发人员的说法,基准测试比 Golang net/http 包快 10 倍。我已经熟悉 gorilla 工具包和其他基于 net/http 的框架,如 gin-gonic、goji 和 gocraft。

我的问题是:是否可以将 net/http 框架/工具包与 fasthttp 混合使用,例如我想使用一些带有 echo/iris 的 gorilla 包(fasthttp 框架)?

4

2 回答 2

1

我认为从头文件替换将是最好的解决方案。这是一个显示默认 net/http 和 fasthttp 之间差异的示例

设置 net/http 默认包的示例。基本无效的方法

/* Global var */
var logcfg = initConfigurationData("test/")
var fileList = initLogFileData(logcfg)

func main() {
    channel := make(chan bool)
    /* Run coreEngine in background, parameter not necessary */
    go coreEngine(fileList, logcfg, channel)
    log.Println("Started!")
    handleRequests()
    <-channel
    log.Println("Finished!")
}

之后,您可以声明一个包含所有“API”的“包装器”,如下面的“handleRequest”方法

func handleRequests() {
    // Map the endoint to the function
    http.HandleFunc("/", homePage)
    http.HandleFunc("/listAllFile", listAllFilesHTTP)
    http.HandleFunc("/getFile", getFileHTTP)
    log.Fatal(http.ListenAndServe(":8081", nil))
}

以下是 API 列表,每个都绑定为 HandleFunc 的第一个参数,并使用方法提供的核心功能进行管理(示例):

// Example of function for print a list of file
func listAllFilesHTTP(w http.ResponseWriter, r *http.Request) {
    tmp := make([]string, len(fileList))
    for i := 0; i < len(fileList); i++ {
        tmp[i] = fileList[i].name
    }
    fmt.Fprintf(w, strings.Join(tmp, "\n"))
    log.Println("Endpoint Hit: listFile")
}

另一方面,使用 fasthttp,您必须更改您的 handleRequest 方法,如下所示

func handleRequests() {
    m := func(ctx *fasthttp.RequestCtx) {
        switch string(ctx.Path()) {
        case "/":
            fastHomePage(ctx)
        case "/listAllFile":
            fastListAllFilesHTTP(ctx)
        case "/getFile":
            fastGetFileHTTP(ctx)
        default:
            ctx.Error("not found", fasthttp.StatusNotFound)
        }
    }
    fasthttp.ListenAndServe(":8081", m)
}

然后,核心功能如下:
注意:您也可以将其他变量从上下文传递给方法。

// NOTE: The signature have changed!
func fastListAllFilesHTTP(ctx *fasthttp.RequestCtx) {
    ctx.Response.Header.Set("GoLog-Viewer", "v0.1$/alpha")
    tmp := make([]string, len(fileList))
    for i := 0; i < len(fileList); i++ {
        tmp[i] = fileList[i].name
    }
    fmt.Fprintf(ctx, strings.Join(tmp, "\n"))
    log.Println("Endpoint Hit: listFile")
}
于 2019-08-31T16:51:41.090 回答
0

我正在检查 Iris 框架,并在文档中看到可以将 net/http 与框架一起使用。

https://kataras.gitbooks.io/iris/content/using-native-httphandler.html

该框架使用以下内容将本机 net/http 处理程序转换为 fasthttp 处理程序。

https://github.com/valyala/fasthttp/tree/master/fasthttpadaptor

于 2016-06-30T08:57:27.330 回答