Développement d'applications web performantes avec le micro-framework DotWeb en Go

DotWeb est un micro-framework web léger pour le langage Go, conçu pour faciliter et accélérer le développement d'applications web et d'API. Il se distingue par son architecture intuitive, ses performances élevées et son ensemble complet de fonctionnalités intégrées, telles que le routage, les middlewares, la gestion des sessions et la journalisation.

Installation et initialisation

Pour intégrer DotWeb à votre projet, assurez-vous d'utiliser Go 1.24 ou une version ultérieure avec le support des Go Modules. L'installation s'effectue via la commande suivante :

go get github.com/devfeel/dotweb

Voici comment initialiser un serveur web basique. Nous allons configurer un point d'entrée simple qui répond aux requêtes HTTP.

package main

import (
    "log"
    "github.com/devfeel/dotweb"
)

func main() {
    // Création de l'instance principale
    server := dotweb.New()
    
    // Configuration du répertoire des logs
    server.SetLogPath("./app_logs")
    
    // Définition d'une route fondamentale
    server.HttpServer.GET("/api/status", func(c dotweb.Context) error {
        return c.WriteString("Service opérationnel !")
    })
    
    // Lancement du serveur sur le port 8080
    log.Println("Démarrage du serveur sur le port 8080...")
    if err := server.StartServer(8080); err != nil {
        log.Fatalf("Erreur lors du démarrage : %v", err)
    }
}

Système de routage

Le routeur de DotWeb est optimisé pour la rapidité et prend en charge plusieurs modèles de correspondance d'URL.

Routes statiques et dynamiques

Les routes statiques correspondent à des chemins exacts, tandis que les routes dynamiques capturent des segments d'URL variables.

// Route statique
server.HttpServer.GET("/dashboard", func(c dotweb.Context) error {
    return c.WriteString("Tableau de bord principal")
})

// Route dynamique avec paramètre
server.HttpServer.GET("/items/:itemId", func(c dotweb.Context) error {
    identifier := c.GetRouterName("itemId")
    return c.WriteString("Détails de l'article : " + identifier)
})

Groupement de routes

Pour organiser les endpoints, il est possible de regrouper les routes sous un préfixe commun, ce qui simplifie également l'application de middlewares spécifiques.

apiV1 := server.HttpServer.Group("/api/v1")

apiV1.GET("/metrics", func(c dotweb.Context) error {
    return c.WriteString("Métriques système")
})

apiV1.GET("/health", func(c dotweb.Context) error {
    return c.WriteString("Statut de santé : OK")
})

Middleware et interception des requêtes

Les middlewares permettent d'intercepter le cycle de vie d'une requête. Ils peuvent être appliqués de manière globale, à un groupe de routes ou à une route unique. Voici un exemple de middleware qui calcule le temps de traitement d'une requête :

import "time"

type PerformanceMonitor struct {
    dotweb.BaseMiddlware
}

func (pm *PerformanceMonitor) Handle(c dotweb.Context) error {
    startTime := time.Now()
    
    // Exécution du handler suivant
    err := pm.Next(c)
    
    duration := time.Since(startTime)
    log.Printf("Requête %s traitée en %v", c.Request.RequestURI, duration)
    
    return err
}

// Enregistrement global du middleware
server.Use(&PerformanceMonitor{})

Liaison de données (Data Binding)

DotWeb simplifie l'extraction et la validation des données entrantes en les mappant directement sur des structures Go. Cette fonctionnalité supporte les charges utiles JSON, XML et les formulaires URL.

type ProductPayload struct {
    Title string  `json:"title" form:"title"`
    Price float64 `json:"price" form:"price"`
    Stock int     `json:"stock" form:"stock"`
}

server.HttpServer.POST("/products", func(c dotweb.Context) error {
    var payload ProductPayload
    
    // Liaison automatique des données
    if bindErr := c.Bind(&payload); bindErr != nil {
        return c.WriteJson(map[string]string{"error": bindErr.Error()})
    }
    
    // Traitement et réponse
    return c.WriteJson(map[string]interface{}{
        "message": "Produit créé avec succès",
        "data":    payload,
    })
})

Fonctionnalités avancées

Gestion des sessions

Le framework inclut un gestionnaire de sessions natif. Il peut être configuré pour utiliser un stockage en mémoire pour le développement ou Redis pour les environnements de production distribués.

// Activation des sessions
server.HttpServer.EnabledSession = true

// Configuration pour utiliser Redis
server.HttpServer.SessionConfig.StoreType = "redis"
server.HttpServer.SessionConfig.RedisConfig.Addr = "localhost:6379"
server.HttpServer.SessionConfig.RedisConfig.Password = "secret_password"

Service de fichiers statiques

La distribution de ressources statiques (CSS, JS, images) se configure en une seule ligne, avec la possibilité d'activre l'exploration de répertoires si nécessaire.

// Servir le contenu du dossier 'assets' sous l'URL '/public'
server.HttpServer.Static("/public", "./assets")
server.HttpServer.EnabledListDir = false // Désactivé pour des raisons de sécurité

Optimisation et déploiement

Pour tirer le meilleur parti de DotWeb en production, il est recommandé d'appliquer les configurations suivantes :

  • Mode production : Activez le mode production via server.SetProductionMode() pour désactiver les fonctionnalités de débogage et optimiser les performances.
  • Compression Gzip : Intégrez le middleware Gzip officiel pour réduire la taille des réponses HTTP et diminuer la latence réseau.
  • Journalisation structurée : Ajustez le niveau de log pour éviter les opérations d'écriture disque excessives qui pourraient bloquer les goroutines.
  • Limitation des middlewares : N'appliquez que les middlewares strictement nécessaires à chaque route pour minimiser la surcharge du pipeline de requêtes.

Étiquettes: Go dotweb web-framework microframework routing

Publié le 17 juin à 17h01