by 雪隐 from https:///user/1433418895994094
本文欢迎共享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可联系授权

原文链接

嗨,伙计们,祝咱们一切顺利,今天我想和你们共享一些咱们现已做了一段时间的事情,并学到了许多关于将清洁架构应用于咱们的微服务的常识。

在进入代码之前,让咱们了解微服务是如何工作和组织咱们的代码的,从而使服务越来越独立于结构,易于测验,无论用户界面如何,也就是说,用户界面能够随意更改,而不会反映在应用程序的其他部分,是独立于数据库的,因为它维护应用程序自身的一切事务规矩,最后,独立于任何外部代理,因为事务规矩不会“看到”“外部世界”。

什么是微服务?

微服务是一种架构,旨在隔离给定体系的每个功用,将它们转换为具有独立布置或许性的松散耦合服务。

微服务体系结构作为一种用于单片web应用程序的处理方案而呈现。在单片应用程序中,一切都是内置单元,整个事务规矩被界说并分组为一个归纳应用程序,在微服务架构中更新代码库或许会变得相当杂乱,因为它会影响整个体系,即使是最小的更改也或许是构建和布置新版本体系所必需的。

咱们现在知道,微服务经过将应用程序模块(功用)别离成更小的部分来处理单片体系的问题。

NestJS小技巧10-使用Nest.JS在Node中实现可扩展的微服务

咱们应该在什么时候运用微服务架构?

这两种架构都有其优缺陷,虽然微服务架构将处理加速杂乱体系开发的问题,但何时运用它们还没有明确的答案。经过微服务宽和耦,开发人员终究取得了灵活性,否则单块架构是不或许完成的。

单片应用程序终究很难扩展,因为每个应用程序都需求仿制,假如一个应用程序完全依靠于一个数据库,这将更加困难。另一方面,微服务能够依据单个服务进行扩展或仿制。假如你需求发送更多的电子邮件,只需扩展负责电子邮件功用的微服务即可。

假如您需求完成微服务架构,请问以下问题:我的单片应用程序有问题吗?假如您有任何问题,您或许需求考虑切换到微服务。假如没有,那就坚持下去 —— 没有必要投入时间来处理一个不存在的问题。

微服务的缺陷

微服务体系结构并不是处理一切问题的神奇处理方案,它也有缺陷。其间一些缺陷是:

  • 因为不同的服务运用不同的数据库,因而触及多个服务的事务需求运用终究的一致性
  • 完美的服务划分在第一次测验时很难完成,在达到尽或许好的服务别离之前需求反复进行。
  • 当服务经过运用网络交互进行通讯时,因为网络推迟和服务速度慢,这会降低应用程序的速度。

为什么NestJs用于微服务?

创立微服务时,有几种首要的编程语言从强健的结构中进行挑选。NestJs为咱们供给了许多东西来创立一个强健、有组织、可测验的应用程序。一个亮点是结构带来的依靠注入功用,咱们能够将一个模块注入另一个模块,从而促进代码重用。但值得注意的是,当这种依靠注入使模块相互依靠时,咱们会危害一些清洁架构的概念。

咱们接下来要创立的项目来测验开发API,该API能够坚持其输入接口、响应和事务规矩高度独立于数据库和结构。

创立咱们的微服务

咱们将开始创立咱们的微服务,考虑它能够处理的问题,以便更容易地界说咱们将要运用的功用。咱们将完成的通讯协议是TCP,咱们将运用PacketSender进行测验,这是一个开源应用程序,答应咱们发送支撑TCP的网络数据包。

## MacOS 装置 packetsender
brew install packetsender

经过HTTP完成微服务与运用Node.JS完成API没有什么不同,因为微服务有一个界说明确的架构和规模,所以咱们会挑选运用TCP数据包的异步形式,咱们将与微服务通讯,因而挑选Nest.JS,因为它有许多内置功用,使咱们更容易创立微服务架构。

咱们将把开发分为四个阶段,这样本教程就不会过于广泛,它们是:

  • 微服务结构和装备
  • 创立与微服务通讯的音讯形式
  • 运用PacketSender履行微服务测验
  • 咱们把这一步作为如虎添翼,最后我会在下一章告诉你下一步是什么

微服务结构和装备

在这一步中,咱们将运用以下命令运用CLI在NestJS中创立一个新的应用程序

npx @nestjs/cli new products-microservice

已然你的应用程序现已创立好了,请确保你处于项目的根方位,并装置一个库@nestjs/micservices

cd products-microservice && pnpm i @nestjs/microservices

咱们需求修改main.ts,将其保留为下面的代码片段:

import { INestMicroservice } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';
// 创立微服务options目标
const microserviceOptions = {
  transport: Transport.TCP,
  options: {
    host: process.env.HOST, //
    port: process.env.PORT,
  },
};
(async () => {
  const app: INestMicroservice = await NestFactory.createMicroservice(
    AppModule,
    microserviceOptions,
  );
  await app.listen();
  console.info('Microservice is listening...', process.env.PORT || 8080);
})();

NestJS支撑几种内置的传输层完成。上面的代码将创立一个微服务,该服务经过TCP传输层与端口8080进行通讯。


咱们能够挑选运用音讯形式或事情形式与微服务进行通讯。

音讯形式充当一种请求-响应方法,他在服务和事情形式之间交换音讯,以便在不等待响应的情况下发布事情。

咱们将只完成基于给定输入创立产品的功用,然后咱们将取得创立的产品。因而,让咱们在app.controller.ts文件中注册一个命名的音讯形式create_product

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}
  @MessagePattern('create_product')
  async createProduct(@Payload() payload: CreateProductDto) {
    const product = await this.appService.createProduct(payload);
    return product;
  }
}

接下来,咱们将抽象创立新产品的逻辑,它能够依据需求和运用的数据库以不同的方式完成,并且咱们将只关注与微服务相关的需求。

咱们用于创立新产品的有效载荷将如下所示:

import { IsString, IsEmail, IsNotEmpty } from 'class-validator';
export class CreateProductDto {
  @IsNotEmpty()
  @IsEmail()
  name: string;
  @IsNotEmpty()
  @IsNumber()
  price: number;
}

最后,最重要的是咱们的服务,它将负责将这些数据保存在库中。

...
import Product from '../entity/product.entity';
import { CreateProductDto } from '../dto/create-product.dto';
...
@Injectable()
export default class AppService {
  constructor(
    @InjectRepository(Product) private readonly productRepository: Repository<Product>,
  ){}
  async createProduct(body: Partial<Product>): Promise<UserDto> {
    try {
     	const product = new Product();
	product.name = body.name;
	product.price = body.price;
      	const productCreated = await this.productRepository.save(product);
      	return productCreated;
    } catch (e) {
	throw new InternalServerErrorException('Error');
    }
  }
...
}

创立一切代码后,咱们能够运用PackatSender在应用程序中履行测验。

运用PacketSender履行微服务测验

现在咱们现已装备和结构化了微服务,咱们需求履行测验来检查是否一切正常,为此咱们将运用PacketSender向咱们的应用程序发送TCP数据包。将地址端口设置为127.0.0.1:8080,然后从右侧的下拉菜单中挑选TCP。要对咱们的音讯进行编码,请运用ASCII字段并用以下值填充:

112#{"pattern":"create_product", "data":{"name":"G Suite","price":120}, "id":"ce51ebd3-32b1-4ae6-b7ef-e018126c4cc4"}
  • pattern-是咱们在微服务create_product中界说的音讯,;
  • data-是咱们想要发送的JSON目标,一个有nameprice的目标;

112表明咱们的音讯从第一个键开始到最后一个键的长度(两者都包含在内)。

NestJS小技巧10-使用Nest.JS在Node中实现可扩展的微服务

参照

  • NestJS微服务官方文档: docs.nestjs.com/microservic…

定论

NestJS供给了构建轻量级、结构良好、令人惊叹的微服务的或许性。开箱即用的东西和功用使开发、扩展和维护变得美观高效。

本章代码

代码