ASF : prenons du recul !

Hello !

Pour conclure je vous propose de détailler maintenant les problématiques que nous avons résolus grâce à notre architecture.

6 2 - ASF : prenons du recul !

Au niveau du projet et du code .Net

  • Projet Visual Studio correctement découpé : « separation of concerns »
  • Temps d’exécution des builds bien plus rapide.
  • Montée en compétence plus rapide sur les projets
  • Moins de couplage entre les composants.

Au niveau de l’application

  • En cas de modification, on doit tester un service.
  • Déploiements plus facile et plus fréquent puisqu’ils sont réalisés sur un périmètre restreint
  • La mise à l’échelle est plus simple puisqu’il est facile grâce à ASF de provisionner une nouvelle instance de microservice.

Reprenons notre analyse FURPSE pour détailler les avantages de notre architecture :

7 - ASF : prenons du recul !

  • Fiabilité : Notre application est beaucoup plus légère, et la couche de services est résiliente grâce à l’autoscaling Azure Service Fabric.
  • Performance : Les temps de réponse sont équivalent mais la charge de calcul est répartis entre service dans le Cloud.
  • Maintenabilité : Le code est correctement découpé, il est donc bien plus facile à tester et debugger.
  • Evolutivité : En cas d’évolution sur un service, on doit redéployer ce service et non plus toute l’application. On peux effectuer une migration techniques / technologiques de façon plus simple sur un contexte réduit.

Nous avons donc répondu aux problématiques de notre existant et rendus notre application facilement déployable, testable, maintenable, évolutive et tolérante aux pannes.

15 1024x525 - ASF : prenons du recul !

Comment implémenter les appels à Azure Service Fabric ?

Pour la communication entre services nous avions listé deux possibilités :

  • Echange synchrone via commande HTTP
  • Échange asynchrone via un bus d’évènement basé sur le protocole AMQP.

Ici je vais expliquer la communication synchrone par appel HTTP. A mon sens pour démarrer sur cette architecture nous pouvons commencer par cette approche. Si par le suite le besoin est présent alors une utilisation d’Azure Service Bus peux être implémenter et déployer progressivement.

Voici une méthode permettant à notre application cliente d’appeler un service dans Service Fabric :

1 1 - Comment implémenter les appels à Azure Service Fabric ?

Il s’agit d’un appel d’une API REST tout à fait classique. Notre service est exposé via le port 82. Pour ce faire nous avons ouvert le port sur notre cluster lors de la création et configuré le port de notre service dans le fichier ServiceManifest.xml du projet : Verifier la section Resources/Endpoints du fichier.

Si un autre service de mon cluster Service Fabric doit réaliser le même appel, l’url sera la suivante : http://localhost:19081/OrangeTechsMicroservices/Clients/1. On remarque que l’appel se fait sur localhost (quel que soit l’environnement) et que le port utilisé est celui du reverse proxy Service Fabric.

Comme déjà évoqué, la complexité des appels HTTP est plutôt faible, nous verrons que l’utilisation de Service Bus pour effectuer des échanges asynchrones n’est pas aussi évidente et demande un peu plus de réflexion.

A bientôt !

Architecture d’un microservice

Pour le développement de nos services, qui seront des composants de cette architecture :

1 1 - Architecture d'un microservice

Une bonne pratique consistera à implémenter le pattern Repository. Notre application se décomposera en 3 couches :

  • Une couche Service qui expose les points d’entrée. Elle peux être également responsable de la gestion des exceptions, de l’authentification et des logs.
  • Une couche Business qui contient la logique fonctionnelle. Elle organise les context de connexion à la base (UnitOfWork) et appelle les repository pour effectuer des opérations sur la source de données.
  • Une couche Repository qui accède ou modifie les données.

Schéma d’architecture d’un service. Les flèches en rouge représente des appels non autorisés.

1 2 - Architecture d'un microservice

Chaque couche est séparée par des interfaces pour la mise en œuvre de l’injection de dépendance dans nos projets.

A noter que Asp .Net Core supporte nativement cette bonne pratique via la classe ServiceCollection.

Au niveau des framework et outils tiers nous pourrons utiliser, en vracs  :

  • Pour l’accès aux données : l’ORM Entity Framework Core.
  • Automapper : pour mapper facilement un objet entités avec un POCO ou DTO pour le transport des informations.
  • Swagger pour la présentation de nos API. Une valeur sure !
  • Postman pour les tests locaux de communication avec notre API.
  • Nuget qu’on ne présente plus pour le partage des interfaces et des objets.
  • Nunit + Un Framework de mocking tel que Moq ou Rhino Mock pour les tests unitaires.

J’en oublie surement mais j’ai cité les indispensables 🙂

A très vite pour la partie dev !

Azure Service Fabric : notre projet

Nous allons maintenant détailler la mise en œuvre concrète de la solution Azure Service Fabric introduit précédemment.

Notre système d’information de démonstration contient une application cœur de métier, utilisée par tous les employés du SI.

Cet applicatif « monolithique » adresse ainsi tous les métiers de l’entreprise :

  • Gestion client
  • Comptabilité
  • Commerce
  • RH
  • Fournisseur / Achat

Chaque employé à accès aux divers écrans en fonction de ces droits attribués par rapport à son rôle dans l’entreprise.

Un nouveau besoin pour un usage en mobilité conduit notre SI à une étude autour de son existant et une évaluation des possibilités d’amélioration.

Problématiques de l’existant

Les problématiques autour de cette application cœur de métier sont nombreuses :

Au niveau du projet et du code .Net, une base de code volumineuse apporte plusieurs problématiques :

  • Projet Visual Studio conséquent
  • Longueur des builds sur les postes de développement.
  • Difficulté à démarrer sur le projet pour un nouveau développeur
  • Couplage entre les modules de l’application : code spaghettis

Au niveau de l’application :

  • Problèmes de performances.
  • En cas de modification, il faut retester l’application dans son ensemble car les modules sont fortement couplé.
  • Cycle en V plutôt que méthode agile lié au coup de déploiement.
  • La mise à l’échelle implique de cloner toute l’application sur un nouveau serveur.

Pour détailler les problèmes de cet existant, nous pouvons utiliser l’approche FURPSE :

7 - Azure Service Fabric : notre projet

  • Utilisabilité : L’application est pollué par des lenteurs excessive.
  • Fiabilité : En cas de défaillance d’un composant, l’application crashe totalement. L’utilisateur doit alors relancer toute l’application.
  • Performance : Lenteur de l’application, au démarrage et lors de la navigation du aux trop nombreuses dépendances. Consommation de ressources CPU/RAM importante.
  • Maintenabilité : En cas d’erreur, difficulté d’analyse.
  • Evolutivité : Les évolutions sont couteuses à mettre en place car elles impliquent beaucoup d’analyse d’impact et de tests de la part des développeurs.
Conceptions

Le but de ce chapitre est de présenter comment bâtir une architecture microservices à partir de notre existant. Ce que nous voulons obtenir c’est une application de présentation, la plus légère possible et qui ne contient aucune logique fonctionnelle et une couche de service déployé dans Azure Service Fabric.

Celui-ci contient des services regroupés par domaine fonctionnels :

  • Clients
  • Comptabilités
  • Documents

A noter que certains services n’ayant pas besoin d’être forcément scalable (car peu utilisé) peuvent être déployé dans des WebApp plus classique par soucis de simplicité.

Une fois la logique fonctionnelle extraite de notre application, il sera bien plus facile :

  • De faire évoluer nos services.
  • D’ajouter une nouvelle application cliente.
  • De tester et déployer nos services.
  • De les rendre résilient aux pannes et adaptable à la charge.

Nous allons présenter différentes possibilités pour mettre en œuvre notre architectures microservices en gardant à l’esprit nos besoins. Nous souhaitons :

  • Des services au contexte délimité.
  • Un couplage faible entre composants.
  • Testables facilement et automatiquement.
  • Déployable automatiquement.

Proposition 1 : Un monolithe organisé :6 - Azure Service Fabric : notre projet

Ce découpage ne convient pas à nos besoins pour des raisons évidente.

Proposition 2 : Un monolithe et des services :5 - Azure Service Fabric : notre projet

Proposition 3 : Un monolithe distribué. Les services sont dupliqués manuellement pour répondre à la charge :4 - Azure Service Fabric : notre projet

Le risque de cette dernière proposition est de vite se retrouver à gérer :3 - Azure Service Fabric : notre projet

Proposition 5 : Une architecture microservice avec Azure Service Fabric :

2 - Azure Service Fabric : notre projet

Proposition retenue : Si le besoin d’ouvrir notre SI à des clients externe est présent nous pourrons facilement le mettre en œuvre grace à Azure API Management :1 - Azure Service Fabric : notre projet

Prochaine étape : la création de notre cluster Service Fabric !

Microservices et Azure Service Fabric

Après ces trois derniers articles :

Nous pouvons conclure qu’Azure Service Fabric propose une solution clé en main pour la conception d’une architecture microservices dans Azure car il offre des réponses aux différentes problématiques de mise en œuvre de microservices.

6 2 - Microservices et Azure Service Fabric

Grâce à cette offre PAAS, les développeurs ont à leur disposition :

  • Un Framework de développement en .Net et des templates de projet pour VS2017
  • Une solution CI/CD compatible avec VSTS depuis peu renommé Azure DevOps 🙂

ArticleVsts Alm - Microservices et Azure Service Fabric

  • Une offre PAAS pour l’intégration de la solution dans le cloud Azure. Cette offre PAAS garantis :
  • Scalabilité de nos services.
  • Découvrabilité via le Reverse Proxy.

6 3 - Microservices et Azure Service Fabric

  • Intégration avec API Management pour les appels clients.

3 3 - Microservices et Azure Service Fabric

  • Monitoring avec Application Insights.4 2 - Microservices et Azure Service Fabric
  • Communication avec Azure Service Bus pour les appels asynchrone.

De plus, un des avantages majeurs de cette solution à mon sens est que les développeurs retrouveront leur marque assez rapidement par rapport au développement d’API REST en ASP .Net Core.

net core logo proposal - Microservices et Azure Service Fabric

A contrario une solution comme Azure Container Service implique la montée en compétence sur :

  • La gestion des conteneurs avec Docker
  • Un orchestrateur de conteneur Docker tel que Kubernetes
  • La plateforme AKS en elle-même.

Maintenant que nous en avons terminé avec l’analyse de cette solution nous allons passer à la mise en oeuvre 🙂

Gérer les problèmes dans Service Fabric

Hello !

Suite à ce précédent article je vais aujourd’hui évoquer la gestion des erreurs et la tolérance aux pannes.

Cet article est une “réponse” aux questions soulevées ici !

Gestion des logs et monitoring

Le monitoring et la gestion des logs sont intégrés a Azure Service Fabric grâce à deux composants Azure :

  • Windows Application Diagnostics
  • Application Insights

Ces deux modules doivent être activés à la création du cluster Azure Service Fabric et configuré dans la solution Visual Studio.

1 2 - Gérer les problèmes dans Service Fabric

WAD permet de :

  • Détecter et diagnostiquer les problèmes d’infrastructure
  • Détecter les problèmes liés à votre application
  • Comprendre la consommation des ressources
  • Faire le suivi du niveau de performance des applications, des services et de l’infrastructure

Pour cela WAD collecte des « journaux » :

  • Evènements de la plateforme ASF
  • Intégrité et charge des clusters
  • Monitoring et utilisation du Reverse proxy
  • Compteur de performance
  • Evènement des applications

Application Insights quant à lui permet de :

AI nous offre également un langage de requête, inspiré de LinQ (Analytics pour Application Insights) pour extraire les données qui nous intéresse et les présenter sous forme de graphiques par exemple.

2 2 - Gérer les problèmes dans Service Fabric

3 2 - Gérer les problèmes dans Service Fabric

4 2 - Gérer les problèmes dans Service Fabric

5 2 - Gérer les problèmes dans Service Fabric

Insight analyse :

  • Les exceptions dans un services :6 2 - Gérer les problèmes dans Service Fabric
  • Consultations de pages et performances de chargement.
  • Nombre de sessions et d’utilisateurs.
  • Les appels services, temps de réponse et taux d’échec.
  • Compteurs de performances des serveurs Windows ou Linux, par exemple le processeur, la mémoire et l’utilisation du réseau.
  • Diagnostics d’hébergement Azure.
  • Journaux de suivi des diagnostics des applications : pour pouvoir mettre en corrélation les événements de suivi avec les demandes.
  • Mesures et événements personnalisés (à implémenter dans le code source)
  • Permet d’envoyer des alertes en cas de télémétrie anormale :7 2 - Gérer les problèmes dans Service Fabric

Insight est un outil complet et très puissant que nous aurions tort de ne pas utiliser avec Service Fabric de même qu’avec une Web App d’ailleurs 🙂

Gestion des pannes et résilience

Dans cet article nous avions identifié ces besoins :

  • Détecter quand un service est off pour que le client ne tente pas de le joindre inutilement.
  • Auto guérison des services : le cloud favorise la gestion de ce besoin par la mise en œuvre de :
  • Scalabilité horizontale : duplication automatique des composants logiciels.
  • Scalabilité verticale : augmentation de la puissance de la plateforme hôte (CPU / RAM / espace disque).

Azure Service Fabric répond à ce besoin car la plateforme tente d’apporter la plus grande fiabilité possible à notre application en nous proposant nativement :

  • Scalabilité automatique suivant des règles de charge
  • Load balancer pour répartir la charge
  • Redémarrage des services automatique
  • Outils de monitoring et de diagnostics pour analyser les problèmes

Mais nous détaillerons ces points précisément lors de la mise en oeuvre concrète de cette solution PAAS !