1. 소개
최종 업데이트: 2021년 5월 6일
마이크로서비스 무지개 럼프스
눈싸움을 하면서 돌아다니며 다른 사람에게 눈덩이를 장난으로 던져 본 적이 있으신가요? 그렇지 않다면 언젠가 사용해 보세요. 그러나 이제 물리적으로 피해를 입는 위험을 감수하는 대신 네트워크에 액세스할 수 있는 소규모 서비스 (마이크로서비스)를 빌드할 수 있습니다. 이 서비스는 다른 마이크로서비스와의 대대적인 전투에 참여하여 눈덩이 대신 무지개를 던집니다.
궁금하실 수 있습니다. 그렇다면 마이크로서비스는 어떻게 다른 마이크로서비스에 대해 자세히 알아볼 수 있을까요? 마이크로 서비스는 일반적으로 HTTP를 통해 네트워크 요청을 수신하고 응답을 반환할 수 있습니다. 마이크로서비스에 경기장의 현재 상태를 전송하는 '경기장 관리자'가 있으며, 마이크로서비스는 할 일을 지정하는 명령어로 응답합니다.
물론 목표는 이기기 위함이지만 그 과정에서 Google Cloud에서 마이크로서비스를 빌드하고 배포하는 방법도 알아봅니다.
사용 방법
원하는 기술로 마이크로서비스를 빌드 (또는 Go, Java, Kotlin, Scala, NodeJS, Python 시작 조건 중에서 선택)한 다음 Google Cloud에 마이크로서비스를 배포합니다. 배포가 완료되면 개발자가 마이크로서비스의 URL을 알려주면 Google에서 아레나에 추가합니다.
아레나에는 특정 전투에 참여한 모든 플레이어가 있습니다. 레인보우 럼퍼스에는 전용 아레나가 있습니다. 각 플레이어는 이리저리 움직이고 다른 플레이어에게 무지개를 던지는 마이크로서비스를 나타냅니다.
아레나 관리자는 약 1초에 한 번 마이크로서비스를 호출하여 현재 아레나 상태(플레이어가 있는 위치)를 전송하고 마이크로서비스는 할 일을 명령으로 응답합니다. 아레나에서는 앞으로 이동하거나 왼쪽 또는 오른쪽으로 회전하거나 무지개를 던질 수 있습니다. 무지개가 플레이어가 바라보는 방향으로 최대 3칸 이동합니다. 무지개가 '히트'되면 다른 플레이어가 득점하면 던져 1점을 얻고 타격을 받은 플레이어는 1점을 잃습니다. 아레나 크기는 현재 플레이어 수에 따라 자동으로 조정됩니다.
이전 경기장의 모습은 다음과 같습니다.
예: 배틀 1 경기장
반복되는 분쟁
경기장에서 여러 플레이어가 상호 배타적인 작업을 시도할 수 있습니다. 예를 들어 두 플레이어가 동일한 공간으로 이동하려고 할 수 있습니다. 충돌이 발생하는 경우 응답 시간이 가장 빠른 마이크로서비스가 우선합니다.
전투 시청
마이크로서비스가 대회에서 어떤 실적을 내고 있는지 확인하려면 라이브 경기장을 확인하세요.
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에 로그인해야 합니다. Google에서 고객님의 계정에 크레딧을 적용해 드리며, 고객님은 신용카드를 입력하지 않으셔도 됩니다. G Suite 관리자가 사용자가 특정 Google Cloud 기능을 사용하지 못하도록 차단하는 경우가 있으므로 G Suite 계정 대신 개인 계정 (예: gmail.com)을 사용하는 것이 일반적으로는 문제가 덜합니다. 또한 사용할 웹 콘솔은 Chrome이나 Firefox에서 잘 작동하지만 Safari에서는 문제가 발생할 수 있습니다.
3. 마이크로서비스 배포
마이크로서비스를 공개적으로 연결할 수 있고 Battle API를 준수하는 한 어떤 기술로든 빌드하고 어디서나 배포할 수 있습니다. 하지만 간편하게 샘플 서비스를 시작하고 Cloud Run에 배포할 수 있도록 도와드리겠습니다.
시작할 샘플을 선택하세요.
시작할 수 있는 수많은 전투 마이크로서비스 샘플이 있습니다.
Kotlin 및 스프링 부트 | ||
Kotlin 및 마이크로노트 | ||
Kotlin 및 쿼커스 | ||
Java 및 Spring Boot | ||
Java 및 쿼커스 | ||
Go | ||
Node.js 및 급행 | ||
Python 및 Flask |
시작할 샘플을 결정한 후 'Cloud Run에 배포'를 클릭합니다. 버튼을 클릭합니다. 이렇게 하면 Cloud Shell(클라우드의 가상 머신에 대한 웹 기반 콘솔)이 실행되고 소스가 클론된 후 배포 가능한 패키지(Docker 컨테이너 이미지)로 빌드됩니다. 그런 다음 Google Container Registry에 업로드되고 Cloud Run에 배포됩니다.
메시지가 표시되면 us-central1
리전을 지정합니다.
아래 스크린샷은 마이크로서비스 빌드 및 배포의 Cloud Shell 출력을 보여줍니다.
마이크로서비스 작동 확인
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. 아레나 포함 요청
레인보우 럼퍼스에 참가하려면 아레나에 참가해야 합니다. rainbowrumpus.dev를 열고 마이크로서비스 URL을 입력할 아레나에서 '조인'을 클릭합니다.
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=kotlin-micronaut export SAMPLE=kotlin-quarkus export SAMPLE=kotlin-springboot export SAMPLE=java-quarkus export SAMPLE=java-springboot export SAMPLE=go export SAMPLE=nodejs export SAMPLE=python
이제 Cloud Shell 내에서 마이크로서비스의 소스를 수정할 수 있습니다. Cloud Shell 웹 기반 편집기를 열려면 다음 명령어를 실행합니다.
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
그러면 변경 방법에 대한 추가 지침이 표시됩니다.
샘플 프로젝트가 열려 있는 편집기의 Cloud Shell
변경사항을 저장한 후 README.md
파일의 명령어를 사용하여 Cloud Shell에서 애플리케이션을 시작합니다. 먼저 Cloud Shell에서 올바른 샘플 디렉터리에 있는지 확인합니다.
cd cloudbowl-microservice-game/samples/$SAMPLE
애플리케이션이 실행되면 새로운 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
변경사항을 배포할 준비가 되면 Cloud Shell에서 pack
명령어를 사용하여 프로젝트를 빌드합니다. 이 명령어는 빌드팩을 사용하여 프로젝트 유형을 감지하고 컴파일하며 배포 가능한 아티팩트(Docker 컨테이너 이미지)를 만듭니다.
# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID # and SAMPLE env vars. Otherwise, set them again. pack build gcr.io/$PROJECT_ID/$SAMPLE \ --path ~/cloudbowl-microservice-game/samples/$SAMPLE \ --builder gcr.io/buildpacks/builder
이제 컨테이너 이미지가 생성되었으므로 Cloud Shell에서 docker 명령어를 사용하여 컨테이너 이미지를 Google Container Registry에 푸시하여 Cloud Run에서 액세스할 수 있도록 합니다.
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 \ --allow-unauthenticated
이제 아레나에서 새 버전을 사용하게 됩니다!
6. 로컬에서 개발(선택사항)
다음 단계에 따라 자체 IDE를 사용하여 로컬에서 프로젝트를 작업할 수 있습니다.
- [Cloud Shell] 샘플을 압축합니다.
# Make sure the SAMPLE env var is still set. If not, re-set it. cd ~/cloudbowl-microservice-game/samples zip -r cloudbowl-sample.zip $SAMPLE
- [Cloud Shell에서] ZIP 파일을 머신에 다운로드합니다.
cloudshell download-file cloudbowl-sample.zip
- [컴퓨터에서] 파일의 압축을 푼 다음 변경사항을 적용하고 테스트합니다.
- [머신에서] gcloud CLI 설치
- [컴퓨터에서] Google Cloud에 로그인합니다.
gcloud auth login
- [머신에서] 환경 변수
PROJECT_ID
및SAMPLE
를 Cloud Shell과 동일한 값으로 설정합니다. - [머신에서] Cloud Build를 사용하여 컨테이너를 빌드합니다(루트 프로젝트 디렉터리에서).
gcloud alpha builds submit . \ --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \ --project=$PROJECT_ID
- [머신에서] 새 컨테이너를 배포합니다.
gcloud run deploy $SAMPLE \ --project=$PROJECT_ID \ --platform=managed \ --region=us-central1 \ --image=gcr.io/$PROJECT_ID/$SAMPLE \ --allow-unauthenticated
7. 지속적 배포
SCM 설정
마이크로서비스에 대해 팀과 공동작업할 수 있도록 GitHub를 설정합니다.
- GitHub에 로그인
- 새 저장소 만들기
- 로컬 머신에서 작업하는 경우 git 명령줄 인터페이스 (CLI) 또는 GitHub 데스크톱 GUI 애플리케이션 (Windows 또는 Mac)을 사용할 수 있습니다. Cloud Shell을 사용하는 경우 git CLI를 사용해야 합니다. GitHub에서 마이크로서비스의 코드를 가져오려면 CLI 또는 GitHub 데스크톱 안내를 따르세요.
git CLI로 코드 푸시하기
- 개인 액세스 토큰을 사용하는 git over https 지침을 따릅니다.
- 'repo'를 선택합니다. 범위
- git을 설정합니다.
git config --global credential.helper \ 'cache --timeout=172800' git config --global push.default current git config --global user.email "YOUR@EMAIL" git config --global user.name "YOUR NAME"
- GitHub 조직 및 저장소의 환경 변수 설정 (
https://github.com/ORG/REPO
)
export GITHUB_ORG=YOUR_GITHUB_ORG export GITHUB_REPO=YOUR_GITHUB_REPO
- 새 저장소에 코드 푸시
# Make sure the SAMPLE env var is still set. If not, re-set it. cd ~/cloudbowl-microservice-game/samples/$SAMPLE git init git add . git commit -m init git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git git branch -M main # This will now ask for your GitHub username & password # for the password use the personal access token git push -u origin main
- 변경한 후 변경사항을 커밋하고 GitHub로 푸시할 수 있습니다.
git add . git status git diff --staged git commit -am "my changes" git push
GitHub 데스크톱으로 코드 푸시
- 이전 '로컬에서 개발' 실습의 안내에 따라 코드를 다운로드합니다.
- GitHub 데스크톱을 설치하고 실행한 다음 로그인합니다.
- 새로 만든 저장소 클론
- 파일 탐색기를 열고 프로젝트를 새 저장소에 복사합니다.
- 변경사항 커밋
- GitHub에 기본 브랜치 게시
Cloud Run 지속적 배포 설정
이제 GitHub에서 SCM을 설정하여 새 커밋이 main
브랜치에 푸시될 때마다 Cloud Build가 변경사항을 자동으로 빌드하고 배포하도록 연속 배포를 설정할 수 있습니다. 배포 전에 테스트를 실행하는 지속적 통합을 추가할 수도 있지만, 즉시 사용 가능한 샘플에는 테스트가 포함되어 있지 않으므로 이 단계는 연습으로 남겨두었습니다.
- Cloud 콘솔에서 Cloud Run 서비스로 이동합니다.
- '지속적 배포 설정' 버튼을 클릭합니다.
- GitHub로 인증하고 마이크로서비스의 저장소 선택
- GitHub 저장소를 선택하고 브랜치를
^main$
로 설정합니다.
- 빌드팩을 사용하도록 빌드 유형 설정
- 저장을 클릭하여 지속적 배포를 설정합니다.
8. 관측 가능성
망가진다고. 관측 가능성을 통해 이러한 상황이 발생하는 시점을 파악하고 그 이유를 진단할 수 있습니다. 측정항목은 서비스의 상태 및 사용에 관한 데이터를 보여줍니다. 로그에는 서비스에서 내보낸 수동 계측 정보가 표시됩니다. 알림을 사용하면 문제가 발생할 때 알림을 받을 수 있습니다. 하나씩 자세히 살펴보겠습니다
측정항목
- Cloud Run 서비스 목록에서 서비스를 찾습니다.
- 서비스 이름을 클릭하여 측정항목 대시보드로 이동합니다.
- 측정항목의 ⋮ 메뉴를 클릭한 다음 '측정항목 탐색기에서 보기'를 선택합니다.
- 이제 리소스 측정항목, 필터, 그룹화, 기타 옵션을 변경할 수 있습니다. 예를 들어 모든 서비스의 평균 서비스 지연 시간을 확인할 수 있습니다.
로그
서비스의 STDOUT 출력이 Google Cloud Logging 시스템으로 전송됩니다. Cloud Run 서비스 관리 페이지에서 다음과 같은 기본 로그 보기에 액세스할 수 있습니다.
Cloud Run 로그에서 심각도별로 필터링하고 로그를 필터링할 수 있습니다. 유연성을 높이려면 아이콘을 클릭하세요.
알림
- 서비스의 건강 상태 확인 URL을 만듭니다.
- Spring Boot의 경우 다음 종속 항목을 추가하기만 하면 됩니다.
org.springframework.boot:spring-boot-starter-actuator
src/main/resources/application.properties
를 만들거나 업데이트하고 디스크 공간 검사를 사용 중지합니다.
management.health.diskspace.enabled=false
- 프로토콜, 호스트 이름, 경로를 지정하여 업타임 알림을 생성합니다. Spring Boot의 경우 경로는
/actuator/health
입니다. - 알림 테스트
- 알림 만들기
9. 축하합니다
축하합니다. 다른 마이크로서비스와 경쟁할 수 있는 마이크로서비스를 빌드하고 배포했습니다. 행운을 빕니다!