Création d’un nouveau microservice

Points à évaluer avant de créer son microservice

  1. À quel niveau s’intégrera mon microservice dans l’architecture de l’application Zéphir ?
  2. Quelles seront les dépendances fonctionnelles de mon microservice ?
  3. Mon microservice sera t-il amené à fonctionner en mode multi-instances ?

Créer l’arborescence du microservice

Un script d’aide a été créé afin de faciliter la mise en place de nouveaux microservices:

./script/new-service <nom_du_service>

Si aucun service utilisant ce nom n’existe, le répertoire services/<nom_microservice> sera créé avec son Dockerfile.

Le fichier de l’ordonnanceur consul

Dans le répertoire cible, un fichier containerpilot.json5 est créé. Ce fichier est utilisé par Consul

Partage de fichiers entre les microservices

Certains microservices seront amenés à utiliser des fichiers communs (par exemple des scripts d’attente de disponibilité d’autres services). Le répertoire services/common est dédié à accueillir ces fichiers.

L’utilisation de ce répertoire nécessite la modification du fichier docker-compose.dev.yml et la modification des chemins dans le fichier Dockerfile. Voir la section services.api-bridge.build du fichier docker-compose.dev.yml pour un exemple.

Gestion des erreurs dans un microservice (Python)

Les erreurs prévues sont à documenter dans la fiche de chaque message (Exemple : exec.salt)

La librairie Autobahn-python permet de remonter les erreurs au format Wamp. On peut soit

  • importer un type d’erreur prédéfini dans la librairie :

    from autobahn.wamp.exception import ApplicationError
    ....
    raise ApplicationError(u"my.uri", arg1, arg2, .. , kwarg1=value1, kwarg2=value2, ...)
    
  • soit créer une exception personnalisée et la mapper dans autobahn:

    @wamp.error(u"my.uri2") # détermine l'uri de l'exception
    class AppError1(Exception):
        """
        An application specific exception that is decorated with a WAMP URI,
        and hence can be automapped by Autobahn.
        """
    ...
    # défini et mappe automatiquement l'exception
    self.define(AppError1)
    ...
    raise AppError1(...)
    

Dans les deux cas, le fait de lever une de ces exceptions renverra automatiquement un message d’erreur au format Wamp.