MSA 마이크로서비스 아키텍처 개념 이해

agnusdei·2023년 7월 28일
0

마이크로서비스 아키텍처 개념 이해

마이크로서비스 아키텍처는 소프트웨어 시스템을 작은 독립적인 서비스들로 나누어 개발하고 배포하는 아키텍처 스타일입니다. 각 서비스는 특정 비즈니스 기능을 수행하며, 서비스 간에는 네트워크를 통해 통신합니다. 이러한 작은 서비스들은 독립적으로 배포될 수 있고, 각 서비스를 개별적으로 확장하거나 수정할 수 있으므로 유연하고 확장성 있는 애플리케이션을 구축할 수 있습니다.

마이크로서비스 아키텍처의 특징:

  1. 독립적인 서비스들: 각 서비스는 자체적으로 독립적으로 개발, 배포, 확장, 운영됩니다. 이는 기능의 수정이나 확장이 다른 서비스에 영향을 미치지 않도록 합니다.

  2. 최소한의 공유: 각 서비스는 자체적으로 데이터베이스를 가집니다. 데이터베이스를 공유하는 경우가 드뭅니다. 대신, 각 서비스는 외부 API를 통해 데이터를 교환하거나 이벤트 기반 아키텍처를 사용하여 통신합니다.

  3. 폴리글랏 프로그래밍: 각 서비스는 서비스에 가장 적합한 언어, 프레임워크, 데이터베이스 등을 선택하여 개발할 수 있습니다.

  4. 유연한 개발과 확장성: 마이크로서비스 아키텍처는 작은 규모의 서비스로 구성되기 때문에 개발, 테스트, 배포 등이 용이합니다. 또한, 필요에 따라 각 서비스를 독립적으로 확장할 수 있습니다.

  5. 마이크로서비스 배포: 각 서비스는 개별적으로 배포될 수 있습니다. 이는 전체 애플리케이션의 배포를 빠르고 안정적으로 만들어줍니다.

  6. 분산 시스템: 서비스 간의 통신은 네트워크를 통해 이루어지므로 분산 시스템의 특징을 가지고 있습니다. 이로 인해 고가용성과 탄력성이 향상됩니다.

NestJS로 구현한 마이크로서비스 통신

NestJS는 마이크로서비스 아키텍처를 쉽게 구현할 수 있도록 Microservices 모듈을 제공합니다. 이 모듈을 사용하여 서로 다른 프로세스 사이에서 통신할 수 있습니다. 주로 네트워크를 통해 통신하며, TCP, Redis, NATS 등 다양한 프로토콜을 지원합니다.

NestJS의 Microservices 모듈을 사용하여 마이크로서비스 간의 통신을 구현하는 기본적인 단계를 살펴보겠습니다.

  1. NestJS 애플리케이션 생성: NestJS CLI를 사용하여 마이크로서비스 애플리케이션을 생성합니다.

    nest new microservices-app
    cd microservices-app
  2. Microservices 모듈 설정: main.ts 파일에서 Microservices 모듈을 설정합니다.

    // main.ts
    import { NestFactory } from '@nestjs/core';
    import { MicroserviceOptions, Transport } from '@nestjs/microservices';
    import { AppModule } from './app.module';
    
    async function bootstrap() {
      const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
        transport: Transport.TCP,
        options: {
          port: 3001,
        },
      });
      await app.listenAsync();
    }
    bootstrap();

    위 예시에서는 TCP 프로토콜을 사용하여 Microservices 모듈을 설정하였습니다. 포트 3001에서 서비스를 실행합니다.

  3. 마이크로서비스 컨트롤러 생성: 마이크로서비스 간의 요청을 처리할 컨트롤러를 생성합니다.

    nest generate controller micro
  4. 마이크로서비스 컨트롤러 작성: 마이크로서비스 컨트롤러에서 요청에 대한 핸들러 메서드를 구현합니다.

    // micro.controller.ts
    import { Controller, Get } from '@nestjs/common';
    import { MessagePattern } from '@nestjs/microservices';
    
    @Controller()
    export class MicroController {
      @MessagePattern({ cmd: 'hello' })
      async sayHello() {
        return 'Hello from microservice!';
      }
    }

    @MessagePattern() 데코레이터는 마이크로서비스 컨트롤러에 대한 메시지 패턴을 정의합니다. 위 예시에서는 { cmd: 'hello' } 패턴으로 정의하여 sayHello() 메서드가 해당 패턴의 요청을 처리합니다.

  5. AppModule에 마이크로서비스 컨트롤러 등록: 마이크로서비스 컨트롤러를 AppModule에 등록합니다.

    // app.module.ts
    import { Module } from '@nestjs/common';
    import { MicroController } from './micro.controller';
    
    @Module({
      controllers: [MicroController],
    })
    export class AppModule {}
  6. **

마이크로서비스 실행**: 애플리케이션의 main.ts 파일에서 createMicroservice() 메서드를 사용하여 마이크로서비스를 실행합니다.

// main.ts
import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);

  // Microservices
  const microservice = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
    transport: Transport.TCP,
    options: {
      port: 3001,
    },
  });
  microservice.listenAsync();
}
bootstrap();

위 예시에서 마이크로서비스는 별도의 프로세스에서 실행되며, 주 애플리케이션과 TCP 프로토콜로 통신합니다. 요청을 보내면 해당 마이크로서비스가 패턴에 맞는 핸들러 메서드를 실행하여 결과를 반환합니다.

마이크로서비스 아키텍처는 NestJS의 Microservices 모듈을 활용하여 간편하게 구현할 수 있습니다. 각 마이크로서비스는 독립적으로 개발 및 배포되어 유연하고 확장성 있는 애플리케이션을 구축할 수 있습니다. 마이크로서비스는 필요에 따라 다양한 프로토콜과 메시지 패턴을 사용하여 서로 통신할 수 있습니다.

0개의 댓글