Depuis Go 1.22, la bibliothèque standard offre une meilleure prise en charge du routage
- Auparavant, il fallait gérer le routage manuellement, mais il est désormais possible de le faire simplement avec
mux.HandleFunc
- Il est possible d’ajouter un middleware de connexion pour renforcer la sécurité
Point d’attention avec le routeur intégré : les redirections dues au slash final
- Si l’on crée la route
/records/, une requête vers /records sera redirigée vers /records/
- Cela peut poser un problème : le corps d’une requête POST peut être supprimé et la requête transformée en GET
- La solution consiste à utiliser des endpoints d’API comme
POST /records plutôt que POST /records/
Génération automatique du code de requêtes SQL avec sqlc
- Découverte de l’outil sqlc, qui permet d’écrire des requêtes SQL sans avoir à apprendre un ORM
- Une fois les requêtes SQL écrites, elles sont automatiquement converties en code Go
- Il devient ainsi facile d’écrire les requêtes SQL nécessaires sans devoir consulter la documentation d’un ORM
Conseils d’optimisation pour sqlite
- Utiliser un objet dédié à l’écriture pour la base de données et définir
db.SetMaxOpenConns(1)
- Pour accélérer la lecture, utiliser des objets DB distincts pour l’écriture et la lecture
- Deux tables qui n’ont pas besoin de JOIN peuvent être placées dans des bases de données séparées et connectées indépendamment
Définir une limite mémoire pour le GC de Go 1.19
- En exécutant tous les projets Go sur une VM disposant d’une quantité de mémoire relativement faible, comme 256MB ou 512MB, l’application se faisait régulièrement tuer par des erreurs OOM
- À cause de la configuration par défaut du garbage collector, l’allocation mémoire peut monter jusqu’à deux fois la taille actuelle du heap
- Go 1.19 a ajouté un moyen d’indiquer à l’application de lancer le GC lorsqu’un certain niveau d’utilisation mémoire est atteint
- Après avoir défini la limite mémoire du GC à 250MB, la fréquence des arrêts OOM a diminué
export GOMEMLIMIT=250MiB
Pourquoi créer un site web avec Go
- Le déploiement est simple grâce à un binaire statique unique
- Un serveur web intégré utilisable en production est fourni, sans avoir besoin de configurer WSGI ou autre
- La toolchain de Go est simple à installer et à utiliser
- Envoyer des réponses HTTP est simple, ce qui facilite la maintenance des projets
- La bibliothèque standard inclut
net/http, ce qui permet de créer un site web sans installer de bibliothèques supplémentaires
- Il est aussi facile d’effectuer des tâches au niveau système
- Tout semble conçu pour rendre les projets faciles à manipuler
Problèmes qui ne sont pas encore résolus
- Certaines choses n’ont pas encore été beaucoup pratiquées en Go
- Le rendu de templates HTML
- L’implémentation d’un véritable système de connexion
- La mise en place de la protection CSRF
- De manière générale, comme il n’est pas encore très clair comment implémenter des fonctionnalités sensibles du point de vue de la sécurité, les projets nécessitant connexion/CSRF ne sont pas commencés
C’est agréable de voir les nouvelles fonctionnalités de Go
- Les deux fonctionnalités de Go mentionnées dans ce texte (
GOMEMLIMIT et le routage) ont été ajoutées au cours des dernières années
- Il faudrait sans doute prêter davantage attention aux release notes des nouvelles versions de Go
2 commentaires
sqlc, c’est vraiment excellent.Avis Hacker News
embedne soit pas mentionné dans l’article sur le développement web en GoContextà la boucle de transaction pour permettre l’annulationsqlca quelques limitations majeures et de petits désagréments, il vaut donc mieux consulter la liste des issues avant de l’utiliserGOMAXPROCSpour éviter le throttling CPUGOMEMLIMITpermet de moins se soucier du GChtml/templateest étrange et présente de nombreux problèmes, il vaut donc mieux l’éviterTemplest préféré à la placemuxdepuis longtemps, sans avoir prêté attention aux nouvelles fonctionnalités des dernières versionsnilcomplique même les tâches simplesBEGIN CONCURRENTpeut être utilisé pour améliorer la concurrence