Объединение net/http и fasthttp

Я искал быстрый фреймворк для Go и наткнулся на fasthttp https://github.com/valyala/fasthttp который, по словам разработчика, и тест в 10 раз быстрее, чем пакет Golang net / http. Я уже знаком с инструментарием gorilla и другими сетевыми средами на основе net / http, такими как gin-gonic, goji и gocraft.

Мой вопрос: можно ли смешивать net / http framework / toolkits с fasthttp, например, я хотел бы использовать некоторые пакеты gorilla с echo / iris (fasthttp frameworks)?

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")
}

Я проверял фреймворк Iris и увидел в документации, что возможно использовать net / http с фреймворком.

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

Фреймворк использует следующее для преобразования собственного обработчика net / http в обработчик fasthttp.

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

Другие вопросы по тегам