Ludovic Couveignes

Architecture Microservice

ludovic couveignes devnet article microservice Développeur Microsoft

Introduction

L’architecture microservices est une méthode de développement logiciel qui divise une application en plusieurs services indépendants. Cette approche facilite la maintenance, la scalabilité et le déploiement d’applications complexes. Dans cet article, nous allons explorer le développement d’une API en utilisant C#, avec des exemples de code concrets.

 

Compréhension des Microservices

Les microservices reposent sur plusieurs principes clés :

  • Indépendance : Chaque service fonctionne de manière autonome et peut être développé et déployé séparément.
  • Intercommunication : Les services communiquent entre eux via des API, généralement en utilisant HTTP/REST.
  • Scalabilité : Les services peuvent être mis à l’échelle individuellement, en fonction de la demande.

 

Conception de l’API

 

Définir les Services

Prenons l’exemple d’une application de gestion de bibliothèque. Nous pourrions avoir les services suivants :

  • Service de gestion des livres
  • Service de gestion des utilisateurs
  • Service de gestion des emprunts
ludovic couveignes devnet schema Développeur Microsoft

Explications :

  • API Gateway : Point d’entrée unique pour toutes les requêtes externes. Il redirige les demandes vers les services appropriés.

  • Books Service : Microservice responsable de la gestion des livres (ajout, mise à jour, suppression, etc.).

  • Users Service : Microservice qui gère les utilisateurs (inscription, authentification, etc.).

  • Loans Service : Microservice chargé de la gestion des emprunts de livres.

  • Databases : Chaque service possède sa propre base de données, ce qui garantit l’indépendance et la flexibilité des services.

Comment utiliser ce schéma ?

  1. API Gateway : En tant que point d’entrée, il permet de gérer la sécurité, le routage, et peut implémenter des fonctionnalités comme la limitation de débit.

  2. Microservices : Chaque service est responsable de ses propres données et logique métier. Cela permet une évolution indépendante et un développement agile.

  3. Bases de données : Les bases de données peuvent être choisies en fonction des besoins spécifiques de chaque service (SQL, NoSQL, etc.).

Ce schéma fournit une vue d’ensemble de l’architecture microservices et de la manière dont les différents composants interagissent.

Modélisation des Données

Pour le service de gestion des livres, nous allons définir un modèle simple :

				
					public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public bool IsAvailable { get; set; }
}
				
			

 

Choix des Technologies

Pour construire notre API en microservices avec C#, nous utiliserons :

  • Framework : ASP.NET Core
  • Base de données : Entity Framework Core pour la gestion des données

 

Développement de l’API

 

Création des Endpoints

Nous allons créer un contrôleur pour gérer les requêtes liées aux livres. Voici un exemple de contrôleur :

				
					using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

[ApiController]
[Route("api/[controller]")]
public class BooksController : ControllerBase
{
    private readonly BookDbContext _context;

    public BooksController(BookDbContext context)
    {
        _context = context;
    }

    // GET: api/books
    [HttpGet]
    public async Task<ActionResult<IEnumerable<Book>>> GetBooks()
    {
        return await _context.Books.ToListAsync();
    }

    // GET: api/books/{id}
    [HttpGet("{id}")]
    public async Task<ActionResult<Book>> GetBook(int id)
    {
        var book = await _context.Books.FindAsync(id);
        if (book == null)
        {
            return NotFound(new { Message = "Book not found" });
        }
        return book;
    }

    // POST: api/books
    [HttpPost]
    public async Task<ActionResult<Book>> PostBook(Book book)
    {
        _context.Books.Add(book);
        await _context.SaveChangesAsync();
        return CreatedAtAction(nameof(GetBook), new { id = book.Id }, book);
    }
}

				
			

 

Gestion des Erreurs

Assurez-vous de gérer les erreurs correctement. Par exemple, dans la méthode GetBook, si le livre n’est pas trouvé, nous retournons une réponse appropriée :

				
					[HttpGet("{id}")]
public async Task<ActionResult<Book>> GetBook(int id)
{
    var book = await _context.Books.FindAsync(id);
    if (book == null)
    {
        return NotFound(new { Message = "Book not found" });
    }
    return book;
}

				
			

 

Sécurité

Pour sécuriser notre API, nous allons utiliser l’authentification JWT. Voici comment configurer cela dans Startup.cs :

				
					public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BookDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                Issuer = Configuration["Jwt:Issuer"],
                Audience = Configuration["Jwt:Audience"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
            };
        });

    services.AddControllers();
}

				
			

 

Déploiement et Orchestration

 

Conteneurisation

Pour conteneuriser votre application, créez un Dockerfile :

				
					FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MyLibrary/MyLibrary.csproj", "MyLibrary/"]
RUN dotnet restore "MyLibrary/MyLibrary.csproj"
COPY . .
WORKDIR "/src/MyLibrary"
RUN dotnet build "MyLibrary.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyLibrary.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyLibrary.dll"]

				
			

 

Orchestration

Pour orchestrer vos conteneurs, utilisez Kubernetes. Voici un exemple de fichier de déploiement deployment.yaml :

				
					apiVersion: apps/v1
kind: Deployment
metadata:
  name: books-api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: books-api
  template:
    metadata:
      labels:
        app: books-api
    spec:
      containers:
      - name: books-api
        image: mylibrary:latest
        ports:
        - containerPort: 80

				
			

 

Surveillance et Maintenance

Pour surveiller vos microservices, utilisez des outils comme Prometheus et Grafana. Ces outils permettent de collecter des métriques et d’analyser la performance de votre application.

 

Synthèse

Développer une API en utilisant l’architecture microservices avec C# offre de nombreux avantages en termes de flexibilité et de scalabilité. Grâce aux exemples de code fournis, vous avez maintenant une base solide pour construire vos propres microservices. N’oubliez pas d’intégrer la sécurité et la surveillance pour garantir une expérience utilisateur optimale.

Partagez

Autres articles