Maison >développement back-end >Golang >Migration des microservices NestJS avec TypeScript to Go : une semaine de découvertes

Migration des microservices NestJS avec TypeScript to Go : une semaine de découvertes

WBOY
WBOYoriginal
2024-07-17 21:01:05781parcourir

Migrando Microservicios de NestJS con TypeScript a Go: Una Semana de Descubrimientos

Migration des microservices NestJS avec TypeScript to Go : une semaine de découvertes

La semaine dernière, je me suis plongé dans le monde de Go dans le but de migrer nos microservices développés en NestJS avec TypeScript. Ce voyage a été un exercice intense pour désapprendre certains paradigmes et en adopter d'autres, comprenant les différences fondamentales entre ces deux écosystèmes de développement.

Notre architecture dans NestJS

Dans notre stack avec NestJS, nous gérons des microservices connectés aux bases de données PostgreSQL et Redis. Nous mettons en œuvre diverses stratégies de communication entre microservices :

  1. Communication par événements : nous utilisons Pub/Sub pour les abonnements et les sujets qui permettent une communication asynchrone entre les microservices.
  2. Backend for Frontend (BFF) : Nous implémentons des API REST protégées par JWT, qui servent d'intermédiaires entre le frontend et la base de données.

Validations et migrations

La validation DTO et la migration des données sont cruciales dans notre système. TypeScript nous a permis de définir des types et des structures strictes avec Knex et TypeORM pour gérer les migrations. Bien qu'efficace, cette approche nécessite une compréhension approfondie du langage et de la manière de manipuler les flux de données sur différents microservices.

Défis avec NestJS

Nous avons détecté des problèmes de boucle d'événements qui affectaient les performances, que nous avons résolus à l'aide de la bibliothèque Clinic.js. Nous avons identifié les goulots d'étranglement et optimisé l'utilisation des modèles de conception ainsi que de l'async et de l'attente. Cependant, gérer la concurrence dans Node.js peut s'avérer complexe et coûteux en termes de ressources.

Se lancer dans Go

Lors de l'exploration de Go, nous rencontrons une transition de paradigme et une série de différences significatives :

  1. Compilation et typage statique : Contrairement à TypeScript, Go est un langage compilé avec un typage statique fort, ce qui nous oblige à détecter les erreurs au moment de la compilation.
  2. Flux de contrôle et gestion des erreurs : Go simplifie la gestion des erreurs en se concentrant explicitement sur le renvoi des erreurs, plutôt que sur les exceptions.
  3. Structure des données et mémoire : l'allocation de mémoire et la gestion de la structure des données dans Go nécessitent une compréhension plus approfondie du matériel, ce qui est différent de l'approche plus abstraite de JavaScript.

POO et interfaces

Dans Go, bien que l'orientation objet soit prise en charge, elle se manifeste différemment. L'absence d'héritage traditionnel et l'utilisation d'interfaces offrent une flexibilité distincte qui doit être bien comprise pour en tirer pleinement parti.

Exemples comparatifs

Validation des données

  • NestJS : Nous utilisons des décorateurs dans les DTO pour la validation.

    import { IsString, IsInt } from 'class-validator';
    
    class CreateUserDto {
        @IsString()
        name: string;
    
        @IsInt()
        age: number;
    }
    
  • Go : Nous utilisons des bibliothèques comme go-playground/validator pour la validation.

    import (
        "gopkg.in/go-playground/validator.v9"
    )
    
    type User struct {
        Name string `validate:"required"`
        Age  int    `validate:"gte=0"`
    }
    
    validate := validator.New()
    user := &User{Name: "Alice", Age: 25}
    err := validate.Struct(user)
    

Communication asynchrone

  • NestJS : Utilisation de async/await pour gérer les promesses.

    async function fetchData(): Promise<void> {
        const data = await apiCall();
        console.log(data);
    }
    
  • Go : utilisation de goroutines et de canaux pour la concurrence.

    func fetchData() {
        dataChan := make(chan string)
        go func() {
            dataChan <- apiCall()
        }()
        data := <-dataChan
        fmt.Println(data)
    }
    

Outils et paramètres

Dans Go, nous avons adopté des outils comme Gin pour les API REST et Gorm comme ORM. La configuration de notre environnement dans VSCode avec make pour automatiser les tâches a été cruciale pour maintenir la productivité et s'adapter à ce nouveau flux de travail.

Pensées finales

Migrer depuis NestJS avec TypeScript to Go a été un défi mais aussi une récompense. Alors que NestJS offre une riche expérience en matière de développement rapide d'API en mettant l'accent sur la réutilisation et l'abstraction, Go nous a donné un contrôle plus granulaire sur la simultanéité et les performances, essentiels pour les applications hautement évolutives.

Nous continuons d'expérimenter et d'ajuster nos flux de travail, et malgré les défis, nous sommes enthousiasmés par les possibilités qu'offre Go pour l'avenir de nos microservices.


J'espère que ce blog servira de guide et d'inspiration à ceux qui envisagent une transition similaire. Quelles expériences avez-vous eues en matière de migration technologique ? Quels défis et solutions avez-vous trouvés en cours de route ?

Partagez vos histoires et continuons à apprendre ensemble !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn