Il existe de nombreux documents sur la façon d'écrire des services, où vous devez d'abord choisir un cadre à utiliser, puis vient le câblage des gestionnaires, des configurations, des journaux, du stockage, etc., sans parler du déploiement de ce service quelque part. Nous écrivons des services depuis un certain temps et le plus souvent, vous voudriez simplement ignorer tout ce processus fastidieux de collage d'éléments et simplement écrire du code utile.
C'est pourquoi nous avons créé un outil, appelé Mify - c'est un générateur de passe-partout d'infrastructure open source, qui vous aiderait à créer un service, en prenant les meilleures pratiques utilisées à ce jour. Ainsi, dans ce didacticiel, nous montrerons comment créer un service simple à l'aide de Mify avec un exemple classique - une application de tâches.
Obtenez Mify depuis notre GitHub : https://github.com/mify-io/mify
Installez Postman ou curl pour tester les terminaux
Avant de commencer ce tutoriel, voici le lien vers l'exemple complet : https://github.com/mify-io/todo-app-example
Après avoir installé Mify, pour démarrer le projet, vous devez créer l'espace de travail :
$ mify init todo-app $ cd todo-app
Après être entré dans le nouvel espace de travail, exécutez :
$ mify add service todo-backend
Maintenant, cela créera un modèle Go pour votre backend de tâches. Voici une arborescence simplifiée de l'espace de travail avec tous les fichiers générés :
. ├── go-services │ ├── cmd │ │ ├── dev-runner │ │ │ └── main.go │ │ └── todo-backend │ │ ├── Dockerfile │ │ └── main.go │ ├── go.mod │ ├── go.sum │ └── internal │ ├── pkg │ │ └── generated │ │ ├── configs │ │ │ └── ... │ │ ├── consul │ │ │ └── ... │ │ ├── logs │ │ │ └── ... │ │ └── metrics │ │ └── ... │ └── todo-backend │ ├── app │ │ ├── request_extra.go │ │ ├── router │ │ │ └── router.go │ │ └── service_extra.go │ └── generated │ ├── api | | └── ... │ ├── app │ │ └── ... │ ├── apputil │ │ └── ... │ └── core │ └── ... ├── schemas │ └── todo-backend │ ├── api │ │ └── api.yaml │ └── service.mify.yaml └── workspace.mify.yaml
Mify suit vaguement l'une des dispositions Go courantes, qui convient à plusieurs services dans un référentiel. Dans internal/pkg/generated
il existe des bibliothèques communes pour les configurations, les journaux et les métriques qui peuvent être réutilisées pour plusieurs services. Votre répertoire de service se trouve dans internal/todo-backend
.
À ce stade, ce service est assez simple, nous devons donc lui ajouter une API.
Vous pouvez trouver le schéma OpenAPI pour le todo-backend dans le fichier schemas/todo-backend/api/api.yaml
. Le répertoire Schemas à la racine de l'espace de travail est un endroit où toutes les configurations de service liées à Mify sont stockées.
Créons une API CRUD simple pour votre backend todo :
POST /todos
pour ajouter de nouvelles notes de tâches.PUT,GET,DELETE /todos/{id}
pour les mettre à jour, les récupérer et les supprimer.
Voici à quoi ressemblerait votre schéma OpenAPI pour cette API :
https://gist.github.com/chebykinn/5dc7b30a2a57a1ab4584895131295e1f
Remplacez le schéma précédent par celui-ci et exécutez mify generate
. Vous pouvez l'exécuter chaque fois que vous mettez à jour le schéma et il régénérera tous les éléments modifiés.
$ cd go-services $ go mod tidy $ go run ./cmd/todo-backend
Vous devriez voir des journaux de démarrage comme celui-ci :
Vous pouvez voir le port de service dans le message starting api server
, le copier dans Postman et essayer d'appeler un gestionnaire d'API :
Vous pouvez voir que le gestionnaire n'a rien renvoyé, ce qui est attendu car, comme le suggère l'erreur, il n'est pas encore implémenté.
Tout d'abord, nous devons créer un modèle pour la todo note, nous le mettrons dans le package domain
dans go-services/internal/todo-backend/domain/todo.go
:
C'est également un bon endroit pour définir l'interface de stockage, ce qui est utile pour découpler la logique de persistance de l'application. Dans ce didacticiel, nous utiliserons un stockage fictif, en mémoire, mais Mify prend également en charge Postgres, que nous pourrons ajouter plus tard dans un article de suivi. Mettons le stockage dans go-services/internal/todo-backend/storage/todo_mem.go:
C'est tout pour la logique, nous avons juste besoin de l'ajouter aux gestionnaires.
go-services/internal/todo-backend/handlers/todos/service.go
pour la méthode POST, et
go-services/internal/todo-backend/handlers/todos/id/service.go
pour les autres.
Voici un exemple de stub de la méthode POST :
Maintenant, implémentons tous les gestionnaires.
go-services/internal/todo-backend/handlers/todos/service.go
:
N'oubliez pas de mettre à jour les importations :
import ( "net/http" "strconv" "example.com/namespace/todo-app/go-services/internal/todo-backend/domain" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/api" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/apputil" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/core" "example.com/namespace/todo-app/go-services/internal/todo-backend/handlers" )
go-services/internal/todo-backend/handlers/todos/id/service.go
:
Et voici les importations pour eux aussi :
import ( "errors" "fmt" "net/http" "strconv" "example.com/namespace/todo-app/go-services/internal/todo-backend/domain" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/api" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/apputil" "example.com/namespace/todo-app/go-services/internal/todo-backend/generated/core" "example.com/namespace/todo-app/go-services/internal/todo-backend/handlers" "example.com/namespace/todo-app/go-services/internal/todo-backend/storage" )
La logique du gestionnaire est assez simple, nous convertissons simplement les modèles OpenAPI générés vers notre application un et inversement, et pour éviter la duplication dans le code, voici une aide pour créer une réponse TodoNode, qui est utilisée dans ces implémentations :
go-services/internal/todo-backend/handlers/common.go
:
Tout d'abord, nous pouvons ajouter une nouvelle todo note avec une requête POST :
Vérifiez s'il est ajouté avec une requête GET :
Mettez-le à jour avec une requête PUT :
Supprime-le:
Et exécutez à nouveau GET pour vérifier s'il a été supprimé :
Stockage persistant, comme Postgres,
Configuration,
Intergiciel d'authentification,
Déploiement dans le cloud.
La plupart de ces choses sont couvertes dans nos documents, alors consultez-les : https://mify.io/docs , mais restez à l'écoute pour les prochains articles.
Également publié ici