← Back to Cecep Azhar
Cecep Azhar #golang#fiber#web-framework#api#performance

Go Fiber: Web Framework yang Super Cepat untuk API

Cecep Saeful Azhar • 16 Oct 2026
Go Fiber: Web Framework yang Super Cepat untuk API
Mengenal Go Fiber, web framework yang super cepat untuk REST API. Setup, routing, middleware, dan tips performa.

Kenapa Fiber?

Saat pertama kali mencoba Go Fiber, saya langsung kagum dengan kecepatannya. Fiber dibangun di atas fasthttp, bukan net/http standar, yang membuatnya 2-10x lebih cepat dari framework Go lainnya untuk HTTP handling.

Bagi saya, Fiber adalah sweet spot antara kecepatan dan developer experience. Syntax-nya mirip Express.js atau FastAPI, jadi kalau Anda pernah pakai framework JS/Python, akan familiar.

Setup Project dengan Fiber

package main

import (
    "log"
    "github.com/gofiber/fiber/v2"
)

func main() {
    app := fiber.New(fiber.Config{
        AppName:      "My SaaS API",
        ServerHeader: "Fiber",
        Prefork:      true,
    })

    app.Get("/", func(c *fiber.Ctx) error {
        return c.SendString("Hello, World!")
    })

    log.Fatal(app.Listen(":3000"))
}

Routing yang Powerful

Fiber support semua pattern routing yang Anda butuhkan:

// Path parameters
app.Get("/users/:id", getUser)

// Wildcard
app.Get("/files/*", serveFile)

// Group routes untuk versioning API
api := app.Group("/api/v1")
api.Get("/projects", listProjects)
api.Post("/projects", createProject)
api.Get("/projects/:id", getProject)
api.Put("/projects/:id", updateProject)
api.Delete("/projects/:id", deleteProject)

// Route group dengan middleware
auth := api.Group("/auth", AuthMiddleware)
auth.Get("/profile", getProfile)
auth.Put("/profile", updateProfile)

Middleware yang Berguna

Salah satu kekuatan Fiber adalah middleware system-nya:

// CORS middleware
app.Use(cors.New(cors.Config{
    AllowOrigins: "https://myapp.com",
    AllowHeaders: "Origin, Content-Type, Accept",
}))

// Rate limiting
app.Use(limiter.New(limiter.Config{
    Max:        100,
    Expiration: 1 * time.Minute,
}))

// Custom logger
app.Use(logger.New(logger.Config{
    Format: "${time} | ${status} | ${method} ${path} | ${latency}\n",
}))

Benchmark: Fiber vs Chi vs Gin

Dari benchmark yang saya lakukan untuk API REST dengan JSON response:

Nomor ini bisa bervariasi tergantung workload, tapi Fiber consistently di atas untuk simple HTTP handlers.

Kapan Tidak Pakai Fiber?

Jujur, Fiber tidak cocok untuk semua use case. Kalau Anda butuh HTTP/2 server push atau native net/http compatibility, pertimbangkan Gin atau Chi. Tapi untuk REST API SaaS dengan performa tinggi, Fiber adalah pilihan yang solid.

Error Handling di Fiber

Error handling yang konsisten adalah kunci untuk maintainable API. Saya biasanya buat custom error handler:

// Custom error handler
type APIError struct {
    Code    int    `json:"code"`
    Message string `json:"message"`
}

func ErrorHandler(c *fiber.Ctx, err error) error {
    code := fiber.StatusInternalServerError
    message := "Internal Server Error"

    if e, ok := err.(*APIError); ok {
        code = e.Code
        message = e.Message
    }

    return c.Status(code).JSON(fiber.Map{"error": message})
}

func main() {
    app := fiber.New(fiber.Config{
        ErrorHandler: ErrorHandler,
    })
}

Dengan approach ini, semua error di API Anda punya format yang konsisten. Frontend tinggal handle satu format response untuk semua error case. Clean dan predictable.

Request Validation dengan Go Playground Validator

Validasi input sangat penting untuk API yang robust. Fiber integrate dengan Go Playground Validator secara seamless:

type CreateUserRequest struct {
    Name  string `json:"name" validate:"required,min=2,max=100"`
    Email string `json:"email" validate:"required,email"`
    Age   int    `json:"age" validate:"gte=13,lte=120"`
}

func CreateUser(c *fiber.Ctx) error {
    req := new(CreateUserRequest)
    if err := c.BodyParser(req); err != nil {
        return c.Status(400).JSON(fiber.Map{"error": "invalid request body"})
    }
    if err := validator.Struct(req); err != nil {
        return c.Status(400).JSON(fiber.Map{"error": err.Error()})
    }
    // proceed with valid data
}
← More articles from Cecep Azhar Central Content Hub Home →