golang,go,博客,开源,编程
fasthttp
是 Go 语言中一个专为 高吞吐量 HTTP 服务器 设计的库,它相较于 net/http
提供了 更高的性能 和 更低的内存开销,特别适用于 Web 服务器、API 网关、CDN 边缘计算等高并发场景。
fasthttp
主要特性net/http
更快(通常是 4~10 倍)RequestCtx
、Request
和 Response
,避免频繁分配和释放内存[]byte
) 处理字符串,减少字符串分配net/http
大部分功能,但 API 设计不同net/http
的阻塞模式更高效fasthttp
安装go get -u github.com/valyala/fasthttp
package main
import (
"fmt"
"github.com/valyala/fasthttp"
)
// 处理 HTTP 请求
func requestHandler(ctx *fasthttp.RequestCtx) {
switch string(ctx.Path()) {
case "/":
fmt.Fprint(ctx, "Hello, Fasthttp!")
case "/ping":
fmt.Fprint(ctx, "pong")
default:
ctx.Error("Not Found", fasthttp.StatusNotFound)
}
}
func main() {
fmt.Println("Server is running on :8080")
if err := fasthttp.ListenAndServe(":8080", requestHandler); err != nil {
fmt.Println("Error:", err)
}
}
测试:
curl http://localhost:8080/
curl http://localhost:8080/ping
package main
import (
"fmt"
"github.com/valyala/fasthttp"
)
// HTTPS 处理函数
func requestHandler(ctx *fasthttp.RequestCtx) {
fmt.Fprint(ctx, "Hello, Secure Fasthttp!")
}
func main() {
fmt.Println("HTTPS Server running on :8443")
err := fasthttp.ListenAndServeTLS(":8443", "cert.pem", "key.pem", requestHandler)
if err != nil {
fmt.Println("Error:", err)
}
}
package main
import (
"fmt"
"github.com/valyala/fasthttp"
)
func main() {
// 创建请求对象
req := fasthttp.AcquireRequest()
defer fasthttp.ReleaseRequest(req)
req.SetRequestURI("http://example.com")
// 创建响应对象
resp := fasthttp.AcquireResponse()
defer fasthttp.ReleaseResponse(resp)
// 发送请求
client := &fasthttp.Client{}
if err := client.Do(req, resp); err != nil {
fmt.Println("Request failed:", err)
return
}
// 输出响应
fmt.Println("Response:", string(resp.Body()))
}
package main
import (
"fmt"
"github.com/valyala/fasthttp"
)
func main() {
req := fasthttp.AcquireRequest()
defer fasthttp.ReleaseRequest(req)
req.SetRequestURI("http://example.com")
req.Header.SetMethod(fasthttp.MethodPost)
req.SetBody([]byte(`{"username": "john", "password": "123456"}`))
req.Header.SetContentType("application/json")
resp := fasthttp.AcquireResponse()
defer fasthttp.ReleaseResponse(resp)
client := &fasthttp.Client{}
if err := client.Do(req, resp); err != nil {
fmt.Println("Request failed:", err)
return
}
fmt.Println("Response:", string(resp.Body()))
}
package main
import (
"encoding/json"
"fmt"
"github.com/valyala/fasthttp"
)
type Message struct {
Status string `json:"status"`
Message string `json:"message"`
}
func jsonHandler(ctx *fasthttp.RequestCtx) {
ctx.Response.Header.SetContentType("application/json")
msg := Message{
Status: "success",
Message: "Hello, Fasthttp!",
}
json.NewEncoder(ctx).Encode(msg)
}
func main() {
fmt.Println("Server running on :8080")
fasthttp.ListenAndServe(":8080", jsonHandler)
}
fasthttp
不直接提供路由功能,但可以使用 fasthttprouter
进行路由管理:
go get -u github.com/fasthttp/router
package main
import (
"fmt"
"github.com/fasthttp/router"
"github.com/valyala/fasthttp"
)
func main() {
r := router.New()
r.GET("/", func(ctx *fasthttp.RequestCtx) {
fmt.Fprint(ctx, "Welcome to Fasthttp Router!")
})
r.GET("/hello/{name}", func(ctx *fasthttp.RequestCtx) {
name := ctx.UserValue("name").(string)
fmt.Fprintf(ctx, "Hello, %s!", name)
})
fmt.Println("Server running on :8080")
fasthttp.ListenAndServe(":8080", r.Handler)
}
测试:
curl http://localhost:8080/hello/John
fasthttp
本身不支持 WebSocket,可以使用 fasthttp/websocket
:
go get -u github.com/fasthttp/websocket
package main
import (
"fmt"
"log"
"github.com/valyala/fasthttp"
"github.com/fasthttp/websocket"
)
var upgrader = websocket.FastHTTPUpgrader{}
func wsHandler(ctx *fasthttp.RequestCtx) {
err := upgrader.Upgrade(ctx, func(conn *websocket.Conn) {
defer conn.Close()
for {
_, msg, err := conn.ReadMessage()
if err != nil {
log.Println("Read error:", err)
break
}
log.Println("Received:", string(msg))
conn.WriteMessage(websocket.TextMessage, msg)
}
})
if err != nil {
log.Println("Upgrade error:", err)
}
}
func main() {
fmt.Println("WebSocket server running on :8080/ws")
fasthttp.ListenAndServe(":8080", wsHandler)
}
fasthttp
而不是 net/http
?特性 | net/http | fasthttp |
---|---|---|
性能 | 普通 | 极高 |
GC 压力 | 大 | 低 |
内存占用 | 高 | 低 |
路由支持 | 内置 | 需要第三方 |
WebSocket | 内置 | 需额外库 |
✅ 高并发 API
✅ CDN 代理服务
✅ WebSocket 服务
✅ 负载均衡器
如果你需要极致的 HTTP 处理性能,fasthttp
是一个优秀的选择!你想用它做什么项目呢?