Day33 (4.27)

ShinJuYong·2022년 4월 27일
0

camp

목록 보기
32/44
post-thumbnail

MicroService

각각의 기능을 담당하는 Service를 한개의 게이트웨이에서 묶어서 보내준다.
주로 큰 서비스에서 마이크로서비스를 사용한다.
(작은서비스는 굳이 사용할 필요가 X)

장점

  • 소스코드 전체를 빌드-배포할 필요가없다.(배포시간이 줄어듦)
    (특정 API가 바뀌면 그 특정 API만 다시 배포한다)
  • 에러가 발생해 서버가 Exit되더라도 해당 API만 사용이 불가능해진다.(나머지 API는 모두 사용 가능)

단점

  • 전체적인 기술의 복잡도가 ↗️

RestAPI


TCP방식으로 3001번과 3002번포트에 각각 message를 보내 해당 api들의 return 값을 받아와 게이트웨이에서 return 한다


GraphQL

우선 GraphQL에 필요한 라이브러리를 설치해야한다
yarn add @nestjs/graphql @nestjs/apollo graphql apollo-server-express

GateWay
yarn add @apollo/gateway

service
yarn add @apollo/federation
yarn add @apollo/subgraph

GateWay

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ApolloGatewayDriver, ApolloGatewayDriverConfig } from '@nestjs/apollo';
import { GraphQLModule } from '@nestjs/graphql';
import { IntrospectAndCompose } from '@apollo/gateway';

@Module({
  imports: [
    GraphQLModule.forRoot<ApolloGatewayDriverConfig>({
      driver: ApolloGatewayDriver,
      gateway: {
        supergraphSdl: new IntrospectAndCompose({
          subgraphs: [
            {
              name: 'auth',
              url: 'http://auth-service:3001/graphql',
            },
            {
              name: 'resource',
              url: 'http://resource-service:3002/graphql',
            },
          ],
        }),
      },
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Services

import { GraphQLModule } from '@nestjs/graphql';
import { Module } from '@nestjs/common';
import { AppService } from './app.service';
import {
  ApolloFederationDriver,
  ApolloFederationDriverConfig,
} from '@nestjs/apollo';
import { AppResolver } from './app.resolver';

@Module({
  imports: [
    GraphQLModule.forRoot<ApolloFederationDriverConfig>({
      driver: ApolloFederationDriver,
      autoSchemaFile: 'src/common/graphql/schema.gql',
    }),
  ],
  providers: [AppService, AppResolver],
})
export class AppModule {}

기존에 GraphQL모듈을 쓰듯이 등록하지만 Driver를 ApolloFederationDriver를 사용한다.


Other FrameWork's...

다양한 프레임워크(SpringBoot,Django등등..)를 사용했을때 API GateWay를 설정할때는

Nginx를 사용한다
(마이크로서비스 GateWay용도 말고도 다양하게 사용한다)

Nginx

포트포워딩을막고,
Nginx에서만 접근을 가능하게 만든다.

server {
    listen 80;

    location /graphql {
        proxy_pass http://auth-service:3001;
    }

    location /stocks {
        proxy_pass http://stock-service:3002;
    }
}

80번포트에 graphql이나 stocks로 요청이온다면 해당 proxy_pass로 전달하게된다.


알고리즘

프로그래머스-LV2-스킬트리

0개의 댓글