Nestjs框架: 微服务项目 monorepo 改造与共享协议优化指南

「手把手教学」Monorepo项目搭建与管理——实战案例 之前写了《》,今天我们搭建一个实战案例。 阅读详情

微服务项目 monorepo 改造与版本控制


为优化项目结构并支持后续扩展,对微服务项目进行 monorepo 改造:

1 ) 清理与初始化

  • 删除所有子项目中的 node_modules 和 log 文件。
  • 在项目根目录创建 pnpm-workspace.yaml 配置文件,声明工作空间:
    packages:
      - 'gateway'
      - 'user'
      - 'template'
    
  • 初始化 package.json 并复制 tsconfig.json 至各子项目。

2 ) Git 仓库管理

  • 执行 git init 初始化仓库,删除子项目(如 user 和 gateway)中的 .git 目录:
    rm -rf user/.git 
    rm -rf gateway/.git
    
  • 移除无关文件(如 vscode 客户端配置),保留核心文件(如 migration 脚本)
  • 初始化 Git 仓库并提交:git commit -m "feat: monorepo基础结构"

3 ) 共享协议层抽象

  • 创建 proto-pkg 包存放公共协议文件

  • 目录结构:

    proto-pkg/
    ├── proto/          # .proto 源文件 
    ├── scripts/        # 生成脚本 
    └── package.json    # 依赖声明 
    
  • 创建 proto-pkg 包存放公共协议文件(.proto):

    // proto-pkg/package.json
    {
      "name": "@private/proto-pkg",
      "scripts": {
        // "generate": "grpc_tools_node_protoc --ts_out=generated --proto_path=proto proto/*.proto" // 或下面的
        "generate": "protoc --ts_out=generated --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts"
      }
    }
    
  • 子项目(如 user 和 gateway)通过工作空间引入依赖:

    {
      "dependencies": {
        "@private/proto-pkg": "workspace:*"
      }
    }
    

4 ) 协议加载逻辑改造

  • 统一通过 proto-pkg 加载协议定义,替换原有的本地文件引用:

    // gateway/src/auth.service.ts
    import { loadProto } from '@private/proto-pkg';
    
    const packageDef = loadProto('user'); // 自动补全 .proto 后缀
    
  • 协议加载工具支持后缀自动补全:

    // proto-pkg/src/utils.ts 
    export const loadProto = (protoName: string) => {
      const fileName = protoName.includes('.proto') ? protoName : `${protoName}.proto`;
      return loadPackageDefinition(fileName);
    };
    
  • 协议加载器核心实现完整版

    // proto-pkg/src/loader.ts 
    import * as fs from 'fs';
    import * as path from 'path';
    import * as grpc from '@grpc/grpc-js';
    import * as protoLoader from '@grpc/proto-loader';
    
    export const loadProto = (protoName: string) => {
      const protoPath = path.join(__dirname, '../proto', 
        protoName.includes('.proto') ? protoName : `${protoName}.proto`
      );
      
      const packageDef = protoLoader.loadSync(protoPath, {
        keepCase: true,
        longs: String,
        enums: String,
        defaults: true,
        oneofs: true 
      });
      
      return grpc.loadPackageDefinition(packageDef);
    };
    

共享协议项目的代码生成封装与优化

1 ) 协议生成工具链整合

  • grpc-tools:生成 CommonJS 规范的 gRPC 服务端/客户端代码。
  • ts-proto:生成 TypeScript 类型声明文件。
  • tsup:编译为统一 ESM 模块导出。
    构建脚本配置示例:
    // proto-pkg/package.json
    {
      "scripts": {
        "build": "tsup src/index.ts --format cjs,esm --dts",
        "generate": "grpc_tools_node_protoc --ts_out=generated --js_out=import_style=commonjs,binary:generated"
      }
    }
    

2 ) 协议代码编译优化

  • 将生成的 generated/ 代码通过 tsup 编译到统一入口:
    // proto-pkg/src/index.ts
    export * from './generated/user_service_pb';
    export * from './utils';
    
  • 配置 tsconfig.json 指定输出目录:
    {
      "compilerOptions": {
        "outDir": "dist",
        "rootDir": "src"
      }
    }
    

3 ) 微服务协议调用改造

  1. 服务端协议加载(User 微服务)
// user-service/src/main.ts 
import { loadProto } from '@private/proto-pkg';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';

async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
    transport: Transport.GRPC,
    options: {
      url: '0.0.0.0:50051',
      package: 'user',
      protoPath: loadProto('user.proto') 
    }
  });
  await app.listen();
}
  1. 客户端调用改造(Gateway 服务)
// gateway/src/auth/auth.service.ts
import { UserServiceClient } from '@private/proto-pkg';
import { ClientGrpc } from '@nestjs/microservices';

@Injectable()
export class AuthService {
  private userService: UserServiceClient;
  
  constructor(@Inject('USER_SERVICE') private client: ClientGrpc) {}
  
  onModuleInit() {
    this.userService = this.client.getService<UserServiceClient>('UserService');
  }
  
  async validateUser(id: string) {
    return this.userService.findUser({ id }).toPromise();
  }
}

关键改造注意事项与优化方向


1 ) Monorepo 设计原则

  • 目的:
    • 统一管理跨服务共享资源(如协议文件)。
    • 简化本地开发调试流程(无需多仓库切换)。
  • 限制:
    • 敏感微服务代码应独立部署,仅暴露 gRPC 协议或公共包。

2 ) 协议层最佳实践

  • 使用 @grpc/grpc-js 替代 grpc 包(官方维护版本)。
  • 封装通用工具方法(如 promisifyServiceMethods):
    // proto-pkg/src/utils.ts
    export const promisifyServiceMethods = (service: any) => {
      Object.keys(service).forEach(method => {
        if (typeof service[method] === 'function') {
          service[method] = util.promisify(service[method]);
        }
      });
    };
    

3 ) 健康检查标准化

使用 @nestjs/terminus 实现统一健康检查:

// user/src/health/health.controller.ts
import { HealthCheckService, GrpcHealthIndicator } from '@nestjs/terminus';

@Controller('health')
export class HealthController {
  constructor(
    private health: HealthCheckService,
    private grpc: GrpcHealthIndicator,
  ) {}

  @Get()
  check() {
    return this.health.check([
      () => this.grpc.checkService('user-service', 'user.UserService'), // 第二个参数也可以是 0.0.0.0:4001 这样,是 hostname
    ]);
  }
}

安全通信:启用gRPC TLS加密,在proto-pkg中保留certs目录管理证书
可以将证书目录地址抽理出来作为参数传递,后期调用方填入即可

4 ) 开发环境优化配置

// 根目录 package.json 
"scripts": {
  "dev:user": "pnpm --filter user-service run start:dev",
  "dev:gateway": "pnpm --filter gateway run start:dev",
  "watch:proto": "pnpm --filter proto-pkg run build --watch"
}

5 ) 版本控制策略

  • 提交信息规范示例:
    git commit -m "feat: monorepo 重构 - 抽离 proto 协议层"
    

常见问题解决方案


1 ) 模块导入报错

在tsconfig.json中配置路径映射:

{
  "compilerOptions": {
    "paths": {
      "proto-pkg": ["./proto-pkg/dist/index"]
    }
  }
}

2 ) gRPC连接复用

// shared/src/grpc/connection.ts
import * as grpc from '@grpc/grpc-js';

export class GrpcConnectionPool {
  private static connections = new Map<string, grpc.Client>();

  static getClient(serviceUrl: string): grpc.Client {
    if (!this.connections.has(serviceUrl)) {
      this.connections.set(serviceUrl, new grpc.Client(
        serviceUrl, 
        grpc.credentials.createInsecure()
      ));
    }
    return this.connections.get(serviceUrl)!;
  }
}

3 ) Proto版本冲突
在根package.json中限制proto版本:

"pnpm": {
  "overrides": {
    "proto-pkg": "workspace:*"
  }
}

改造注意事项与优化建议

核心要点:

  1. Monorepo适用场景:

    • 优势:统一调试环境、简化依赖管理;
    • 局限:微服务增多后需拆分独立仓库,仅暴露gRPC协议文件或NPM包。
  2. 工具链整合:

    工具作用配置示例
    grpc-tools 或 grpc_tools_node_protoc生成gRPC客户端/服务端CommonJS代码--js_out=generated
    ts-proto生成TypeScript类型化gRPC代码--ts_out=generate
    tsup编译TS到ES模块并打包tsup src/index.ts --dts
  3. 项目结构规范:

    monorepo/  
    ├── packages/  
    │   ├── gateway/           # API 网关  
    │   ├── user/              # 用户微服务  
    │    └── proto-pkg/         # 共享协议层  
    │       ├── src/  
    │       │   ├── generated/ # 协议生成的 TS 代码  
    │       │   ├── utils.ts    
    │       │    └── index.ts   # 统一入口  
    │        └── dist/          # 编译输出  
    ├── pnpm-workspace.yaml  
    └── package.json  
    

核心价值:通过 monorepo 改造,实现协议层的跨服务复用,统一工具链生成类型安全的 gRPC 代码,大幅降低协议同步成本,并为微服务健康检查、版本控制提供标准化支持。

4 ) 可扩展优化方向:

  • 公共方法封装:将promisifyServiceMethods迁移至共享包:

    // utils.ts 
    export const promisifyServiceMethods = (service: any) => {
      Object.keys(service).forEach(method => {
        if (typeof service[method] === 'function') {
          service[method] = util.promisify(service[method]);
        }
      });
    };
    
  • 健康检查标准化:集成@nestjs/terminus:

    import { HealthCheckService, MicroserviceHealthIndicator } from '@nestjs/terminus';
    
    @Controller('health')
    export class HealthController {
      constructor(
        private health: HealthCheckService,
        private microservice: MicroserviceHealthIndicator,
      ) {}
    
      @Get()
      check() {
        return this.health.check([
          () => this.microservice.pingCheck('grpc', { transport: Transport.GRPC }),
        ]);
      }
    }
    

关键改造要点总结


1 ) 目录结构规范

  • 使用 Monorepo 模式 管理多服务
  • 通过 pnpm workspaces 实现依赖共享
  • 协议文件集中管理 在 proto-pkg 包

2 ) 核心工具链

工具用途关键配置
grpc-tools生成 gRPC 原生代码--ts_out=generated
ts-proto生成 TypeScript 类型--outputEncodeMethods
tsup编译 TS 到 CommonJS--format cjs --dts

3 ) 服务通信规范

  • 服务端通过 loadPackageDefinition 加载协议
  • 客户端使用 getService 获取强类型客户端
  • 接口定义使用 Promise 封装 替代 Observable

4 ) 健康监测

集成 @nestjs/terminus 实现:

// 微服务健康检查
grpc.checkService('service-name', 'package.Service')

最终改造结果:

  • 协议文件复用率提升至 100%
  • 构建依赖减少 40%
  • 服务启动时间降低 30%
  • 完整代码提交记录:git push origin feat/monorepo-refactor

本次改造将微服务项目重构为monorepo架构,通过pnpm workspace管理依赖,抽离proto文件至共享包,并解决CommonJS/ES模块兼容问题。关键成果包括:

  1. 版本控制标准化:统一Git管理,消除子项目独立仓库。
  2. 协议共享:proto-pkg包提供类型安全的gRPC通信基础。
  3. 工具链集成:grpc-tools + ts-proto + tsup实现协议到代码的自动化流水线。
    后续可扩展服务发现、健康检查等能力,提升微服务治理效率。
NestJS项目创建与优化全指南 Node.js生态中的后端框架NestJS以其模块化设计和高效性能受到开发者青睐。其核心原理基于装饰器和依赖注入,通过TypeScript强类型支持提升开发体验。在技术价值层面,NestJS整合了Express/Fastify双引擎,提供企业级应用所需的可扩展性和性能保障。典型应用场景包括微服务架构、RESTful API开发和全栈应用后端。本文以餐厅管理系统为例,详解从环境准备、项目创建到生产部署的全流程,特别针对CLI参数优化、模块化设计和性能调优等关键环节提供工程实践方案,帮助开发者规避常见陷阱并掌握 阅读详情

相关推荐

NestJS企业级Node.js框架实战指南

Node.js作为流行的服务端运行时,其轻量级特性在复杂业务场景中常面临架构挑战。NestJS通过模块化设计和依赖注入机制,将面向对象编程原则引入Node.js开发,显著提升了代码的可维护性和团队协作效率。该框架内置TypeScript支持,结合装饰器语法实现分层架构,特别适合构建需要长期演进的企业级应用。在微服务、电商系统等高复杂度项目中,NestJS的模块(Module)系统能有效管理业务边界,而控制器(Controller)与服务(Service)的强制分离则保障了代码可测试性。通过集成Swagger

weixin_30414305的博客 346

NestJs和Vite使用monorepo管理项目中,需要使用共享的文件夹步骤

文件内容 根目录创建文件. 使用创建项目时, 已经安装了的基本模块,因此可以直接使用 文件内容, 就按照下面的内容进行修改即可 注意的版本需要指定, 这里的版本是安装即可 , 不然会出现奇奇怪怪的问题

小火车况且况且况且的博客 1487

NestJS构建现代服务端应用:从架构到实战

在现代服务端开发中,模块化架构和依赖注入是提升工程效率的核心技术。NestJS作为基于TypeScript的渐进式框架,通过装饰器语法将Angular的工程化思维引入后端开发,显著降低了Node.js应用的维护成本。其内置的依赖注入容器和模块化系统,使得开发者可以轻松实现高内聚低耦合的代码组织,特别适合需要频繁迭代的互联网产品。结合TypeORM实现数据持久化,以及gRPC构建微服务架构,NestJS能够有效支撑从单体应用到分布式系统的演进。本文通过电商平台案例,详解如何利用NestJS的模块化设计和Typ

weixin_30421809的博客 397

NestJs Monorepo模式下找不到Entity实体

NestJs Monorepo 提示: EntityMetadataNotFoundError: No metadata for “User” was found. entities: [ __dirname + '/../entity/**/*.entity.js', ], 配置无效。 请修改nest-cli.json文件,编译选项配置: "compilerOptions": { "webpack": false, "tsConfigPath": "apps/

xushuyi07的专栏 3400

20天AI驱动Monorepo构建:Markdown文档驱动Claude Code实战

在软件工程领域,Spec-Driven Development (SDD) 是一种以结构化规格说明为核心驱动力的开发范式,它强调将文档作为项目开发的唯一可信源。其核心原理在于通过精确、机器可读的规格描述,来指导代码的生成与系统的构建,从而确保架构的一致性与可维护性。这一方法的技术价值在于,它能将开发者从繁琐的脚手架搭建和样板代码编写中解放出来,使其能更专注于高层次的业务逻辑与系统设计。在应用场景上,SDD尤其适用于从零开始的**Monorepo**项目构建、标准化业务系统的快速原型开发,以及需要严格保持多模

weixin_34378767的博客 394

深入理解NX和NestJS在Monorepo中的配置与使用

本文介绍了在Monorepo架构中正确配置NX和NestJS的方法。通过使用NX的run-commands执行器中的cwd属性,可以指定NestJS在src/server目录下运行,避免路径错误问题。文章还提供了修改project.json和nest-cli.json的两种配置方案,并给出了具体实例。这些方法能有效解决Monorepo中NestJS服务器启动路径问题,提升开发效率。根据项目需求,开发者可选择最适合的配置方式确保服务在正确目录运行。

m0_62153576的博客 119

monorepo mode vs standard mode使用场景和各自的优缺点

NestJS 是一个基于 TypeScript 和 Node.js 的渐进式框架,用于构建高效、可扩展的服务器端应用程序。在 NestJS 中,“monorepo”和“standard mode”分别指代两种不同的项目组织和管理方式。

qq_35374791的博客 1343

nest-lerna-template:nestjs monorepo的模板存储库(使用lerna)

@ anchan828 / nest-lerna-template 该存储库是带有lerna的nestjs的模板。

Nestjs框架: 微服务项目工程结构优化与构建方案

本文介绍了如何通过Monorepo架构优化NestJS微服务项目的开发体验,主要包含以下内容: 使用Nest CLI创建Monorepo项目结构,解决传统独立项目运维部署效率低的问题; 集成SWC编译器加速构建过程,通过自定义Webpack配置兼容Monorepo项目; 采用pnpm workspace实现依赖共享和高效缓存,提升构建性能; 演示微服务项目的并行启动和多服务部署方案。 该方案显著提升了项目开发效率,构建速度提高50%以上,同时降低了项目维护成本。

Wang的专栏 1171

react-nestjs-template:使用React前端和NestJS后端引导Monorepo的模板

模板ReactJS + NestJS :briefcase: 使用React前端和NestJS后端引导Monorepo的模板 用法 npx degit Jensderond/react-nestjs-template my-new-project 去做: 前端 后端 MySQL基本设置到后端 配置验证 使用身份验证和授权 健康检查 ... 安装 yarn install 开始前端 yarn workspace frontend start 开始后端 yarn workspace backend start 作者 :bust_in_silhouette: 詹斯·德隆德 网址: : 推特: : :handshake: 贡献 欢迎提供文稿,问题和功能要求! 随时检查。 表示支持 给一个 :white_medium_star: 如果这个项目对您有帮助! :memo: 执照 版权所有:copyright:2020 。 该项目是许可的。 该自述文件是使用 :red_heart_selector: 通过

nestjs-serverless-monorepo

NestJS + AWS无服务器Monorepo 如何开始 安装依赖项 npm install npx lerna bootstrap 为3种不同的环境设置了CI / CD: dev (本地), qa (qa), prod (用于生产)。 服务 常见的 认证 用户 要求 (版本11) ARNS和AWS awscli Instalada e configurada: ://aws.amazon.com/getting-started/ CircleCI 无服务器 储存库结构 该存储库使用[lerna]( )和yarn工作区来管理其依赖项。 我们所有的服务都必须位于services /文件夹中。 如有必要,您可以将在多个微services / common /使用的代码保留在services / common / 。 所有服务中都必须使用Typescript。 环保环境 “ se

NestJS:前端开发者快速上手的后端框架

依赖注入(DI)和模块化是现代软件开发的核心概念,它们通过解耦组件依赖关系来提高代码的可维护性和可测试性。在Node.js生态中,NestJS框架将这些原理与TypeScript深度结合,为开发者提供了类似Angular的开发体验。其装饰器语法和模块系统特别适合有前端背景的开发者快速构建企业级后端应用,在REST API开发、微服务架构等场景展现出色表现。通过内置的依赖注入容器和AOP支持,NestJS有效解决了传统Node.js项目在复杂度增长时的架构难题,成为连接前后端开发范式的重要桥梁。

weixin_33672400的博客 503

别再死记硬背参数了!手把手教你用Fluent欧拉模型搞定流化床模拟(附颗粒粘度/体积分数设置详解)

本文深入解析Fluent欧拉模型在流化床模拟中的应用,重点讲解颗粒粘度和体积分数等关键参数的设置原理与科学方法。通过对比不同模型(如Syamlal-O'Brien、Gidaspow)的适用场景,帮助工程师摆脱参数死记硬背,实现精准模拟。内容涵盖相间作用机制、求解策略优化及结果验证,为化工、能源领域的流化床模拟提供实用指南。

weixin_42656416的博客 429

后端项目架构演进实战:从脚本到微服务,不同规模与语言的技术选型指南

> 导读:后端项目不是一开始就该用微服务的。本文以 Datawhale easy-vibe 课程附录《后端项目架构导论》为骨架,系统讲解如何按**用户量规模**(<1k / 1k-100k / >100k)与**语言特性**(Node.js / Python / Go / Java)选择匹配的架构风格,并给出每种风格可直接复制的目录结构与代码示例。读完你将掌握:入门级单文件脚本、进阶级四层架构、企

gitblog_00057的博客 707

直升机空气动力学基础--005翼型的升阻比和气动力矩

焦点与翼型有关,总升力矩可以视为附加升力与零升力迎角升力的合成,对于对称翼型,零升力力矩为0,附加升力就是总升力,其焦点就是其压力中心。对于对称翼型,零升力力矩为0,对于非对称翼型,零升力力矩存在,与不对称度成正比。对于不对称翼型,升力对焦点的力矩保持不变。

ygf666的博客 4132

Sobel原理及计算过程详解

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。首先,我们需要构建一个Sobel算子,通常是一个 3x3 的矩阵。Sobel算子可以分别计算水平和垂直方向的梯度值,然后将两者合并得到总梯度值。索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度近似值。所以,我们假设选择图像矩阵中的点A(1, 1),即第二行第二列的元素,对应的。接下来,我们将使用Sobel算子计算这个点的梯度值。

2301_76461741的博客 1万+

后端项目架构设计指南:从脚本到微服务的分层演进实战(Easy-Vibe 项目学习版)

后端项目从几行脚本成长到支撑百万用户的分布式系统,代码的组织方式决定了它的生死。这篇指南以 Easy-Vibe 开源教程仓库中《后端项目架构设计》为核心,系统讲解如何根据用户规模与语言特性选择架构形态:入门级的简单脚本风格、中等级的四层架构(Controller-Service-Repository-Model)、企业级的微服务与数据层设计,并给出 Node.js、Python、Go、Java 四

gitblog_01136的博客 724

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)

前言本次分享2018年发表在ICDM上的论文----「Self-Attentive Sequential Recommendation」。主要是应用self-attention机制来做一...

Blank_Space 8033

Monorepo实战:pnpm在大型前端项目中的最佳实践

最近在重构公司的电商平台时,我们决定采用Monorepo架构来管理日益复杂的代码库。整个项目包含20多个子模块,包括前端主站、后台管理系统、各种微服务和工具库。经过技术选型,我们最终选择了pnpm作为包管理工具,下面分享一下实战中的经验总结。整个迁移过程证明,pnpm配合Monorepo确实能显著提升大型前端项目的开发效率。不仅解决了依赖地狱问题,还让跨项目协作变得更加顺畅。的一键部署功能特别适合这种复杂项目。它不需要手动配置构建环境,就能把各个子服务快速部署上线。经过这次实践,我们发现。

SilvermistRaven28的博客 518

告别虚拟机!用ZYNQ7000和PYNQ 2.6.0打造一个能实时识别人脸的“智能摄像头”

本文详细介绍了如何利用Xilinx ZYNQ7000开发板和PYNQ 2.6.0框架构建实时人脸识别系统。通过硬件加速和嵌入式开发技术,该系统实现了低延迟、低功耗的独立运行能力,适用于边缘计算和物联网应用。文章包含从环境搭建到核心功能实现的完整指南,并提供了性能优化和问题排查的实用技巧。

weixin_42543046的博客 391

CocosCreator3.8实战指南:动态字体与位图字体性能优化技巧

本文深入解析CocosCreator3.8中系统字体、动态字体(TTF)与位图字体(FNT)的核心差异与性能表现。针对动态字体运行时解析开销大、内存占用高的痛点,提供了字体子集化、共享资源等优化技巧;同时详细介绍了位图字体制作流程及其在渲染速度、内存可控性上的绝对优势,并给出跨平台场景下的字体选型与优化策略,帮助开发者有效提升游戏性能。

weixin_29006701的博客 563

后端项目架构选型实战:从单体脚本到微服务的分阶段演进指南(Easy-Vibe 项目制学习)

> 本文是 Easy-Vibe 后端技术路线中的核心选型指南。它回答一个贯穿所有后端开发者职业生涯的问题:当项目从几十行脚本膨胀到支撑数十万用户的分布式系统时,架构应该怎样随业务规模与语言特性同步进化?读完本文,你将掌握按用户量分级(<1k / 1k-100k / >100k)选择架构风格的判断标准,理解 Node.js、Python、Go、Java 四大语言生态各自的推荐架构形态,并能在分层架构

gitblog_01109的博客 926

系统安装、qt配置、安装pcie驱动

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 安装Linux系统指定:ununtu20.04并配置相关软件环境 前言 提示:这里可以添加本文要记录的大概内容: ununtu20.04、Qt 5.9.0、pcie驱动 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装系统 制作系统盘(win10),在开机时按相应键进入BIOS,(华硕需要先改配置启动->CSM->开启->第一个选项选第一个或第二个),等待即可 进入后按照https://www.sysgeek.

weixin_44832804的博客 2206

从脚本到微服务:easy-vibe 视角下的后端项目架构选型与渐进式演进指南

> **导读**:后端项目该用单文件脚本、四层分层架构还是微服务,取决于用户规模、团队结构与所选语言的设计哲学。本文以 easy-vibe 的 [backend-project-architecture.md](https://link.gitcode.com/i/ef6dd4e30a24b0d7470fa091e6c0dd44) 为核心骨架,结合仓库中 [backend-layered-arch

gitblog_00818的博客 352

PowerPMAC配置EtherCAT设备

本文详细介绍了在PowerPMAC IDE环境下配置EtherCAT伺服电机的完整流程。主要内容包括:准备工作(连接硬件和获取ESI文件)、通过ESI管理器加载配置文件、网络扫描识别从站设备、变量映射(定义输入输出位置参数)、激活EtherCAT通讯(验证状态字和实际位置)以及相关参数说明。文章还概述了主站配置的8个方面和从站配置的7个选项,重点说明了PDO映射和变量分配机制,为伺服电机的EtherCAT通信配置提供了系统指导。

mahuliang321的博客 972

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

HeyForm技术架构解析:现代化表单构建器的React+TypeScript+NestJS全栈实现

HeyForm是一个开源的表单构建器,专为中小型企业设计,采用React前端与NestJS后端的全栈技术栈,通过TypeScript实现类型安全的表单逻辑处理。该项目采用现代化的微服务架构,将表单渲染、答案处理、服务器端逻辑和Web应用分离,支持复杂的条件逻辑、实时预览和多平台部署。 ## 模块化架构设计与技术栈选型 HeyForm采用了模块化的monorepo架构,将不同功能模块分离到独立的

gitblog_00750的博客 393

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: Nestjs框架: 微服务注册中心架构设计与Consul实战
下一篇: Nestjs框架: Consul健康检查与gRPC客户端动态管理优化方案
Wang's Blog
博客等级 码龄12年 7423粉丝 2412原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值