Battle One - 마이크로서비스 전투지

1. 소개

최종 업데이트: 2020년 8월 26일

마이크로서비스 배틀 아레나

눈싸움을 하면서 돌아다니며 다른 사람에게 눈덩이를 장난으로 던져 본 적이 있으신가요? 그렇지 않다면 언젠가 사용해 보세요. 그러나 이제 물리적으로 공격을 받을 위험 없이, 네트워크에 액세스할 수 있는 소규모 서비스 (마이크로서비스)를 빌드할 수 있습니다. 이 서비스는 다른 마이크로서비스와의 대대적인 전투에 참여할 수 있습니다. SpringOne에서 이 마이크로서비스 대결을 개최할 예정이므로 마이크로서비스가 눈덩이 대신 잎을 던져 버릴 것입니다.

혹시... 그렇다면 마이크로서비스는 어떻게 다른 마이크로서비스에서 도움을 받을 수 있을까요? 마이크로서비스는 일반적으로 HTTP를 통해 네트워크 요청을 수신하고 응답을 반환할 수 있습니다. '경기장 관리자'가 있습니다. 그러면 마이크로서비스가 수행할 작업을 지정하는 명령어로 응답합니다.

물론 수상은 성공이지만 그 과정에서 Google Cloud에서 마이크로서비스를 빌드하고 배포하는 방법을 배우게 됩니다.

사용 방법

원하는 기술 (또는 Java, Kotlin, Scala 시작 조건 중에서 선택)을 사용하여 마이크로서비스를 빌드한 다음 Google Cloud에 마이크로서비스를 배포합니다. 배포가 완료되면 양식을 작성하여 마이크로서비스의 URL을 알려주시면 해당 부분이 현장에 추가됩니다.

아레나에는 특정 전투에 참여한 모든 플레이어가 있습니다. SpringOne 컨퍼런스는 자체 아레나를 개최합니다. 각 플레이어는 이리저리 움직이고 다른 플레이어에게 잎을 던지는 마이크로서비스를 나타냅니다.

아레나 관리자가 1초에 한 번씩 마이크로서비스를 호출하여 현재의 경기장 상태 (플레이어의 위치)를 전송하고, 마이크로서비스는 수행할 작업을 위한 명령을 보냅니다. 아레나에서 앞으로 움직이거나, 좌우로 돌리거나, 잎사귀를 던질 수 있습니다. 나뭇잎을 던지면 플레이어가 향하는 방향으로 최대 세 공간까지 날아갑니다. 리프가 '받으면' 다른 플레이어가 득점하면 던져 1점을 얻고 타격을 받은 플레이어는 1점을 잃습니다. 아레나 크기는 현재 플레이어 수에 따라 자동으로 조정됩니다.

이전 경기장의 모습은 다음과 같습니다.

20628e6bd442bd11.png

배틀 원 아레나 예시

순환 충돌

경기장에서는 여러 플레이어가 충돌하는 작업을 수행하려고 할 수 있습니다. 예를 들어 두 플레이어가 동일한 공간으로 이동하려고 할 수 있습니다. 충돌이 발생하는 경우 응답 시간이 가장 빠른 마이크로서비스가 우선합니다.

전투 보기

라이브 경기장에서 마이크로서비스의 성능을 확인하세요.

Battle API

아레나 관리자와 협업하려면 마이크로서비스가 경기장에 참가하기 위한 특정 API를 구현해야 합니다. 아레나 관리자는 HTTP POST의 현재 경기장 상태를 사용자가 제공한 URL로 다음 JSON 구조로 보냅니다.

{
  "_links": {
    "self": {
      "href": "https://YOUR_SERVICE_URL"
    }
  },
  "arena": {
    "dims": [4,3], // width, height
    "state": {
      "https://A_PLAYERS_URL": {
        "x": 0, // zero-based x position, where 0 = left
        "y": 0, // zero-based y position, where 0 = top
        "direction": "N", // N = North, W = West, S = South, E = East
        "wasHit": false,
        "score": 0
      }
      ... // also you and the other players
    }
  }
}

HTTP 응답은 상태 코드 200 (OK)이어야 하며 다음 동작을 포함하는 응답 본문은 다음 중 하나의 단일 대문자로 인코딩되어야 합니다.

F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw

다음은 마이크로서비스 및 기타 애플리케이션을 실행하기 위한 Google Cloud 서비스인 Cloud Run에 마이크로서비스를 배포하는 방법을 살펴보겠습니다.

2. Google Cloud에 로그인합니다.

Cloud Run에서 마이크로서비스를 배포하려면 Google Cloud에 로그인해야 합니다. 계정에 크레딧이 적용되며 신용카드를 입력하지 않아도 됩니다. G Suite 관리자가 사용자가 특정 Google Cloud 기능을 사용하지 못하도록 차단하는 경우가 있으므로 G Suite 계정 대신 개인 계정 (예: gmail.com)을 사용하는 것이 일반적으로는 문제가 덜합니다. 또한 사용할 웹 콘솔은 Chrome이나 Firefox에서 잘 작동하지만 Safari에서는 문제가 발생할 수 있습니다.

3. 마이크로서비스 배포

마이크로서비스를 원하는 기술로 빌드하고 공개적으로 연결할 수 있고 Battle API를 준수하는 한 어디에나 배포할 수 있습니다. 하지만 편의를 위해 샘플 서비스에서 시작하여 Cloud Run에 배포할 수 있도록 도와드리겠습니다.

시작할 샘플을 선택하세요.

시작할 수 있는 전투 마이크로서비스 샘플에는 두 가지가 있습니다.

Java 및 스프링 부트

소스

Cloud Run에 배포

Kotlin 및 스프링 부트

소스

Cloud Run에 배포

시작할 샘플을 결정한 후 'Cloud Run에 배포'를 클릭합니다. 버튼을 클릭합니다. 그러면 Cloud Shell (클라우드의 가상 머신에 대한 웹 기반 콘솔)이 실행되며, 여기에서 소스를 클론한 후 배포 가능한 패키지 (Docker 컨테이너 이미지)에 빌드한 다음 Google Container Registry에 업로드한 다음 Cloud Run에 배포합니다.

메시지가 표시되면 us-central1 리전을 지정합니다.

아래 스크린샷은 마이크로서비스 빌드 및 배포를 위한 Cloud Shell 출력을 보여줍니다.

d88e40430706a32b.png

마이크로서비스 작동 확인

Cloud Shell에서 새로 배포된 마이크로서비스에 요청을 하여 YOUR_SERVICE_URL을 서비스의 URL로 바꿉니다('Your application is now live here' 줄 뒤에 있는 Cloud Shell의 URL).

curl -d '{
  "_links": {
    "self": {
      "href": "https://foo.com"
    }
  },
  "arena": {
    "dims": [4,3],
    "state": {
      "https://foo.com": {
        "x": 0,
        "y": 0,
        "direction": "N",
        "wasHit": false,
        "score": 0
      }
    }
  }
}' -H "Content-Type: application/json" -X POST -w "\n" \
  https://YOUR_SERVICE_URL

F, L, R, T 중 하나의 응답 문자열이 표시됩니다.

4. 아레나 등록 요청

경기장에 참여하려면 이름, Cloud Run 서비스 URL, 그리고 원하는 경우 아바타 / 프로필 사진에 대한 GitHub 사용자 이름을 포함하여 #3-sponsor-google-cloud Slack 채널에 메시지를 보내야 합니다. 정보가 확인되면 플레이어가 경기장에 나타납니다.

5. 제조사 및 변경사항 배포

변경하기 전에 Cloud Shell에서 GCP 프로젝트 및 사용한 샘플에 대한 몇 가지 정보를 설정해야 합니다. 먼저 GCP 프로젝트를 나열합니다.

gcloud projects list

프로젝트가 하나만 있을 가능성이 높습니다. 첫 번째 열의 PROJECT_ID를 복사하여 다음 명령어에 붙여넣습니다 (YOUR_PROJECT_ID를 실제 프로젝트 ID로 대체). 이후 명령어에 사용할 환경 변수를 설정합니다.

export PROJECT_ID=YOUR_PROJECT_ID

이제 사용한 샘플에 또 다른 환경 변수를 설정합니다. 그러면 이후 명령어에서 올바른 디렉터리와 서비스 이름을 지정할 수 있습니다.

# Copy and paste ONLY ONE of these
export SAMPLE=java-springboot
export SAMPLE=kotlin-springboot

이제 Cloud Shell 내에서 마이크로서비스의 소스를 수정할 수 있습니다. Cloud Shell 웹 기반 편집기를 열려면 다음 명령어를 실행합니다.

cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md

그러면 변경 방법에 대한 추가 지침이 표시됩니다.

f910c9ef7b51c406.png

샘플 프로젝트가 열려 있는 편집기의 Cloud Shell

변경사항을 저장한 후 Cloud Shell에서 애플리케이션을 시작합니다.

cd cloudbowl-microservice-game/samples/$SAMPLE
./mvnw spring-boot:run

애플리케이션이 실행되면 새로운 Cloud Shell 탭을 열고 curl을 사용하여 서비스를 테스트합니다.

curl -d '{
  "_links": {
    "self": {
      "href": "https://foo.com"
    }
  },
  "arena": {
    "dims": [4,3],
    "state": {
      "https://foo.com": {
        "x": 0,
        "y": 0,
        "direction": "N",
        "wasHit": false,
        "score": 0
      }
    }
  }
}' -H "Content-Type: application/json" -X POST -w "\n" \
  http://localhost:8080

변경사항을 배포할 준비가 되면 pack 명령어를 사용하여 Cloud Shell에서 프로젝트를 빌드합니다. 이 명령어는 빌드팩을 사용하여 프로젝트 유형을 감지하고, 컴파일하고, 배포 가능한 아티팩트 (Docker 컨테이너 이미지)를 만듭니다.

pack build gcr.io/$PROJECT_ID/$SAMPLE \
  --path ~/cloudbowl-microservice-game/samples/$SAMPLE \
  --builder gcr.io/buildpacks/builder

이제 컨테이너 이미지를 만들었으므로 (Cloud Shell에서) Docker 명령어를 사용하여 Cloud Run에서 액세스할 수 있도록 컨테이너 이미지를 Google Container Registry로 푸시합니다.

docker push gcr.io/$PROJECT_ID/$SAMPLE

이제 Cloud Run에 새 버전을 배포합니다.

gcloud run deploy $SAMPLE\
          --project=$PROJECT_ID\
          --platform=managed\
          --region=us-central1\
          --image=gcr.io/$PROJECT_ID/$SAMPLE\
          --memory=512Mi\
          --allow-unauthenticated

이제 아레나에서 새 버전을 사용하게 됩니다!

6. 로컬에서 개발

다음 단계에 따라 자체 IDE를 사용하여 로컬에서 프로젝트를 작업할 수 있습니다.

  1. [Cloud Shell에서] 샘플을 압축합니다.

cd ~/cloudbowl-microservice-game/samples; zip -r cloudbowl-sample.zip $SAMPLE

  1. [Cloud Shell에서] ZIP 파일을 머신에 다운로드합니다.

cloudshell download-file cloudbowl-sample.zip

  1. [컴퓨터에서] 파일의 압축을 풀고 변경사항 테스트
  2. [머신에서] gcloud CLI 설치
  3. [컴퓨터에서] Google Cloud에 로그인합니다.

gcloud auth login

  1. [머신에서] 환경 변수 PROJECT_IDSAMPLE를 Cloud Shell과 동일한 값으로 설정합니다.
  2. [머신에서] Cloud Build를 사용하여 루트 프로젝트 디렉터리에서 컨테이너를 빌드합니다.

gcloud alpha builds submit . --pack=image=gcr.io/$PROJECT_ID/$SAMPLE

  1. [머신에서] 새 컨테이너를 배포합니다.

gcloud run deploy $SAMPLE --project=$PROJECT_ID --platform=managed --region=us-central1 --image=gcr.io/$PROJECT_ID/$SAMPLE --memory=512Mi --allow-unauthenticated

7. 축하합니다

수고하셨습니다. 다른 마이크로서비스와 싸울 수 있는 마이크로서비스를 빌드하고 배포했습니다. 행운을 빕니다!

학습 계속하기

참조 문서

8. FAQ

마이크로서비스가 현장에 표시되지 않는 이유는 무엇인가요?