정지된 Express Gateway를 사용하여 마이크로 서비스 응용 프로그램을 만듭니다.

고도로 확장 가능한 소프트웨어 제품을 만들 때, 마이크로 서비스 응용 프로그램은 가장 간단한 해결 방안으로 보인다.소프트웨어 개발자로서의 여정과 100만 명에 가까운 사용자의 수요를 충족시키기 위해 소프트웨어가 필요한 프로젝트에서 일하는 동안 저는 마이크로 서비스가 자원을 정확하게 이용하는 최종 문제를 해결하고 서로 다른 서비스의 확장성을 향상시켰다는 것을 보고 느꼈습니다.이것은 서로 다른 서비스 간의 결합을 없애고 독립적으로 운행하도록 돕는다.

API 게이트웨이란 무엇입니까?


마이크로서비스를 만들기 위한 가장 기본적인 요구 사항 중 하나는 API 게이트웨이입니다.API 게이트웨이는 마이크로서비스 앞에 위치한 인프라 계층입니다.그것의 목적은 클라이언트의 요청 경로를 정확한 마이크로 서비스로 바꾸어 서비스를 제공하는 것이다.

본고는 어떻게 매우 간단한 노드를 만드는지 소개한다.Docked Express API 게이트웨이를 사용하는 js 마이크로 서비스 응용 프로그램

선결 조건


이 예시 항목은 필요한 것이 매우 적다.
  • 컴퓨터에 설치된 Docker(V19.03.2 이상)
  • 노드 v10 이상.
  • Docker 명령에 대한 기본 지식입니다.
  • Ngrok 또는 그 어떠한 무료 터널 서비스도 웹에 로컬 호스트를 공개하는 데 사용
  • 나는 Mac OSX 11.4에서 이 프로젝트를 한다.

    Express Gateway의 Docker 이미지를 가져오고 실행합니다.


    터미널에서 다음 명령을 실행하여 docker 이미지를 추출합니다.docker pull express-gateway이미지를 드래그한 후 폴더를 만들고 해당 이름을 Config로 지정합니다.이 폴더의terminal을 열고 다음 명령을 실행합니다.touch gateway.config.yml touch system.config.yml먼저gateway에서 아래의 YAML 코드를 복사하고 붙여넣습니다.배치하다.yml.(나는 Supreme 텍스트 편집기를 사용해서 이 점을 실현했지만, 다른 텍스트 편집기는 모두 가능하다)
    http:
      port: 8080
    admin:
      port: 9876
      host: localhost
    apiEndpoints:
      api:
        host: localhost
        paths: '/ip'
    serviceEndpoints:
      httpbin:
       url: 'https://httpbin.org'
    policies:
      - basic-auth
      - cors
      - expression
      - key-auth
      - log
      - oauth2
      - proxy
      - rate-limit
    pipelines:
      default:
        apiEndpoints:
          - api
        policies:
        # Uncomment `key-auth:` when instructed to in the Getting Started guide.
        # - key-auth:
          - proxy:
              - action:
                  serviceEndpoint: httpbin 
                  changeOrigin: true
    
    시스템에서 아래의 YAML 코드를 복사하여 붙여넣습니다.배치하다.yml 파일.
    # Core
    db:
      redis:
        emulate: true
        namespace: EG
    
    #plugins:
      # express-gateway-plugin-example:
      #   param1: 'param from system.config' 
    
    crypto:
      cipherKey: sensitiveKey
      algorithm: aes256
      saltRounds: 10
    
    # OAuth2 Settings
    session:
      secret: keyboard cat
      resave: false
      saveUninitialized: false
    accessTokens:
      timeToExpiry: 7200000
    refreshTokens:
      timeToExpiry: 7200000
    authorizationCodes:
      timeToExpiry: 300000
    
    
    이제 Config에서 models라는 다른 폴더를 만듭니다.terminal at models를 열고 다음 명령을 실행하여 세 개의 파일을 만듭니다.touch applications.json touch credentials.json touch users.json응용 프로그램에서 다음 코드를 복사하여 붙여넣습니다.json.
    {
      "$id": "http://express-gateway.io/models/applications.json",
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "redirectUri": {
          "type": "string",
          "format": "uri"
        }
      },
      "required": [
        "name"
      ]
    }
    
    그런 다음 자격 증명에 다음 코드를 복사하여 붙여넣습니다.json
    {
      "$id": "http://express-gateway.io/models/credentials.json",
      "type": "object",
      "definitions": {
        "credentialBase": {
          "type": "object",
          "properties": {
            "autoGeneratePassword": {
              "type": "boolean",
              "default": true
            },
            "scopes": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "autoGeneratePassword"
          ]
        }
      },
      "properties": {
        "basic-auth": {
          "allOf": [
            {
              "$ref": "#/definitions/credentialBase"
            },
            {
              "type": "object",
              "properties": {
                "passwordKey": {
                  "type": "string",
                  "default": "password"
                }
              },
              "required": [
                "passwordKey"
              ]
            }
          ]
        },
        "key-auth": {
          "type": "object",
          "properties": {
            "scopes": {
              "type": [
                "string",
                "array"
              ],
              "items": {
                "type": "string"
              }
            }
          }
        },
        "jwt": {
          "type": "object",
          "properties": {}
        },
        "oauth2": {
          "allOf": [
            {
              "$ref": "#/definitions/credentialBase"
            },
            {
              "type": "object",
              "properties": {
                "passwordKey": {
                  "type": "string",
                  "default": "secret"
                }
              },
              "required": [
                "passwordKey"
              ]
            }
          ]
        }
      }
    }
    
    마지막으로 사용자를 위해 아래의 코드를 복사하고 붙여넣습니다.json
    {
      "$id": "http://express-gateway.io/models/users.json",
      "type": "object",
      "properties": {
        "firstname": {
          "type": "string"
        },
        "lastname": {
          "type": "string"
        },
        "username": {
          "type": "string"
        },
        "email": {
          "type": "string",
          "format": "email"
        },
        "redirectUri": {
          "type": "string",
          "format": "uri"
        }
      },
      "required": [
        "username",
        "firstname",
        "lastname"
      ]
    }
    
    본문에서 우리는 네트워크 스위치만 설정할 것이다.배치하다.yml 파일.docker를 설정하고 실행한 후에, 나는 이 점을 상세하게 소개할 것이다.
    현재 우리의 설정 폴더가 준비되어 있습니다. 다음 Docker 명령을 실행하여 Docker 용기를 시작합니다.docker run -d --name express-gateway \
    -v /Users/naseef/Config:/var/lib/eg \
    -p 8080:8080 \
    -p 9876:9876 \
    express-gateway
    Express Gateway Docker 컨테이너가 제대로 작동하려면 구성 파일과 볼륨이 포함된 볼륨을 마운트해야 합니다.모든 구성 파일과 볼륨을 포함하는 구성 폴더가 마운트됩니다.위 Docker의/Users/naseef/Config를 사용자 고유의 구성 폴더 경로로 바꾸십시오.
    express gateway라는 Docker 컨테이너를 시작하고 실행합니다.실행 중인지 확인하려면 터미널에서 docker ps 실행하고 검사하십시오.

    두 개의 단점을 가진 간단하고 다른 마이크로 서비스를 만들다


    우리는 두 개의 GET 끝점을 우리의 마이크로 서비스로 만들 것이다.
    선택한 디렉토리에 Actor라는 폴더를 만듭니다.이 폴더에 Express 서버를 설치합니다.나는 npm init 명령을 사용하여 가방을 설정했다.json, 하지만 Express 서버를 설정하는 다른 방법을 선택할 수 있습니다.
    패키지를 작성할 때json, Actor에서 실행npm install express --save하여 Express를 설치합니다.
    actor라는 파일을 만듭니다.js를 붙이고 다음 코드를 붙여넣으십시오.
    let express = require('express');
    let app = express();
    app.listen(3000, () => {
     console.log("Server running on port 3000");
    });
    
    app.get("/actors", (req, res, next) => {
        let array_actors = [
            "Tom Cruise",
            "Johnny Depp",
            "Di Caprio",
            "Russel Crowe",
            "Tom Hanks"
        ];
        res.json(array_actors);
    });
    
    
    실행node actor.js 로컬 호스트의 포트 3000에서 서버를 시작합니다.이 URL을 사용하여 브라우저를 클릭하십시오. (또는 Postman을 사용하십시오.)http://localhost:3000/actors .
    결과는 이랬을 거야.
    [
        "Tom Cruise",
        "Johnny Depp",
        "Di Caprio",
        "Russel Crowe",
        "Tom Hanks"
    ]
    
    위에서 영화 폴더를 만드는 것과 같은 방식으로 Express 서버를 설정하고 무비라는 파일을 만듭니다.js.영화에 다음 코드를 추가합니다.js 파일
    let express = require('express');
    let app = express();
    app.listen(8000, () => {
     console.log("Server running on port 8000");
    });
    app.get("/movies", (req, res, next) => {
        let array_movies = [
            "Mission Impossible",
            "Pirates of Carribean",
            "Inception",
            "Gladiator",
            "The Terminal"
        ];
        res.json(array_movies);
    });
    
    
    실행node movie.jslocalhost의 포트 8000에서 이 서버를 시작합니다.이 URL을 사용하여 브라우저를 클릭하십시오. (또는 Postman을 사용하십시오.)http://localhost:8000/movies .
    출력은 이렇습니다.
    [
        "Mission Impossible",
        "Pirates of Carribean",
        "Inception",
        "Gladiator",
        "The Terminal"
    ]
    

    Ngrok은 GET 끝점을 웹에 공개합니다.


    Ngrok을 사용하여 웹에서 포트 3000과 8000을 공개합니다.두 개의 Ngrok 세션을 동시에 실행할 때 문제가 발생하면 다음 단계link를 따르십시오.
    나는 Ngrok을 통해 웹에 공개된 API의 세부 사항을 본 강좌의 범위에서 제외할 것이다.
    Ngrok을 사용하여 단점을 공개한 후, 우리는 다음과 같은 서비스의 단점을 가지고 있습니다.
    영화 서비스: http://412143bfb37a.ngrok.io/movies배우 서비스: http://eed882f0ffe3.ngrok.io/actors현재 우리는 두 개의 실행 중인 마이크로 서비스가 있으니, 우리의 스위치를 설정할 때가 되었다.배치하다.yml 파일은 이 두 서비스를 통해 정지됩니다.

    게이트웨이를 구성합니다.배치하다.Express Gateway의 yml 파일


    Express Gateway는 클라이언트로부터 요청을 받아 특정 요청을 담당하는 마이크로 서비스로 안내합니다.예를 들어 인터넷 게이트웨이http://localhost:8080/actors를 통해 요청을 하면 배우 마이크로 서비스로, 예를 들어http://localhost:8080/movies의 요청은 영화 마이크로 서비스로 지정된다.한 마디로 하면 모든 요청은 서버를 통해 받아들여지고 서로 다른 호스트로 지정된다.이를 위해 Docker를 설정합니다.

    게이트웨이에 엔드포인트 공개

  • 구성 폴더로 이동
  • 게이트웨이를 엽니다.배치하다.yml 파일.
  • apiEndpoints 부분에서 호스트와 경로를 정의하는 "actors"라는 API 노드를 만듭니다.정의된 경로는 우리가 일치하는 경로 그룹입니다.이것은 일치하는 경로 모드의 모든 URL을 덮어씁니다.movies 단점에 대해 같은 동작을 반복합니다.호스트 이름과 경로 일치 모드에 대한 자세한 내용은 Express Gateway 엔드포인트documentation를 참조하십시오.
    이를 통해 Express gateway는 이 형식http://localhost:8080/actors’ 또는 http://localhost:8080/actors/*’의 외부 API(클라이언트의 요청)를 수락할 수 있습니다.

    게이트웨이의 서비스 엔드포인트 생성


    서비스 포트는 우리의 마이크로 서비스의 포트이고 본 예에서 배우와 영화의 마이크로 서비스이다.API 엔드포인트의 외부 요청이 서비스 엔드포인트로 전달됩니다.서비스Endpoints 섹션에서는 동일한 게이트웨이에 계속 있습니다.배치하다.yml 파일, 서비스를 만들고 URL을 정의합니다.참여자에 대해 우리는 그 서비스 노드를 actor 서비스라고 부르고 그 노드http://eed882f0ffe3.ngrok.io’를 추가한다.영화 서비스 노드에 대해 같은 조작을 반복하다.

    이 긴 문장을 완성하라!


    이제 API 포트와 서비스 포트를 연결합시다.파이핑 섹션에서 구성됩니다.이것이 바로 우리가 API 포트와 서비스 포트를 연결하는 곳이다.
    기본값은 미리 정의된 것이기 때문에 기본값만 정의할 수 있습니다.기본 파이프를 복사하고 붙여넣은 다음 세부 사항을 변경할 수 있습니다.우리는 파이프를'actorPipeline'이라고 명명하고 단점 이름, 즉'actors'를 추가합니다.actorPipeline 파이프의 프록시 정책에서 서비스Endpoint를 찾고 서비스 노드 이름, 즉 "actor 서비스"를 추가합니다.영화 파이프라인에 이 과정을 반복합니다.
    http:
      port: 8080
    admin:
      port: 9876
      host: localhost
    apiEndpoints:
      api:
        host: localhost
        paths: '/ip'
      actors:
        host: localhost
        paths: ['/actors','/actors/*']
      movies:
        host: localhost
        paths: ['/movies','/movies/*'] 
    
    serviceEndpoints:
      httpbin:
       url: 'https://httpbin.org'
      actorService:
       url: 'http://eed882f0ffe3.ngrok.io'
      movieService:
       url: 'http://412143bfb37a.ngrok.io'   
    policies:
      - basic-auth
      - cors
      - expression
      - key-auth
      - log
      - oauth2
      - proxy
      - rate-limit
    pipelines:
      actorPipeline:
        apiEndpoints:
          - actors
        policies:
        # Uncomment `key-auth:` when instructed to in the Getting Started guide.
        # - key-auth:
          - proxy:
              - action:
                  serviceEndpoint: actorService 
                  changeOrigin: true
      moviePipeline:
        apiEndpoints:
          - movies
        policies:
        # Uncomment `key-auth:` when instructed to in the Getting Started guide.
        # - key-auth:
          - proxy:
              - action:
                  serviceEndpoint: movieService 
                  changeOrigin: true
      default:
        apiEndpoints:
          - api
        policies:
        # Uncomment `key-auth:` when instructed to in the Getting Started guide.
        # - key-auth:
          - proxy:
              - action:
                  serviceEndpoint: httpbin 
                  changeOrigin: true
    
    현재 우리의 모든 시스템이 다 준비되었다.게이트웨이를 저장합니다.배치하다.yml 파일 및 Docker 컨테이너를 다시 시작합니다.docker restart express-gateway
    Ngrok 및 노드 서비스가 실행 중일 것입니다.만일 모든 기능이 정상이라면, 우리는 URL을 사용하여 정확한 출력을 얻어야 한다http://localhost:8080/actors http://localhost:8080/movies이것은 Docked Express gateway를 사용하여 마이크로 서비스 프로그램을 만드는 끝입니다.만약 당신이 어떤 잘못이나 어려움에 부딪히면 언제든지 아래에서 평론을 발표하십시오.
    감사합니다.즐거움 코드

    좋은 웹페이지 즐겨찾기