Google Cloud의 마이크로서비스 아키텍처에 트랜잭션 워크플로 애플리케이션 예시 배포


이 문서에서는 Cloud Run, Pub/Sub, 워크플로, Datastore 모드의 Firestore(Datastore)를 사용하여 예시 애플리케이션을 배포하는 방법을 설명합니다. 이 문서는 마이크로서비스 기반 애플리케이션에서 트랜잭션 워크플로를 구현하려는 애플리케이션 개발자를 대상으로 작성되었습니다.

이 문서는 다음으로 구성된 시리즈의 일부입니다.

이 튜토리얼에서 배포하는 이 예시 애플리케이션은 두 가지 아키텍처 패턴으로 마이크로서비스를 구현합니다.

  • 코레오그래피 기반 saga
  • 동기식 조정

애플리케이션에는 웹 클라이언트가 포함되어 있습니다. Google Cloud CLI와 웹 클라이언트에서 이러한 두 패턴을 모두 실험할 수 있습니다.

목표

  • 코레오그래피 기반 saga 아키텍처를 위한 서버 측 구성요소 배포
  • 동기식 조정 아키텍처를 위한 서버 측 구성요소 배포
  • curl 명령어로 서버 측 구성요소 테스트
  • 웹 애플리케이션을 배포하고 이를 통해 워크플로 실행

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  2. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  3. API Cloud Services, Cloud Run, Workflows, Cloud Build, and Cloud Scheduler 사용 설정

    API 사용 설정

소스 코드 클론

이 섹션에서는 프로젝트 ID를 설정하고 Cloud Shell에서 소스 코드를 클론합니다.

  1. Cloud Shell에서 프로젝트 ID를 설정합니다.

    PROJECT_ID=PROJECT_ID
    

    PROJECT_ID이전에 만든 Google Cloud 프로젝트의 프로젝트 ID로 바꿉니다.

  2. 프로젝트 ID를 설정합니다.

    gcloud config set project $PROJECT_ID
    
  3. 튜토리얼 저장소를 클론합니다.

    cd $HOME
    git clone https://github.com/GoogleCloudPlatform/transactional-microservice-examples
    

코레오그래피 기반 saga 아키텍처를 위한 서버 측 구성요소 배포

이 섹션에서는 예시 애플리케이션의 서버 측 구성요소를 배포합니다. 이 애플리케이션은 Cloud Run의 마이크로서비스, Cloud Scheduler의 이벤트 게시 일정, Pub/Sub 주제와 같은 코레오그래피 기반 SAG 아키텍처를 구현합니다.

컨테이너 이미지 빌드 및 배포

  1. Cloud Shell에서 order-async라는 Order 서비스의 컨테이너 이미지를 빌드하고 Cloud Run에 배포합니다.

    cd $HOME/transactional-microservice-examples/services/order-async
    gcloud builds submit --tag gcr.io/$PROJECT_ID/order-service-async
    gcloud run deploy order-service-async \
      --image gcr.io/$PROJECT_ID/order-service-async \
      --platform=managed --region=us-central1 \
      --no-allow-unauthenticated
    
  2. customer-async라는 Customer 서비스의 컨테이너 이미지를 빌드하고 Cloud Run에 배포합니다.

    cd $HOME/transactional-microservice-examples/services/customer-async
    gcloud builds submit --tag gcr.io/$PROJECT_ID/customer-service-async
    gcloud run deploy customer-service-async \
      --image gcr.io/$PROJECT_ID/customer-service-async \
      --platform=managed --region=us-central1 \
      --no-allow-unauthenticated
    
  3. event-publisher 서비스의 컨테이너 이미지를 빌드하고 Cloud Run에 배포합니다.

    cd $HOME/transactional-microservice-examples/services/event-publisher
    gcloud builds submit --tag gcr.io/$PROJECT_ID/event-publisher
    gcloud run deploy event-publisher \
      --image gcr.io/$PROJECT_ID/event-publisher \
      --platform=managed --region=us-central1 \
      --no-allow-unauthenticated \
      --set-env-vars "PROJECT_ID=$PROJECT_ID"
    

Datastore 색인 만들기

이 섹션에서는 Datastore의 색인을 만듭니다. 이 색인은 event-publisher 서비스에서 게시해야 하는 이벤트를 선택하는 데 사용됩니다.

  1. Google Cloud 콘솔의 Datastore 메뉴에서 Datastore 모드를 선택합니다 .

  2. 데이터 저장 위치 선택을 클릭하고 us-east1을 위치로 선택합니다. 그런 다음 데이터베이스 만들기를 클릭합니다.

  3. Datastore의 색인을 만듭니다.

    cd $HOME/transactional-microservice-examples/services/event-publisher
    gcloud datastore indexes create index.yaml --quiet
    
  4. Google Cloud 콘솔의 Datastore 메뉴에서 색인을 선택하고 색인 상태가 색인 생성(Indexing)에서 제공(Serving)으로 변경될 때까지 기다립니다. 이 과정은 몇 분 정도 걸릴 수 있습니다.

Cloud Run에서 마이크로서비스를 호출하는 서비스 계정 만들기

  • Cloud Shell에서 cloud-run-invoker 서비스 계정을 만듭니다.

    SERVICE_ACCOUNT_NAME="cloud-run-invoker"
    SERVICE_ACCOUNT_EMAIL=${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
      --display-name "Cloud Run Invoker"
    

    이 튜토리얼의 뒷부분에서 이 서비스 계정을 사용하여 Cloud Run에서 실행되는 마이크로서비스의 REST API를 호출합니다.

이벤트 게시자 서비스를 호출하는 일정 정의

이 섹션에서는 event-publisher라는 이벤트 게시자를 1분 간격으로 호출하는 일정을 정의합니다.

  1. Cloud Shell에서 run.invoker 역할을 event publisher 서비스에 할당하세요.

    SERVICE_NAME="event-publisher"
    gcloud run services add-iam-policy-binding $SERVICE_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/run.invoker \
      --platform=managed --region=us-central1
    
  2. cloud-run-invoker 서비스 계정을 사용하여 event-publisher라는 Event publisher 서비스 호출 일정을 1분 간격으로 정의합니다.

    SERVICE_NAME="event-publisher"
    SERVICE_URL=$(gcloud run services list --platform managed \
      --format="table[no-heading](URL)"
      --filter="SERVICE:${SERVICE_NAME}")
    SERVICE_URL="${SERVICE_URL}/api/v1/event/publish"
    gcloud scheduler jobs create http event-publisher-scheduler \
      --schedule='* * * * *' \
      --http-method=GET \
      --uri=$SERVICE_URL \
      --oidc-service-account-email=$SERVICE_ACCOUNT_EMAIL \
      --oidc-token-audience=$SERVICE_URL \
      --location=us-central1
    

Pub/Sub 주제 만들기

  • Cloud Shell에서 다음 Pub/Sub 주제를 만듭니다.

    gcloud pubsub topics create order-service-event
    gcloud pubsub topics create customer-service-event
    

order-service-event 주제는 Order 서비스 및 event-publisher 서비스에서 Order 서비스의 이벤트를 게시하는 데 사용됩니다. customer-service-event 주제는 Customer 서비스에서 이벤트를 게시하는 데 사용됩니다.

마이크로서비스에 이벤트 알림을 전송할 주제 정의

이 섹션에서는 Pub/Sub 주제의 메시지를 마이크로서비스로 전송하도록 push-subscription 주제를 정의합니다.

  1. Cloud Shell에서 iam.serviceAccountTokenCreator 역할을 프로젝트 Pub/Sub 서비스 계정에 할당합니다.

    PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format "value(projectNumber)")
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member=serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com \
      --role=roles/iam.serviceAccountTokenCreator
    

    이 명령어를 사용하면 서비스 계정이 Cloud Run에서 마이크로서비스를 호출하는 액세스 토큰을 만들 수 있습니다.

  2. run.invoker 역할을 customer-service-async 서비스에 할당합니다.

    SERVICE_NAME="customer-service-async"
    gcloud run services add-iam-policy-binding $SERVICE_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/run.invoker \
      --platform=managed --region=us-central1
    
  3. push-subscription 주제를 만듭니다.

    SERVICE_URL=$(gcloud run services list --platform managed \
      --format="table[no-heading](URL)" --filter="SERVICE:${SERVICE_NAME}")
    SERVICE_URL="${SERVICE_URL}/api/v1/customer/pubsub"
    gcloud pubsub subscriptions create push-order-to-customer \
      --topic order-service-event \
      --push-endpoint=$SERVICE_URL \
      --push-auth-service-account=$SERVICE_ACCOUNT_EMAIL
    

    이 주제에서는 cloud-run-invoker 서비스 계정을 사용하여 order-service-event 주제의 메시지를 Customer 서비스로 전달합니다.

  4. run.invoker 역할을 order-service-async 서비스에 할당합니다.

    SERVICE_NAME="order-service-async"
    gcloud run services add-iam-policy-binding $SERVICE_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/run.invoker \
      --platform=managed --region=us-central1
    
  5. push-subscription 주제를 만듭니다.

    SERVICE_URL=$(gcloud run services list --platform managed \
      --format="table[no-heading](URL)" --filter="SERVICE:${SERVICE_NAME}")
    SERVICE_URL="${SERVICE_URL}/api/v1/order/pubsub"
    gcloud pubsub subscriptions create push-customer-to-order \
      --topic customer-service-event \
      --push-endpoint=$SERVICE_URL \
      --push-auth-service-account=$SERVICE_ACCOUNT_EMAIL
    

    push-subscription 주제는 cloud-run-invoker 서비스 계정을 사용하여 customer-service-event 주제의 메시지를 Order 서비스로 전달합니다.

동기식 조정 아키텍처를 위한 서버 측 구성요소 배포

이 섹션에서는 예시 애플리케이션의 서버 측 구성요소를 배포합니다. 이러한 구성요소는 Cloud Run에서 동기식 조정 아키텍처와 Workflows로 실행되는 워크플로를 구현합니다.

컨테이너 이미지 빌드 및 배포

이 섹션에서는 마이크로서비스의 컨테이너 이미지를 빌드하고 Cloud Run에 배포합니다.

  1. Cloud Shell에서 order-sync라는 Order 서비스의 컨테이너 이미지를 빌드하고 Cloud Run에 배포합니다.

    cd $HOME/transactional-microservice-examples/services/order-sync
    gcloud builds submit --tag gcr.io/$PROJECT_ID/order-service-sync
    gcloud run deploy order-service-sync \
      --image gcr.io/$PROJECT_ID/order-service-sync \
      --platform=managed --region=us-central1 \
      --no-allow-unauthenticated
    
  2. customer-sync라는 Customer 서비스의 컨테이너 이미지를 빌드하고 Cloud Run에 배포합니다.

    cd $HOME/transactional-microservice-examples/services/customer-sync
    gcloud builds submit --tag gcr.io/$PROJECT_ID/customer-service-sync
    gcloud run deploy customer-service-sync \
      --image gcr.io/$PROJECT_ID/customer-service-sync \
      --platform=managed --region=us-central1 \
      --no-allow-unauthenticated
    
  3. order-processor라는 Order 프로세서 서비스의 컨테이너 이미지를 빌드하고 Cloud Run에 배포합니다.

    cd $HOME/transactional-microservice-examples/services/order-processor
    gcloud builds submit --tag gcr.io/$PROJECT_ID/order-processor-service
    gcloud run deploy order-processor-service \
      --image gcr.io/$PROJECT_ID/order-processor-service \
      --platform=managed --region=us-central1 \
      --no-allow-unauthenticated \
      --set-env-vars "PROJECT_ID=$PROJECT_ID"
    

Cloud Run에서 마이크로서비스를 호출하는 서비스 계정 만들기

이 섹션에서는 Cloud Run에서 마이크로서비스를 호출하기 위한 서비스 계정 만들기에서 만든 cloud-run-invoker 서비스 계정을 재사용합니다.

주문 처리 워크플로 배포

  1. Cloud Shell에서 run.invokerrun.viewer 역할을 order-service-sync 서비스의 cloud-run-invoker 서비스 계정에 할당합니다.

    SERVICE_NAME="order-service-sync"
    gcloud run services add-iam-policy-binding $SERVICE_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/run.invoker \
      --platform=managed --region=us-central1
    gcloud run services add-iam-policy-binding $SERVICE_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/run.viewer \
      --platform=managed --region=us-central1
    
  2. run.invokerrun.viewer 역할을 customer-service-sync 서비스의 cloud-run-invoker 서비스 계정에 할당합니다.

    SERVICE_NAME="customer-service-sync"
    gcloud run services add-iam-policy-binding $SERVICE_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/run.invoker \
      --platform=managed --region=us-central1
    gcloud run services add-iam-policy-binding $SERVICE_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/run.viewer \
      --platform=managed --region=us-central1
    
  3. cloud-run-invoker 서비스 계정을 사용하여 워크플로를 배포합니다.

    SERVICE_NAME="order-service-sync"
    ORDER_SERVICE_URL=$(gcloud run services list --platform managed \
      --format="table[no-heading](URL)" --filter="SERVICE:${SERVICE_NAME}")
    
    SERVICE_NAME="customer-service-sync"
    CUSTOMER_SERVICE_URL=$(gcloud run services list --platform managed \
      --format="table[no-heading](URL)" --filter="SERVICE:${SERVICE_NAME}")
    
    cd $HOME/transactional-microservice-examples/services/order-processor
    cp order_workflow.yaml.template order_workflow.yaml
    sed -i "s#ORDER-SERVICE-URL#${ORDER_SERVICE_URL}#" order_workflow.yaml
    sed -i "s#CUSTOMER-SERVICE-URL#${CUSTOMER_SERVICE_URL}#" order_workflow.yaml
    
    gcloud beta workflows deploy order_workflow \
      --source=order_workflow.yaml \
      --service-account=$SERVICE_ACCOUNT_EMAIL
    

코레오그래피 기반 SAG 아키텍처 구성요소 테스트

이 섹션에서는 curl 명령어를 사용하여 코레오그래피 기반 SAG 아키텍처에 배포된 구성요소를 테스트합니다.

  • Cloud Shell에서 customer-service-asyncorder-service-async 마이크로서비스에 API 엔드포인트의 URL을 가리키는 환경 변수를 설정하세요.

    SERVICE_NAME="customer-service-async"
    CUSTOMER_SERVICE_URL=$(gcloud run services list --platform managed \
      --format="table[no-heading](URL)" --filter="SERVICE:${SERVICE_NAME}")
    
    SERVICE_NAME="order-service-async"
    ORDER_SERVICE_URL=$(gcloud run services list --platform managed \
      --format="table[no-heading](URL)" --filter="SERVICE:${SERVICE_NAME}")
    

고객 항목 만들기

  • Cloud Shell에서 customer-service-async라는 Customer 서비스에 API 요청을 전송하여 customer01이라는 고객 ID를 만듭니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
      -H "Content-Type: application/json" \
      -d '{"customer_id":"customer01", "limit":10000}' \
      -s ${CUSTOMER_SERVICE_URL}/api/v1/customer/limit | jq .
    

    출력은 다음과 비슷합니다.

    {
      "credit": 0,
      "customer_id": "customer01",
      "limit": 10000
    }
    

주문 제출

이 섹션에서는 주문을 제출하고 해당 주문에 대한 주문 ID 할당을 트리거합니다.

  1. Cloud Shell에서 API 요청을 order-service-async라는 Order 서비스로 전송하여 주문을 제출합니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
      -H "Content-Type: application/json" \
      -d '{"customer_id":"customer01", "number":10}' \
      -s ${ORDER_SERVICE_URL}/api/v1/order/create | jq .
    

    이 경우 "number": 10을 지정하여 10개의 항목을 주문합니다.

    출력은 다음과 비슷합니다.

    {
      "customer_id": "customer01",
      "number": 10,
      "order_id": "720d1305-b6fd-4f57-aaf4-fd2ca5bdfe1e",
      "status": "pending"
    }
    

    출력의 "order_id" 플래그는 주문에 할당된 고유한 주문 ID를 표시합니다. 이 ID는 다음 단계에서 사용되므로 복사합니다.

  2. 환경 변수로 주문 ID를 설정하세요.

    ORDER_ID=ORDER_ID
    

    ORDER_ID을 이전 단계에서 복사한 "order_id" 플래그로 바꿉니다.

주문 상태 확인

이 섹션에서는 주문 상태가 어떻게 변경되는지 확인합니다.

  1. Cloud Shell에서 API 요청을 order-service-async이라는 Order 서비스로 전송하여 주문 상태를 가져옵니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
      -H "Content-Type: application/json" \
      -d "{\"customer_id\":\"customer01\", \"order_id\":\"$ORDER_ID\"}" \
      -s ${ORDER_SERVICE_URL}/api/v1/order/get | jq .
    

    다음과 유사한 결과가 출력됩니다.

    {
      "customer_id": "customer01",
      "number": 10,
      "order_id": "720d1305-b6fd-4f57-aaf4-fd2ca5bdfe1e",
      "status": "pending"
    }
    

    출력의 "status" 플래그는 주문 상태를 표시합니다. 트랜잭션 프로세스가 아직 실행 중이면 상태는 "pending"입니다. 이 경우 몇 분 정도 기다린 후 동일한 명령어를 실행하여 상태를 다시 확인하세요. 트랜잭션 프로세스가 완료되면 상태가 "accepted"로 표시됩니다.

  2. customer01 고객 ID의 고객 정보를 가져옵니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
      -H "Content-Type: application/json" \
      -d '{"customer_id":"customer01"}' \
      -s ${CUSTOMER_SERVICE_URL}/api/v1/customer/get | jq .
    

    다음과 유사한 결과가 출력됩니다.

    {
      "credit": 1000,
      "customer_id": "customer01",
      "limit": 10000
    }
    

    "credit" 플래그는 고객의 현재 크레딧 사용량을 표시합니다. 이 트랜잭션의 비즈니스 로직은 한 항목의 크레딧을 100씩 늘리는 것이기 때문에 1,000이 증가합니다.

    주문 제출 단계를 반복하여 주문 프로세스를 반복할 수 있습니다. "number": 100를 지정하여 100개의 항목을 주문하면 크레딧 사용량이 한도를 초과하므로 주문 최종 상태는 "rejected"입니다.

동기식 조정 아키텍처 구성요소 테스트

이 섹션에서는 curl 명령어를 사용하여 동기식 조정 아키텍처의 배포된 구성요소를 테스트합니다.

  • Cloud Shell에서 customer-service-sync, order-service-sync, order-processor-service 마이크로서비스의 API 엔드포인트 URL을 가리키는 환경 변수를 설정합니다.

    SERVICE_NAME="customer-service-sync"
    CUSTOMER_SERVICE_URL=$(gcloud run services list --platform managed \
      --format="table[no-heading](URL)" --filter="SERVICE:${SERVICE_NAME}")
    
    SERVICE_NAME="order-service-sync"
    ORDER_SERVICE_URL=$(gcloud run services list --platform managed \
      --format="table[no-heading](URL)" --filter="SERVICE:${SERVICE_NAME}")
    
    SERVICE_NAME="order-processor-service"
    ORDER_PROCESSOR_URL=$(gcloud run services list --platform managed \
      --format="table[no-heading](URL)" --filter="SERVICE:${SERVICE_NAME}")
    

고객 항목 만들기

  • Cloud Shell에서 customer-service-sync라는 Customer 서비스에 API 요청을 보내 customer02라는 고객 ID를 만듭니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
      -H "Content-Type: application/json" \
      -d '{"customer_id":"customer02", "limit":10000}' \
      -s ${CUSTOMER_SERVICE_URL}/api/v1/customer/limit | jq .
    

    다음과 유사한 결과가 출력됩니다.

    {
      "credit": 0,
      "customer_id": "customer02",
      "limit": 10000
    }
    

주문 제출

이 섹션에서는 주문을 제출하고 결과를 확인합니다.

  1. Cloud Shell에서 API 요청을 Order 서비스 order-processor-service에 전송하여 주문을 제출합니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
      -H "Content-Type: application/json" \
      -d '{"customer_id":"customer02", "number":10}' \
      -s ${ORDER_PROCESSOR_URL}/api/v1/order/process | jq .
    

    이 경우 "number": 10를 지정하여 10개의 항목을 주문합니다.

    출력은 다음과 비슷합니다.

    {
      "customer_id": "customer02",
      "number": 10,
      "order_id": "fb6d5087-dd99-4d5a-84c2-0e381016b9d3",
      "status": "accepted"
    }
    

    트랜잭션 워크플로는 동기적으로 수행되므로 클라이언트가 즉시 결과를 확인합니다. 이 경우 최종 상태는 "accepted"입니다.

  2. 고객 ID가 customer02인 고객 정보를 가져옵니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
      -H "Content-Type: application/json" \
      -d '{"customer_id":"customer02"}' \
      -s ${CUSTOMER_SERVICE_URL}/api/v1/customer/get | jq .
    

    출력은 다음과 비슷합니다.

    {
      "credit": 1000,
      "customer_id": "customer02",
      "limit": 10000
    }
    

    고객의 크레딧 사용량이 1,000 증가합니다. 주문 프로세스를 반복하려면 이 단계를 반복하세요. "number": 100 값을 지정하여 항목 100개를 주문하면 크레딧 사용량이 한도를 초과하므로 클라이언트가 즉시 "rejected" 결과를 가져옵니다.

선택사항: 웹 애플리케이션 배포

이 섹션에서는 튜토리얼에 대한 확장으로 이전 섹션에서 배포한 마이크로서비스를 기반으로 트랜잭션 워크플로를 실행하는 웹 애플리케이션 예시를 배포합니다. Firebase 호스팅을 사용하여 Cloud Run에서 실행되는 백엔드 마이크로서비스와 상호작용하는 웹 애플리케이션을 배포합니다.

Firebase 호스팅에는 Cloud Run 통합 기능이 내장되어 있어 웹 애플리케이션과 백엔드 마이크로서비스 서비스를 동일한 도메인에서 호스팅할 수 있습니다. 다른 유형의 배포에서는 교차 출처 리소스 공유(CORS) 문제가 발생할 수 있습니다. 자세한 내용은 최종 사용자 인증을 참조하세요.

웹 애플리케이션 통합

Firebase 호스팅 통합은 다음을 수행합니다.

  • 웹 애플리케이션의 정적 애셋을 호스팅합니다.
  • API에 대한 액세스를 Cloud Run의 다음 백엔드 서비스로 리디렉션합니다.
    • /customer-service-sync/* > customer-service-sync
    • /customer-service-async/*~customer-service-async
    • /order-service-sync/*~order-service-sync
    • /order-service-async/*~order-service-async
    • /order-processor-service/* > order-processor-service
  • 웹 애플리케이션의 정적 애셋을 반환합니다.

Firebase 설정

이 섹션에서는 Firebase 호스팅에서 웹 애플리케이션을 호스팅하도록 Firebase를 설정합니다.

  1. Firebase CLI를 사용하려면 Cloud Shell에서 Node.js를 최신 LTS 버전으로 업데이트합니다.

    nvm install lts/gallium
    
  2. Firebase 리소스를 기존 Google Cloud 프로젝트에 추가합니다.

    firebase projects:addfirebase $PROJECT_ID
    
  3. Firebase CLI의 기본 프로젝트 별칭을 추가합니다.

    jq -n --arg project_id $PROJECT_ID \
      '{"projects": {"default":$project_id}}' > \
      $HOME/transactional-microservice-examples/frontend/.firebaserc
    

웹 애플리케이션 배포

이 섹션에서는 Firebase 호스팅에 웹 애플리케이션을 배포합니다.

  1. Cloud Shell에서 웹 프런트엔드 애플리케이션을 빌드합니다.

    cd $HOME/transactional-microservice-examples/frontend
    yarn install && yarn build
    
  2. Firebase 호스팅에 웹 애플리케이션을 배포합니다.

    firebase deploy
    

웹 애플리케이션 사용

  • 이전 섹션에서 복사한 호스팅 URL을 브라우저에 입력합니다. 웹 애플리케이션의 홈페이지가 표시됩니다.

ID 토큰으로 웹 애플리케이션 초기화

이 섹션에서는 ID 토큰으로 웹 애플리케이션을 초기화하고 쇼핑 페이지로 이동합니다.

  1. Cloud Shell에서 ID 토큰을 출력합니다.

    gcloud auth print-identity-token
    
  2. 이전 명령어의 출력을 복사하여 텍스트 상자에 붙여넣습니다.

  3. 계속을 클릭합니다. ID 토큰이 유효하면 쇼핑 페이지로 리디렉션됩니다.

장바구니에 항목 추가

  • 웹 애플리케이션에서 Add to cart를 클릭하여 장바구니에 항목을 추가합니다.

장바구니의 상품 확인

  • 웹 애플리케이션에서 탐색 메뉴의 장바구니 아이콘을 클릭하여 결제 페이지로 이동합니다. 장바구니에 항목이 표시됩니다.

비동기 서비스를 사용하여 주문 제출

  1. 웹 애플리케이션에서 탐색 메뉴의 장바구니 아이콘을 클릭하여 결제 페이지로 이동합니다.
  2. 주문 제출(비동기)을 클릭합니다. 주문이 성공적으로 제출되면 주문 내역 페이지로 리디렉션됩니다.

동기 서비스를 사용하여 주문 제출

  1. 웹 애플리케이션에서 탐색 메뉴의 장바구니 아이콘을 클릭하여 결제 페이지로 이동합니다.
  2. 주문 제출(동기화)을 클릭합니다. 주문이 성공적으로 제출되면 주문 내역 페이지로 리디렉션됩니다.

주문 내역 확인

  • 웹 애플리케이션의 탐색 메뉴에서 주문을 클릭하여 주문 내역 페이지로 이동합니다.

완료되지 않은 주문 상태 업데이트

  1. 웹 애플리케이션의 탐색 메뉴에서 주문을 클릭하여 주문 내역 페이지로 이동합니다.
  2. 개별 주문의 새로고침 아이콘을 클릭합니다. 주문이 비동기식으로 처리되고 상태가 pending인 경우에만 아이콘이 표시됩니다.

고객의 현재 예산 확인

  • 웹 애플리케이션에서 탐색 메뉴의 고객 이름(customer-number)을 클릭하여 프로필 페이지로 이동합니다.

고객 프로필로 이동합니다.

웹 애플리케이션에서 상태 재설정

  • 브라우저에서 웹 애플리케이션을 다시 로드합니다. 장바구니의 항목, 주문 내역, 고객 정보가 재설정되고 홈페이지로 리디렉션됩니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

개별 리소스 삭제

이 섹션에서는 이 튜토리얼에서 사용하는 개별 리소스를 삭제합니다.

Firebase 호스팅 비활성화

  • Cloud Shell에서 다음 명령어를 실행하여 Firebase 호스팅 트래픽 제공을 중지하세요.

     firebase hosting:disable -f
    

Cloud Run에서 서비스 삭제

  • Cloud Shell에서 Cloud Run의 서비스를 삭제합니다.

    gcloud run services delete order-service-async \
      --platform=managed --region=us-central1 --quiet
    
    gcloud run services delete customer-service-async \
      --platform=managed --region=us-central1 --quiet
    
    gcloud run services delete order-service-sync \
      --platform=managed --region=us-central1 --quiet
    
    gcloud run services delete customer-service-sync \
      --platform=managed --region=us-central1 --quiet
    
    gcloud run services delete order-processor-service \
      --platform=managed --region=us-central1 --quiet
    
    gcloud run services delete event-publisher \
      --platform=managed --region=us-central1 --quiet
    

Cloud Run에서 사용하는 컨테이너 이미지 삭제

  • Cloud Shell에서 이 가이드용으로 만든 컨테이너 이미지를 삭제합니다.

    gcloud container images delete \
      gcr.io/$PROJECT_ID/order-service-async --force-delete-tags --quiet
    gcloud container images delete \
      gcr.io/$PROJECT_ID/customer-service-async --force-delete-tags --quiet
    gcloud container images delete \
      gcr.io/$PROJECT_ID/event-publisher --force-delete-tags --quiet
    gcloud container images delete \
      gcr.io/$PROJECT_ID/order-service-sync --force-delete-tags --quiet
    gcloud container images delete \
      gcr.io/$PROJECT_ID/customer-service-sync --force-delete-tags --quiet
    gcloud container images delete \
      gcr.io/$PROJECT_ID/order-processor-service --force-delete-tags --quiet
    

워크플로 삭제

  • Cloud Shell에서 워크플로를 삭제합니다.

    gcloud beta workflows delete order_workflow --quiet
    

Pub/Sub 구독 및 주제 삭제

  1. Cloud Shell에서 Pub/Sub 구독을 삭제합니다.

    gcloud pubsub subscriptions delete push-customer-to-order --quiet
    gcloud pubsub subscriptions delete push-order-to-customer --quiet
    
  2. Pub/Sub 주제를 삭제합니다.

    gcloud pubsub topics delete order-service-event --quiet
    gcloud pubsub topics delete customer-service-event --quiet
    

Datastore에서 레코드 삭제

  1. Google Cloud 콘솔의 Datastore 메뉴에서 항목을 엽니다.
  2. Customer 필드의 모든 항목을 확인합니다.
  3. 삭제를 클릭한 다음 확인을 클릭하여 항목을 영구 삭제합니다.
  4. 이 절차의 2단계와 3단계를 다음 필드에 반복합니다.
    1. Event
    2. Order
    3. ProcessedEvent

Cloud Scheduler에서 작업 삭제

  • Cloud Shell에서 Cloud Scheduler에서 실행 중인 작업을 삭제합니다.

    gcloud scheduler jobs delete event-publisher-scheduler --quiet \
      --location=us-central1
    

서비스 계정 삭제

  • Cloud Shell에서 서비스 계정을 삭제합니다.

    gcloud iam service-accounts delete $SERVICE_ACCOUNT_EMAIL --quiet
    

튜토리얼 애셋 삭제

  • Cloud Shell에서 이 튜토리얼에 사용한 애셋을 삭제합니다.

    cd $HOME
    rm -rf transactional-microservice-examples
    

다음 단계