docker에서 Kong 및 dotnet 코어의 API 게이트웨이 및 마이크로 서비스 사용

여보세요, 여러분,
이 문서를 읽고 있다면, API 게이트웨이가 무엇인지, 왜 필요한지 알 수 있습니다.없는 경우 스냅샷 버전whatis.techtarget.com을 기준으로 합니다.

An API gateway is programming that sits in front of an application programming interface (API) and acts as a single point of entry for a defined group of microservices. Because a gateway handles protocol translations, this type of front-end programming is especially useful when clients built with microservices make use of multiple, disparate APIs.

A major benefit of using API gateways is that they allow developers to encapsulate the internal structure of an application in multiple ways, depending upon use case. This is because, in addition to accommodating direct requests, gateways can be used to invoke multiple back-end services and aggregate the results.


본문에서 우리는

1. dotnet core에 마이크로 서비스를 만들고 docker 용기에 위탁 관리합니다.


2. 저희 마이크로 서비스에 docker compose 파일 만들기


3. docker에서 *Kong*을 설정합니다.


4. 홍콩을 통한 공개 서비스


자, 시작합시다.
이것은 우리가 이번 연습을 한 후에 실현할 최종 구조이다.

우리는 두 개의 마이크로 서비스가 있는데 하나는 DC에 사용되고 하나는 Marvel에 사용된다.우리는 이 위탁 관리를 우리의 내부 서버에 할 것이다.Google은 Kong API Gateway를 사용하여 네트워크 트래픽과 애플리케이션 트래픽으로 나뉘어 이러한 서비스를 외부에 공개할 것입니다.이 전화들은 서로 다른 노선, 우리, 응용 프로그램을 통해 우리 서비스에 들어갈 것이다.
다음은 내 프로젝트 폴더 구조입니다.

보시다시피 두 개의 마이크로 서비스를 저장하는 데 사용할 폴더가 두 개 있습니다. docker compse를 사용하여 docker에서 그것들을 위탁 관리할 것입니다.yaml 파일.

1. 마이크로 서비스 만들기


DC 서비스


첫 번째 마이크로 서비스, DC를 만들겠습니다.먼저 명령 프롬프트에서 폴더 "DC"를 탐색하고 다음 명령을 사용하여 API 프로젝트를 만듭니다.
dotnet new webapi
이것은 WeatherForecast controller가 있는 기본 웹api 프로젝트를 만들 것입니다.
API에 새 컨트롤러 추가JusticeLeague.cs
using Microsoft.AspNetCore.Mvc;

namespace DC.Controllers
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class JusticeLeague : ControllerBase
    {
        [HttpGet]
        public string Strongest(){
            return "Batman!";
        }
    }
}
문자열을 반환하는 간단한 HTTPGet API입니다.
dockerfile을 추가하면 프로젝트를 게시 모드로 구축하고 포트 7001에서 시작합니다.
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env

WORKDIR /app

COPY ./ ./
RUN dotnet restore DC.csproj

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
ENV ASPNETCORE_URLS=http://+:7001  
ENTRYPOINT ["dotnet", "DC.dll"]

이제 그것이 정상적으로 작동하는지 봅시다.
다음 명령을 실행하여 DC 서비스에 docker 이미지를 만들고 DC라는 이름으로 표시합니다.
docker build -t DC .

dc라는 용기에서 그것을 실행해서 테스트합시다
docker run -p 7001:7001 --name=dc dc
로컬 기기에서 포트 7001을 연결하고 포트 7001은 docker 용기에 있으며 docker 용기는 docker 파일에서 지정됩니다.
API를 통해 흔들림 페이지를 볼 수 있습니다.

Marvel 서비스


이제 명령 프롬프트에서 폴더 Marvel로 이동하고 명령 아래에서 실행하여 API 항목을 만듭니다.
dotnet new webapi
마찬가지로, 이것은 WeatherForecast controller가 있는 기본 웹api 프로젝트를 만들어야 합니다.
새로운 컨트롤러 복수자 추가.우리 API cs.
using Microsoft.AspNetCore.Mvc;
namespace Marvel.Controllers
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class Avengers: ControllerBase
    {
        [HttpGet]
        public string Strongest(){
            return "Iron Man!";
        }
    }
}
최강 복수자로 돌아가는 간단한 API다.
현재, 우리가 이전에 했던 것처럼, docker 파일을 추가하면, 필요한 이미지를 끌어다 놓고, 발표 모드로 프로젝트를 구축하고, 포트 7002에서 시작합니다.
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env

WORKDIR /app

COPY ./ ./
RUN dotnet restore Marvel.csproj

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
ENV ASPNETCORE_URLS=http://+:7002  
ENTRYPOINT ["dotnet", "Marvel.dll"]

이제 그것이 정상적으로 작동하는지 봅시다.
다음 명령을 실행하여 DC 서비스에 docker 이미지를 만들고 DC라는 이름으로 표시합니다.
docker build -t marvel.

Marvel이라는 용기에서 그것을 실행해서 테스트합시다
docker run -p 7002:7002 --name=marvel marvel
로컬 기기에서 포트 7001을 연결하고 포트 7001은 docker 용기에 있으며 docker 용기는 docker 파일에서 지정됩니다.
API를 통해 흔들림 페이지를 볼 수 있습니다.

그래!
현재, 우리는 단독 docker 파일을 가진 docker 용기에서 우리의 마이크로 서비스를 테스트했다.

2단계 - Docker Compose를 사용하여 Docker에서 서비스 호스팅


수동 호출에서 벗어나기 위해 docker compose 파일을 만들 것입니다.
docker compose를 만듭니다.yaml 파일, 다음 내용을 추가합니다.
version: '3.7'
services: 
    dcservice:
        container_name: DC
        build: 
            context: ./DC
            dockerfile: dockerfile
        ports: 
          - "7001:7001"
    marvelservice:
        container_name: Marvel
        build: 
            context: ./Marvel
            dockerfile: dockerfile
        ports: 
          - "7002:7002"
networks: 
  default:
    name: kong-comic-net

여기에서 우리는 두 개의 서비스, DC와 Marvel을 창설했다.우리는 docker 파일의 상하문 기능을 사용하고 있습니다. 이렇게 하면 우리가 만든 docker 파일을 사용하여 해당하는 폴더에 저장하고 실행할 때 같은 포트를 분배할 수 있습니다.
더 중요한 것은 Kong comic net이라는 새로운 네트워크를 만들고 이 두 서비스를 이 네트워크에 연결하는 것입니다.본문의 뒷부분에서 나는 홍콩을 위해 같은 네트워크를 사용할 것이다.
이제 이 설정을 다시 테스트해 봅시다.
docker-compose build
이것은 두 서비스의 이미지를 구성하기 위해 각각의 DockerFile을 사용해야 합니다.
그리고 나서
docker-compose up
이 그림을 사용해서 용기를 만들고 노출 포트 7001과 7002를 통해 용기를 실행해야 합니다.

3단계 - Docker에서 구멍 설정하기


Kong Gateway(OSS)는 오픈소스의 경량급 API 게이트웨이로 마이크로 서비스에 최적화되어 비교할 수 없는 지연, 성능과 확장성을 제공한다.
기본적으로 Kong Gateway는 구성된 프록시 포트 8000과 8443에서 트래픽을 수신합니다.또한 수신된 클라이언트 API 요청을 평가하여 적절한 백엔드 API로 라우팅합니다.루트 요청과 응답을 제공하는 동시에 필요에 따라 플러그인을 통해 정책을 적용할 수 있습니다.
설정부터 시작합시다.
이 순서대로 다음 명령을 실행하고 docker에서 PostgreSQL DB를 사용하여 KONG를 설정합니다.

I got these from the official documentation.


데이터베이스 시작
docker run -d --name kong-database --network=kong-comic-net -p 5432:5432 -e "POSTGRES_USER=kong" -e "POSTGRES_DB=kong"  -e "POSTGRES_PASSWORD=kong" postgres:9.6

데이터베이스 준비
docker run --rm --network=kong-comic-net  -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_USER=kong" -e "KONG_PG_PASSWORD=kong"  kong:latest kong migrations bootstrap

홍콩 가동
docker run -d --name kong --network=kong-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_USER=kong" -e "KONG_PG_PASSWORD=kong" -e "KONG_PROXY_ACCESS_LOG=/dev/stdout"  -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout"      -e "KONG_PROXY_ERROR_LOG=/dev/stderr"      -e "KONG_ADMIN_ERROR_LOG=/dev/stderr"      -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl"      -p 8000:8000      -p 8443:8443     -p 127.0.0.1:8001:8001     -p 127.0.0.1:8444:8444      kong:latest

작동 여부를 확인합니다.
curl -i http://localhost:8001/
200OK 응답이 반환됩니다.즉, Kong이 시작되고 실행되어 구성할 준비가 되었습니다.

4단계 - 홍콩 게이트웨이를 통한 공개 서비스


API에 대한 서비스 추가부터 시작하겠습니다.

Service and Route objects let you expose your services to clients with Kong Gateway. When configuring access to your API, you’ll start by specifying a Service. In Kong Gateway, a Service is an entity representing an external upstream API or microservice — for example, a data transformation microservice, a billing API, and so on.

The main attribute of a Service is its URL, where the service listens for requests. You can specify the URL with a single string, or by specifying its protocol, host, port, and path individually.


API "DC"에 대한 서비스를 추가합니다.
curl -i -X POST http://localhost:8001/services --data name=DC --data url="http://DC:7001/"

'201 생성됨'에 대한 응답이 있을 것입니다.

이 서비스에 대한 요청을 시작하기 전에 루트를 추가해야 합니다.루트는 요청이 홍콩 게이트웨이에 도착한 후 어떻게 (또는) 그 서비스로 발송될지 결정한다.한 서비스에 여러 노선이 있을 수 있다.
저희 서비스에 브라우저 기반 웹 애플리케이션(DC 웹)과 모바일 애플리케이션(DC app) 두 가지 경로를 추가합니다.
curl -i -X POST http://localhost:8001/services/DC/routes   --data "paths[]=/DC-Web"   --data name=DC-Web

그리고
curl -i -X POST http://localhost:8001/services/DC/routes   --data "paths[]=/DC-App"   --data name=DC-App

이제 라우팅이 생겨서 포트 8000에서 API에 액세스할 수 있습니다.



유사한 노선에서, 우리는 우리의 'Marvel' 서비스를 위해 서비스를 만들 수 있다
curl -i -X POST http://localhost:8001/services --data name=Marvel --data url="http://Marvel:7002/"

웹과 응용 프로그램에 루트를 추가합니다.
curl -i -X POST http://localhost:8001/services/Marvel/routes   --data "paths[]=/Marvel-Web"   --data name=Marvel-Web
curl -i -X POST http://localhost:8001/services/Marvel/routes   --data "paths[]=/Marvel-App"   --data name=Marvel-App
현재 우리는 서로 다른 노선에서 오는 유량을 각각 제어하고 관리할 수 있다.
다음 섹션에서는 Kong용 플러그 인에 대해 설명합니다.
읽어주셔서 감사합니다.당신의 의견을 나누세요.

좋은 웹페이지 즐겨찾기