使用 TypeScript 迁移 NestJS 微服务到 Go:一周的发现-Golang

首页 2024-07-09 22:23:17

使用 TypeScript 迁移 NestJS 微服务到 Go:一周的发现

上周,我沉浸在其中 Go 在这个世界上,目的是让我们在那里 NestJS 中开发的微服务迁移到 TypeScript。这段旅程是一项强有力的练习,旨在忘记某些范式,并使用其他范式来了解两种生态系统开发之间的根本区别。

我们在 NestJS 中的架构

在 NestJS 在堆栈中,我们的管理是相连的 PostgreSQL 和 Redis 数据库的微服务。在微服务之间实施各种通信策略:

  1. 通过事件通信:我们使用 Pub/Sub 订阅和主题允许微服务之间的异步通信。
  2. 前端后端(BFF):我们实现受 JWT 保护的 REST API,作为前端和数据库之间的中介。
验证和迁移

DTO 验证和数据迁移在我们的系统中非常重要。 TypeScript 允许我们使用 Knex 和 TypeORM 定义严格的类型和结构来处理迁移。这种方法虽然有效,但需要深入了解语言以及如何跨越不同微服务的数据流。

NestJS 的挑战

我们检测到事件循环我们使用影响性能的问题 Clinic.js 图书馆解决了这些问题。我们确定了瓶颈,优化了设计模式、异步和等待的使用。然而,管理 Node.js 并发可能非常复杂,并占用大量资源。

进入Go

在探索 Go 当我们遇到范式转换和一系列显著差异时:

  1. 静态类型的编译和编译:与TypeScript不同,Go是一种强静态编译语言,迫使我们在编译过程中检测错误。
  2. 控制流和错误处理:Go 简化错误处理是通过明确注意返回错误而不是异常来简化的。
  3. 数据结构和内存:Go 内存分配和数据结构管理需要对硬件有更深入的了解 JavaScript 不同的做法更抽象。
面向对象编程和接口

在Go中,虽然它支持面向对象,但它的性能是不同的。没有传统的继承和界面的使用,它提供了独特的灵活性,必须完全理解才能充分利用它。

比较例 数据验证
  • NestJS:我们在 DTO 使用装饰进行验证。

    从 'class-validator' 导入 { IsString, IsInt } ;
    
    类 CreateUserDto {
        @IsString()
        名称:字符串;
    
        @IsInt()
        年龄:数字;
    }
    
  • Go:我们使用 go-playground/validator 等库验证。

    导入(
        “gopkg.in/go-playground/validator.v9”
    )
    
    类型用户结构{
        名称字符串`验证:“必要”`
        年龄 int `验证:"gte=0"`
    }
    
    验证 := 验证器.New()
    user := &User{姓名:“Alice”,年龄:25}
    err := validate.Struct(用户)
    
异步通信
  • NestJS:使用 async/await 处理 Promise。

    异步函数 fetchData(): Promise<void> {
        const 数据 = 等待 apiCall();
        控制台.log(数据);
    }
    
  • Go:使用 goroutine 与通道并发。

    func fetchData() {
        dataChan := make(chan 字符串)
        去函数(){
            dataChan <- apiCall()
        }()
        数据 := <-dataChan
        fmt.Println(数据)
    }
    
工具和设置

在 Go 中间,我们采用了 Gin 等工具用于 REST API,以及 Gorm 作为 ORM。在 VSCode 中使用 make 为保持生产力和适应这一新的工作流程,设置我们的环境自动化任务至关重要。

最后的想法

从带有 TypeScript 的 NestJS 迁移到 Go 充满挑战,但也很有回报。虽然 NestJS 在快速 API 开发提供了丰富的经验,重点是重用和抽象,但 Go 它为我们提供了更精细的并发性和性能控制,这对于高度可扩展的应用程序至关重要。

尽管我们面临挑战,但我们继续测试和调整我们的工作流程,但我们对此表示挑战 Go 兴奋地为我们的未来提供微服务的可能性。

我希望这个博客能为那些考虑类似变化的人提供指导和灵感。你在技术迁移方面有什么经验?你一路上发现了什么挑战和解决方案?

分享你的故事,让我们继续一起学习!

以上就是使用 TypeScript 迁移 NestJS 微服务到 Go:详情请关注一周内发现的其他相关文章!


p