S

super-dev — full-stack

@super-dev.app · Full-stack · ★ ouvert aux missions
12,8k abonnés·47 vidéos·Actif depuis 2017

Développeur full-stack .NET / Angular avec une casquette DevOps sur Azure Cloud. Aussi à l'aise sur Flutter + Firebase. Je construis des produits, je les déploie, je les surveille.

Retour aux articles
{ }
.NET
.NET

Étrangler un monolithe .NET 8 sans tout casser

Article 1 sur 5 — Le .NET moderne
APIs minimales, CQRS, gRPC, source generators : du .NET 8 net et testable, sans usine à gaz.

On hérite rarement d'un greenfield . Le plus souvent, c'est un monolithe .NET qui tourne en prod depuis huit ans, que personne n'ose toucher. Le pattern Strangler Fig permet de le remplacer morceau par morceau , sans big-bang et sans fenêtre de coupure.

Le principe

On place une façade devant le monolithe, puis on réachemine une route à la fois vers un nouveau service. Tant qu'une fonctionnalité n'est pas réécrite, elle continue de passer par l'ancien code. Le jour où la dernière route bascule, le monolithe est mort — étranglé.

Une anti-corruption layer

Le nouveau code ne doit jamais parler le langage du legacy. On interpose une anti-corruption layer qui traduit les modèles de l'ancien monde vers le nouveau :

C#
1public sealed class LegacyOrderTranslator
2{
3 public Order ToDomain(LegacyOrderDto dto) => new(
4 Id: new OrderId(dto.ORDER_ID),
5 Total: Money.FromCents(dto.TOTAL_CENTS),
6 PlacedAt: DateTime.SpecifyKind(dto.DT, DateTimeKind.Utc));
7}

Router au bon niveau

La bascule se fait idéalement au niveau du reverse proxy (YARP, Nginx) plutôt que dans le code, pour garder les deux mondes parfaitement isolés. Avec YARP , une simple route de configuration suffit à dévier un chemin vers le nouveau service.

  • une route migrée → nouveau service
  • une route non migrée → monolithe
  • un canary → 5 % du trafic, puis 100 %

Mesurer avant de couper

Chaque route migrée est doublée d'un shadow traffic comparé à l'ancienne réponse avant de couper pour de bon. On ne supprime l'ancien code que mort prouvé : tant qu'un appel y transite encore, il reste. La télémétrie devient alors le juge de paix de la migration.

Étrangler, ce n'est pas réécrire plus vite. C'est réécrire de façon réversible : à chaque étape, on peut revenir en arrière en une ligne de configuration.
super-dev — portfolio.app
// Continuer dans .NET
ƒ()
Minimal APIs + EF Core : une API .NET 8 propre
8 min • 3,1k lectures
CQRS et vertical slices sans usine à gaz
7 min • 2,3k lectures
gRPC entre microservices .NET
9 min • 1,8k lectures