API Microservices를 각각 MongoDB 및 MySQL과 Node.js의 API 게이트웨이 패턴을 사용하여 Docker 컨테이너에 빌드

6144 단어
안녕, 개발자!

각각 특정 데이터베이스(MongoDB 및 MySQL)가 있는 도커화된 API 마이크로서비스를 구축하고 API 게이트웨이 패턴을 구조화하는 방법을 알아보겠습니다.

전체 프로젝트는 다음과 같습니다: https://github.com/luizcalaca/microservices-nodejs-docker-gateway-api 별표 ⭐️를 주고 코드를 가지고 놀아보세요.


마이크로서비스 및 API 게이트웨이 패턴이란 무엇입니까?
  • 마이크로서비스 아키텍처는 애플리케이션을 비즈니스 도메인에서 생각하는 소규모 자율 서비스 모음으로 구성하는 소프트웨어를 구축하는 아키텍처 방식입니다.
  • API 게이트웨이는 끝점을 통해 액세스할 수 있는 모든 경로를 중앙 집중화하는 방법입니다. 왜 사용해야 합니까? 우리는 경로가 많은 많은 컨테이너에 많은 마이크로서비스를 가질 수 있기 때문에 이 양을 구성하는 방법이 될 것입니다.



  • 계속해서 Azure의 이미지를 살펴보겠습니다. 여기에서 클라이언트에 대한 엔드포인트가 있는 마이크로 서비스 및 API 게이트웨이를 빌드할 것입니다.


    index.js 및 Node.js를 사용하여 각각 threes 폴더를 만들 수 있습니다.
    mkdir orders && cd orders && npm init -y && touch index.js
    mkdir products && cd orders && npm init -y && touch index.js
    mkdir api-gateway && cd gateway && npm init -y && touch index.js

    index.js 주문:

    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 제품:

    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 게이트웨이:

    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}!`));
    


    api-gateway의 동일한 index.js 파일 계층 구조에 있는 URLs.js:

    module.exports = {
        ORDERS_API_URL: 'http://localhost:3005',
        PRODUCTS_API_URL: 'http://localhost:3006',
      };
    


    모든 package.json에 npm 시작 스크립트를 추가합니다.

     "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

    먼저 MongoDB 이미지로 주문한 Dockerfile과 docker-compose.yaml을 생성해 보겠습니다.

    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을 사용한 제품 마이크로서비스cd /products
    docker-compose up
  • MongoDB로 마이크로서비스 주문cd /orders
    docker-compose up
  • API 게이트웨이 패턴 아키텍처cd /api-gateway
    npm start
  • 브라우저에서 API 게이트웨이 사용http://localhost:3007/orders
    http://localhost:3007/products

  • 전체 프로젝트는 다음과 같습니다: https://github.com/luizcalaca/microservices-nodejs-docker-gateway-api 별표 ⭐️를 주고 코드를 가지고 놀아보세요.

    "그게 다야!"

    콘택트 렌즈
    이메일: [email protected]
    인스 타 그램:
    링크드인:
    트위터:

    좋은 웹페이지 즐겨찾기