GraphQL Services using Node and Apollo

I have prepared 2 repos to implement FakeBank using GraphQL:

1. JavaScript:

2. TypeScript:

Architecture can be like this:

FakeBank uses:

* GraphQL
– “GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data.”

* GraphQL-JS
– “A reference implementation of GraphQL for JavaScript”

* Apollo Server
– “Apollo Server is an open-source, spec-compliant GraphQL server that’s compatible with any GraphQL client”

* Apollo Federation
– “… expose a single data graph that provides a unified interface for querying all of your backing data sources”

* Apollo REST Data Source
– “This package exports a (RESTDataSource) class which is used for fetching data from a REST API and exposing it via GraphQL within Apollo Server.”

* Apollo Gateway
– sits above other GraphQL services

* GraphQL DataLoader
– “DataLoader is a generic utility to be used as part of your application’s data fetching layer to provide a consistent API over various backends and reduce requests to those backends via batching and caching.”
– improves performance of GraphQL service

* Express
– “Fast, unopinionated, minimalist web framework for node”
– helps create an HTTP service quickly

* Faker
– “generate massive amounts of realistic fake data in Node.js and the browser”
– helps create random/mock data

* Lerna
– “A tool for managing JavaScript projects with multiple packages.”

## List of core REST services

* rest-auth
– http://localhost:10111
– manages login actions, user records

* rest-accounts
– http://localhost:10222
– manages bank accounts and transactions

* rest-payments
– http://localhost:10333
– manages money transfers

## List of GraphQL services using Core REST services

* gql-fed-auth
– http://localhost:20111
– uses rest-auth

* gql-fed-accounts
– http://localhost:20222
– uses rest-accounts

* gql-fed-payments
– http://localhost:20333
– uses rest-payments

## Standard GraphQL service using Core REST services

* gql-standard
– http://localhost:30111
– uses rest-auth
– uses rest-accounts
– uses rest-payments

## GraphQL Gateway service

* gql-gateway
– http://localhost:40111
– uses gql-fed-auth
– uses gql-fed-accounts
– uses gql-fed-payments

## Sequence diagrams

To see the diagrams, use

### A. GraphQL Standard

title Fake Bank APIs with GraphQL Standard
app->api-gateway: request
api-gateway->gql-standard: request
gql-standard --> rest-X: request a
rest-X -> db-X: select data a
rest-X <- db-X: records a gql-standard <- rest-X: response a gql-standard --> rest-Y: request b
rest-Y -> db-Y: select data b
rest-Y <- db-Y: records b gql-standard <- rest-Y: response b api-gateway <- gql-standard: response app <- api-gateway: response

### B. GraphQL Gateway

title Fake Bank APIs with GrapQL Gateway

app->api-gateway: request
api-gateway->gql-gateway: request

gql-gateway --> gql-fed-X: request a
gql-fed-X -> rest-X: request a
rest-X -> db-X: select data a
rest-X <- db-X: records a gql-fed-X <- rest-X: response a gql-gateway <- gql-fed-X: response a gql-gateway --> gql-fed-Y: request b
gql-fed-Y -> rest-Y: request b
rest-Y -> db-Y: select data b
rest-Y <- db-Y: records b gql-fed-Y <- rest-Y: response b gql-gateway <- gql-fed-Y: response b api-gateway <- gql-gateway: response app <- api-gateway: response

## Installation

Install yarn and lerna globally

npm i -g yarn lerna

Install dependencies for all packages in this codebase.

lerna bootstrap

## Build

lerna run build

## Start in production mode

Run these in separate terminals in this order:

## Core REST services

Random/fake data is generated at runtime

lerna run start:prod --scope=@fakebank/rest-auth
lerna run start:prod --scope=@fakebank/rest-accounts
lerna run start:prod --scope=@fakebank/rest-payments

## GraphQL Services

These services are used by GraphQL Gateway

lerna run start:prod --scope=@fakebank/gql-fed-auth
lerna run start:prod --scope=@fakebank/gql-fed-accounts
lerna run start:prod --scope=@fakebank/gql-fed-payments
lerna run start:prod --scope=@fakebank/gql-gateway

## Standard GrapQL service

We can use RESTful services directly

lerna run start --scope=@fakebank/gql-standard

Note: Another way to run a service:

cd packages/core-auth
yarn start:prod

On the next post, I will discuss the details of GraphQL federation: Federation of GraphQL Services using Apollo Gateway