Построение API-микросервисов в контейнерах Docker каждый с MongoDB и MySQL и API Gateway Pattern в Node.js

Привет, разработчики!

Давайте узнаем, как построить API микросервисы в докеровских контейнерах, каждый из которых имеет определенную базу данных (MongoDB и MySQL) и сделать это доступным, структурировав паттерн API Gateway?

Полный проект находится здесь: https://github.com/luizcalaca/microservices-nodejs-docker-gateway-api Не забудьте поставить звезду ⭐️ и поиграть с кодом.


Что такое микросервисы и паттерн API Gateway?

  • Микросервисная архитектура — это архитектурный способ построения программного обеспечения, который организует приложение как набор небольших автономных сервисов, мыслящих в бизнес-области.

  • API Gateway — это способ централизации всех маршрутов, которые будут доступны через конечную точку. Почему стоит использовать? Потому что у нас может быть много микросервисов во многих контейнерах с большим количеством маршрутов, поэтому нужен способ организовать это количество.


Давайте продолжим и посмотрим на изображение из Azure, здесь мы собираемся построить де микросервисы и шлюз API с его конечной точкой для клиента.

Мы можем создать три папки, каждая со своим index.js и Node.js:

index.js orders:

const app = require('express')();

app.get('/orders', (req, res) => res.send('Hello Orders, API!'));

app.listen(3000, () => console.log(`Products API listening on port 3000!`));
Войти в полноэкранный режим Выход из полноэкранного режима

index.js products:

const app = require('express')();

app.get('/products', (req, res) => res.send('Hello Products, API with MySQL!'));

app.listen(3000, () => console.log(`Products API listening on port 3000!`));
Войти в полноэкранный режим Выйти из полноэкранного режима

index.js api-gateway:

const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');

const app = express();
const port = 3007;

const {
  ORDERS_API_URL,
  PRODUCTS_API_URL,
} = require('./URLs');

const optionsProducts = {
  target: PRODUCTS_API_URL,
  changeOrigin: true, 
  logger: console,
};

const optionsOrders = {
  target: ORDERS_API_URL,
  changeOrigin: true, 
  logger: console,
};

const productsProxy = createProxyMiddleware(optionsProducts);
const ordersProxy = createProxyMiddleware(optionsOrders);

app.get('/', (req, res) => res.send('Hello Gateway API'));
app.get('/orders', ordersProxy);
app.get('/products', productsProxy);

app.listen(port, () => console.log(`Example app listening on port ${port}!`));
Войти в полноэкранный режим Выйти из полноэкранного режима

URLs.js в той же иерархии файлов index.js на api-gateway:

module.exports = {
    ORDERS_API_URL: 'http://localhost:3005',
    PRODUCTS_API_URL: 'http://localhost:3006',
  };
Войти в полноэкранный режим Выйти из полноэкранного режима

Добавьте скрипт npm start во все package.json:

 "scripts": {
    "start": "node index.js"
  }
Войти в полноэкранный режим Выйти из полноэкранного режима

После установим express и express-http-proxy:


cd orders && npm i express
cd orders && npm i express
cd api-gateway && npm i express express-http-proxy

Создадим Dockerfile и docker-compose.yaml, сначала заказы с образом MongoDB:

FROM node:alpine
WORKDIR /usr/app
COPY package*.json ./
RUN npm install 
COPY . . 
EXPOSE 3000
CMD npm start
Вход в полноэкранный режим Выход из полноэкранного режима
version: "3"

services:
  app:
    build: .
    command: npm start
    ports:
      - "3005:3000"
    volumes:
      - .:/usr/app
    depends_on:
      - "mongo"
    networks:
      - backend

  mongo:
    container_name: "mongo-node"
    platform: linux/amd64
    image: mongo:4.4.14
    ports:
      - "8081:8081"
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: root
    networks:
      - backend

networks:
  backend:
    driver: bridge
Войти в полноэкранный режим Выход из полноэкранного режима

Во-вторых, товары с изображением базы данных MySQL:

FROM node:alpine
WORKDIR /usr/app
COPY package*.json ./
RUN npm install 
COPY . . 
EXPOSE 3000
CMD npm start
Войти в полноэкранный режим Выход из полноэкранного режима
version: "3"

services:
  app:
    build: .
    command: npm start
    ports:
      - "3006:3000"
    volumes:
      - .:/usr/app
    depends_on:
      - "mysql"
    networks:
      - backend

  mysql:
    container_name: "data-node"
    platform: linux/amd64
    image: mysql:5.7.31
    command: --default-authentication-plugin=mysql_native_password --sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER --explicit_defaults_for_timestamp
    restart: always
    ports:
      - "3310:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - TZ=America/Sao_Paulo
    networks:
      - backend

networks:
  backend:
    driver: bridge
Войти в полноэкранный режим Выход из полноэкранного режима

Как запустить?

  • микросервис товаров с MySQL

  • микросервис заказов с MongoDB

  • Архитектура паттерна API Gateway

  • Использование API Gateway в браузере

Полный проект здесь: https://github.com/luizcalaca/microservices-nodejs-docker-gateway-api Не забудьте поставить звезду ⭐️ и поиграться с кодом.

«Вот и все, друзья!»

Контакты
Email: luizcalaca@gmail.com
Instagram: https://www.instagram.com/luizcalaca
Linkedin: https://www.linkedin.com/in/luizcalaca/
Twitter: https://twitter.com/luizcalaca

Оцените статью
Procodings.ru
Добавить комментарий