首页 > 后端开发 > Golang > 使用 TypeScript 迁移 NestJS 微服务到 Go:一周的发现

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

WBOY
发布: 2024-07-17 21:01:05
原创
812 人浏览过

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

使用 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 中使用装饰器进行验证。

    import { IsString, IsInt } from 'class-validator';
    
    class CreateUserDto {
        @IsString()
        name: string;
    
        @IsInt()
        age: number;
    }
    
    登录后复制
  • Go:我们使用 go-playground/validator 等库进行验证。

    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)
    
    登录后复制

异步通信

  • NestJS:使用 async/await 处理 Promise。

    async function fetchData(): Promise<void> {
        const data = await apiCall();
        console.log(data);
    }
    
    登录后复制
  • Go:使用 goroutine 和通道实现并发。

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

工具和设置

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

最后的想法

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

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


我希望这个博客能为那些考虑类似转变的人提供指导和启发。您在技术迁移方面有哪些经验?在此过程中您发现了哪些挑战和解决方案?

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

以上是使用 TypeScript 迁移 NestJS 微服务到 Go:一周的发现的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板