각각의 기능을 담당하는 Service를 한개의 게이트웨이에서 묶어서 보내준다.
주로 큰 서비스에서 마이크로서비스를 사용한다.
(작은서비스는 굳이 사용할 필요가 X)
TCP방식으로 3001번과 3002번포트에 각각 message를 보내 해당 api들의 return 값을 받아와 게이트웨이에서 return 한다
우선
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
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 {}
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
를 사용한다.
다양한 프레임워크(
SpringBoot
,Django
등등..)를 사용했을때API GateWay
를 설정할때는
Nginx
를 사용한다
(마이크로서비스 GateWay용도 말고도 다양하게 사용한다)
포트포워딩
을막고,
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
로 전달하게된다.