1. 소개
최종 업데이트: 2020년 2월 12일
마이크로서비스 배틀 아레나
눈싸움에서 이리저리 움직이며 다른 사람에게 장난스럽게 눈덩이를 던진 적이 있나요? 아직 사용해 보지 않았다면 언젠가 사용해 보세요. 하지만 이제 물리적으로 맞을 위험을 감수하는 대신 다른 마이크로서비스와의 장대한 전투에 참여하는 작고 네트워크 액세스 가능한 서비스 (마이크로서비스)를 구축할 수 있습니다. 첫 번째 마이크로서비스 배틀은 조지아주 애틀랜타에서 개최되므로 마이크로서비스는 눈덩이 대신 복숭아를 던집니다.
다음과 같은 궁금증이 있을 수 있습니다. 하지만 마이크로서비스가 다른 마이크로서비스에 '복숭아'를 던지는 방법은 무엇일까요? 마이크로 서비스는 네트워크 요청 (일반적으로 HTTP를 통해)을 수신하고 응답을 반환할 수 있습니다. 아레나의 현재 상태를 마이크로서비스에 전송하는 '아레나 관리자'가 있으며, 마이크로서비스는 수행할 작업을 지정하는 명령어로 응답합니다.
물론 목표는 승리하는 것이지만 그 과정에서 Google Cloud에서 마이크로서비스를 빌드하고 배포하는 방법을 배우게 됩니다.
작동 방식
원하는 기술로 마이크로서비스를 빌드하거나 Java, Kotlin, Scala 스타터 중에서 선택한 후 Google Cloud에 마이크로서비스를 배포합니다. 배포가 완료되면 양식을 작성하여 마이크로서비스의 URL을 알려주세요. 그러면 Google에서 아레나에 추가해 드립니다.
아레나에는 특정 전투의 모든 플레이어가 포함됩니다. DevNexus 컨퍼런스의 경우 날짜별로 하나의 경기장이 있습니다. 각 플레이어는 이동하면서 다른 플레이어에게 복숭아를 던지는 마이크로서비스를 나타냅니다.
아레나 관리자는 1초에 한 번씩 마이크로서비스를 호출하여 현재 아레나 상태 (플레이어가 있는 위치)를 전송하고, 마이크로서비스는 수행할 작업에 관한 명령어로 응답합니다. 아레나에서 앞으로 이동하거나, 왼쪽이나 오른쪽으로 회전하거나, 복숭아를 던질 수 있습니다. 던진 복숭아는 플레이어가 향하는 방향으로 최대 3칸 이동합니다. 복숭아가 다른 플레이어에게 '맞으면' 던진 플레이어는 1점을 얻고 맞은 플레이어는 1점을 잃습니다. 아레나 크기는 현재 플레이어 수에 따라 자동으로 조정됩니다.
다음은 3명의 가상 플레이어가 있는 경기장의 모습입니다.

배틀 피치 아레나 예시
순환되는 충돌
아레나에서는 여러 플레이어가 충돌하는 작업을 수행하려고 할 수 있습니다. 예를 들어 두 플레이어가 동일한 공간으로 이동하려고 할 수 있습니다. 충돌이 발생하면 응답 시간이 가장 빠른 마이크로서비스가 우선합니다.
전투 시청하기
전투에서 마이크로서비스가 어떻게 진행되고 있는지 확인하려면 라이브 경기장을 확인하세요.
Battle API
아레나 관리자를 사용하려면 마이크로서비스가 아레나에 참여할 수 있도록 특정 API를 구현해야 합니다. 아레나 관리자는 다음 JSON 구조를 사용하여 HTTP POST로 현재 아레나 상태를 제공된 URL로 전송합니다.
{
"_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. 마이크로서비스 배포
공개적으로 연결 가능하고 Battle API를 준수하는 한 어떤 기술로든 마이크로서비스를 빌드하고 어디에나 배포할 수 있습니다. 간단하게 시작하려면 무작위 명령어를 선택하는 샘플 프로젝트로 시작하면 됩니다.
시작할 샘플 선택
다음 세 가지 배틀 마이크로서비스 샘플을 시작할 수 있습니다.
Java 및 Spring Boot | ||
Java 및 Quarkus | ||
Kotlin 및 Micronaut | ||
Kotlin 및 Quarkus | ||
Scala 및 Play Framework | ||
Go |
시작할 샘플을 결정한 후 위의 'Cloud Run에 배포' 버튼을 클릭합니다. 그러면 소스가 클론되는 Cloud Shell (클라우드에 있는 가상 머신에 대한 웹 기반 콘솔)이 실행되고, 소스가 배포 가능한 패키지 (Docker 컨테이너 이미지)로 빌드된 후 Google Container Registry에 업로드되고 Cloud Run에 배포됩니다.
메시지가 표시되면 us-central1 리전을 지정합니다.
아래 스크린샷은 마이크로서비스 빌드 및 배포를 위한 Cloud Shell 출력을 보여줍니다.

마이크로서비스가 작동하는지 확인하기
Cloud Shell에서 새로 배포된 마이크로서비스에 요청할 수 있습니다. YOUR_SERVICE_URL를 서비스 URL로 바꿉니다 (서비스 URL은 'Your application is now live here' 줄 뒤에 Cloud Shell에 있음).
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의 응답 문자열이 표시됩니다.
아레나에 포함되도록 요청
아레나에 참여하려면 간단한 양식을 작성해야 합니다. 가장 어려운 부분은 프로필 이미지로 사용할 항목을 결정하는 것입니다. GitHub 이미지, LinkedIn 이미지를 사용하거나 Google에서 임의의 아바타를 선택할 수 있습니다. 제출된 내용을 검토한 후 플레이어가 아레나에 표시됩니다.
변경사항 적용 및 배포
변경하려면 사용한 GCP 프로젝트와 샘플에 관한 정보를 Cloud Shell에 설정해야 합니다. 먼저 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-micronaut export SAMPLE=scala-play
이제 Cloud Shell에서 마이크로서비스의 소스를 수정할 수 있습니다. Cloud Shell 웹 기반 편집기를 열려면 다음 명령어를 실행합니다.
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
그러면 변경사항을 적용하기 위한 추가 안내가 표시됩니다.

샘플 프로젝트가 열린 편집기가 있는 Cloud Shell
변경사항을 저장한 후 Cloud Shell에서 pack 명령어를 사용하여 프로젝트를 빌드합니다. 이 명령어는 빌드팩을 사용하여 프로젝트 유형을 감지하고, 컴파일하고, 배포 가능한 아티팩트 (Docker 컨테이너 이미지)를 만듭니다.
pack build gcr.io/$PROJECT_ID/$SAMPLE \ --path cloudbowl-microservice-game/samples/$SAMPLE \ --builder heroku/buildpacks
컨테이너 이미지가 생성되었으므로 Cloud Run에서 액세스할 수 있도록 Cloud Shell에서 docker 명령어를 사용하여 컨테이너 이미지를 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
이제 경기장에서 새 버전을 사용합니다.
3. 축하합니다
수고하셨습니다. 다른 마이크로서비스와 대결할 수 있는 마이크로서비스를 빌드하고 배포했습니다. 행운을 빕니다!