0

Go 用の高速なフレームワークを探していたところ、開発者によると fasthttp https://github.com/valyala/fasthttpに出くわしました。ベンチマークは Golang net/http パッケージよりも 10 倍高速です。私は、ゴリラ ツールキットや、gin-gonic、goji、gocraft などの他の net/http ベースのフレームワークに精通しています。

私の質問は次のとおりです。net/http フレームワーク/ツールキットを 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!")
}

その後、次の「handleRequest」メソッドのように、すべての「API」を含む「ラッパー」を宣言できます。

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 に答える