Conception d'un serveur de jeu de Mahjong cloud-native avec Golang et pratiques DevOps
Cet article détaille la mise en place d'un serveur de jeu de Mahjong production-ready en Golang, intégrant des pratiques DevOps, GitOps, Kubernetes, BPF et SRE. Nous explorerons la création du scaffolding, les concepts de base, et les flux de démarrage du serveur.
Introduction au projet
Il s'agit d'un projet complet qui met en œuvre les principes DevOps/GitOps et le déploiement sur Kubernetes. Le code source est basé sur le projet open-source Nanoserver, adapté pour le jeu de Mahjong. L'objectif est de fournir un guide pratique pour le développement backend en Golang, en mettant l'accent sur le partage de mémoire par communication.
Structure du scaffolding
Le scaffolding extrait de Nanoserver permet de comprendre rapidement l'archietcture du serveur de Mahjong. Nous commençons par une architecture monolithique pour saisir l'ensemble, puis évoluons vers un système distribué avec microservices.
Arborescence des fichiers
configuration/- Fichiers de configurationconfig.toml
database/- Gestion de la base de données avec XORMmodel/- Schémas de base de donnéesconstantes.go,logger.go,modele.go
interne/- Code interne au serveurjeu/- Logique du serveur de jeuchiffrement.go,gestion.go,manager.go
web/- Serveur web pour les APIserveur.go
bibliotheque/- Bibliothèques utilitaires partagéesoutilalgo/- Fonctions utilitaires couranteschiffrement/- Outils pour MD5, RSA, SHA1, etc.gestionerreurs/- Gestion centralisée des codes d'erreurlisteblanche/- Validation de liste blanche
protocole/- Définitions des protocoles de jeurequete.go
principal.go- Point d'entrée de l'application
Rappels fondamentaux sur Go Modules
Go Modules est le système de gestion des dépendances en Go. Il permet de gérer les packages tiers de manière reproductible. Voici les commandes de base :
go mod init # Initialise un nouveau module dans le répertoire courant
go mod tidy # Ajoute les dépendances manquantes et supprime les inutilisées
go mod download # Télécharge les modules dans le cache local
Pour plus d'informations, consultez l'aide intégrée avec go help mod.
Flux de démarrage du serveur Mahjong
Le serveur démarre à partir de principal.go. Voici les étapes clés :
Chargement de la configuration
Le fichier config.toml contient les paramètres essentiels : configuration de base, serveur web, serveur de jeu, base de données, liste blanche et mises à jour client.
Démarrage du serveur de jeu
La fonction jeu.Demarrage() initialise le serveur en plusieurs phases :
- Affichage des informations de version et paramètres critiques, comme l'intervalle de heartbeat.
- Configuration des fonctionnalités métier, par exemple les cartes de salle.
- Enregistrement des composants Nano pour la logique de jeu, incluant la gestion des joueurs, la création de tables, la reconnexion réseau, et la gestion des salles.
- Mise en place du pipeline de chiffrement pour les paquets de données avec des composants Inbound et Outbound.
- Lancement du serveur Nano avec options spécifiques : pipeline, heartbeat, logger, sérialiseur, et composants.
Démarrage du serveur web
La fonction web.Demarrage() configuer le serveur API :
- Initialisation de la base de données avec XORM, incluant la chaîne de connexion, l'affichage SQL, la gestion des connexions en idle et ouvertes, la synchronisation des schémas, et les canaux d'écriture asynchrone.
- Activation de la liste blanche pour le contrôle des accès.
- Enregistrement des points d'API pour l'authentification, les statistiques de joueurs, la gestion des rooms, les messages de diffusion, et les opérations administratives.
- Option d'utilisation de HTTPS avec
http.EcouterEtServirAvecTLS. - Implémentation d'un arrêt propre en écoutant les signaux système comme SIGINT et SIGTERM, avec une période de grâce pour les déploiements Kubernetes.
Développement local rapide
Démarrage de MySQL avec Docker Compose
Pour une base de données MySQL 5.7, utilisez le fichier docker-compose fourni :
docker-compose -f docker-compose.mysql.5.7.yaml up -d
docker-compose -f docker-compose.mysql.5.7.yaml down
Rechargement à chaud avec Air
Air est un outil pour le rechargement à chaud des appplications Go. Installez-le et exécutez depuis le répertoire du projet :
go install github.com/cosmtrek/air@latest
air
Cela permet des itérations rapides pendant le développement.
Débogage avec VSCode et Delve
Pour déboguer dans VSCode, installez l'extension Go et l'outil Delve via la palette de commandes. Configurez un point d'arrêt et lancez le débogage via le menu Exécuter > Lancer le débogage.