웹 서비스 만들기

이 페이지에서는 Golang으로 작성된 Gin 웹 프레임워크를 사용하여 VM에서 웹 서비스를 만드는 방법을 설명합니다. 사용하려는 다른 프레임워크에서 웹 서비스를 만들 수 있습니다.

  1. VM에서 Go 패키지를 다운로드하려면 VM에서 다음 명령어를 실행합니다.
    wget https://go.dev/dl/go1.22.5.linux-amd64.tar.gz
      
  2. VM에 Go를 설치합니다. 자세한 내용은 Go 설치를 참고하세요.
  3. 웹 서비스의 새 디렉터리를 만들려면 다음 명령어를 실행합니다.
    mkdir SERVICE_REPO
      cd SERVICE_REPO
      

추가 고려사항

웹 서비스를 만들 때는 다음 고려사항에 유의해야 합니다.

  • VM 생성 중에 필요한 입력은 환경 변수로 사용할 수 있으며 접두사는 CONNECTOR_ENV_입니다.
  • 웹 서비스를 설정할 때 환경 변수를 사용하여 이러한 값을 읽습니다.
  • VM을 만드는 동안 웹 서비스를 설정하는 데 필요한 값만 입력으로 가져와야 합니다.
  • 서비스의 포트는 CONNECTOR_ENV_PORT 변수에서 입력으로 가져와야 합니다.
  • 선택적 입력에는 다른 환경 변수를 사용합니다.
  • 연결을 만드는 동안 입력을 받을 수도 있습니다. 커스텀 커넥터를 만들 때 이러한 필드를 정의하고 각 API 호출에서 경로, 쿼리 또는 헤더로 전달할 수 있습니다.
  • 서버가 localhost에서 실행되는지 확인합니다.

로깅

필요한 정보를 로깅하고 로그를 Cloud Logging으로 푸시합니다. 이렇게 하면 커넥터 소비자가 오류를 추적하고 디버그하는 데 도움이 됩니다. Cloud Logging에 로그를 게시하려면 Go에서 사용할 수 있는 다음 Cloud Logging 클라이언트를 사용하면 됩니다. https://pkg.go.dev/cloud.google.com/go/logging#NewClient

수신되는 모든 요청을 추적하려면 메인에서 로거를 초기화하고 Gin에 미들웨어를 추가해야 합니다. 요청의 메서드, 경로, 상태, 지연 시간을 추적해야 합니다. 로그를 필터링하려면 로깅 중에 적절한 심각도를 사용하세요. 웹 서비스에서 환경 변수에서 로그 수준을 읽습니다. 로그 수준은 VM 생성 중에 선택적 입력으로 사용됩니다. 기본적으로 정보 로그를 사용할 수 있습니다. 로그 수준은 다음과 같습니다.

  • DEBUG: HTTP 요청/응답 트레이스를 비롯한 요청의 모든 부분을 로깅합니다.
  • INFO: 서비스 시작, 서비스 종료, 요청, 기타 정보를 로깅합니다.
  • ERROR: 요청 실패, 형식 지정 예외, 기타 오류를 기록합니다.

편리한 종료

서버가 정상적으로 종료되고 진행 중인 요청을 처리하도록 설정합니다. 서버를 단계적으로 다시 시작하거나 중지하는 방법에 대한 자세한 내용은 단계적 재시작 또는 중지를 참고하세요.

동시 실행

Gin 서버는 본질적으로 Go 루틴을 사용하여 동시 요청을 지원합니다. 기본적으로 Go 루틴은 정의되지 않은 수의 요청을 처리할 수 있습니다. 그러나 요청이 리소스를 많이 사용하는 것으로 예상되는 경우 작업자 풀을 사용하여 서버에서 요청을 제한하고 버퍼링합니다. 자세한 내용은 작업자 풀 예시를 참고하세요.

바이너리 테스트 및 빌드

  1. 다음 명령어를 사용하여 포트를 설정하고 서버를 실행합니다.
  2. EXPORT CONNECTOR_ENV_PORT = 8081
    go get .
    go run .

    이 명령어는 필요한 라이브러리를 번들로 묶고 서버를 실행합니다.

  3. 서버를 확인하려면 VM에서 다음 curl 명령어를 실행합니다.
    curl -X POST -H "Content-Type: application/json" -H "X-Custom-Header: MyValue" -d '{"name": "Alice", "address": "123 Main St", "gender": "F"}' http://localhost:8081/postData/456
    curl -v http://localhost:8081/getData -H "TestKey: MyValue"
  4. 다음 명령어를 사용하여 바이너리를 만들고 VM 이미지로 사용합니다.
    go build -o SERVICE_NAME
  5. 다음 명령어를 사용하여 바이너리를 루트 폴더로 이동합니다.
    sudo cp SERVICE_NAME /opt
  6. 다음 명령어를 사용하여 서비스를 다시 실행하여 바이너리가 예상대로 작동하는지 확인합니다.
    sudo chmod +x SERVICE_NAME
    ./SERVICE_NAME

애플리케이션 컨테이너화

  1. Docker를 설치합니다. 자세한 내용은 Docker 설치를 참고하세요.
  2. 바이너리를 실행할 Docker 파일을 만듭니다.
    FROM alpine:latest
    WORKDIR /opt
    COPY . .
    CMD ["./SERVICE_NAME"]
  3. 다음 명령어를 사용하여 커넥터 컨테이너를 빌드합니다.
    sudo docker build -t connector-container .
  4. docker 컨테이너를 실행합니다. 예상치 못한 오류가 발생할 경우 서비스를 다시 시작하려면 --restart=unless-stopped로 설정합니다.

컨테이너 수준 작업

docker 컨테이너를 실행하는 동안 gcplogs 로그 드라이버를 사용하여 stdout의 모든 로그를 Cloud Logging으로 라우팅할 수 있습니다. 이렇게 하면 서비스의 시작 또는 예기치 않은 오류 또는 종료를 추적하는 데 도움이 됩니다.

로그를 Cloud Logging으로 라우트하려면 다음 명령어를 실행합니다.
  sudo docker run --name connector-service -e
  CONNECTOR_ENV_PORT=$CONNECTOR_ENV_PORT -p
  $CONNECTOR_ENV_PORT:$CONNECTOR_ENV_PORT --restart=unless-stopped ----log-driver=gcplogs connector-container

다음 단계