1. 개요
분산 추적은 다중 계층 마이크로서비스 아키텍처에 대한 유용한 정보와 관측 가능성을 얻는 데 중요합니다. 서비스 A에서 서비스 B, 서비스 C로 서비스 호출을 서비스 호출로 연결하는 경우 호출이 성공적이었으며 모든 단계에서 지연 시간도 이해하는 것이 중요합니다.
Spring Boot에서는 Spring Cloud Sleuth를 사용하여 애플리케이션에 분산 추적 계측을 원활하게 추가할 수 있습니다. 기본적으로 트레이스 데이터를 Zipkin으로 전달할 수 있습니다.
Google Cloud Platform에는 자체 Zipkin 인스턴스 또는 스토리지를 관리하지 않고도 trace 데이터를 저장할 수 있는 관리형 서비스인 Cloud Trace가 있습니다. 또한 Cloud Trace는 지연 시간 분포 보고서를 생성하고 성능 회귀를 자동으로 감지할 수 있습니다.
Spring Boot 애플리케이션에서 Cloud Trace를 사용하는 데는 두 가지 옵션이 있습니다.
- Stackdriver Trace Zipkin 프록시를 사용하고 이 프록시를 Zipkin 엔드포인트로 사용하도록 Spring Cloud Sleuth를 구성하기만 하면 됩니다.
- 또는 Spring Cloud Sleuth와 원활하게 통합되고 trace 데이터를 Cloud Trace로 직접 전달하는 Spring Cloud GCP Trace를 사용할 수 있습니다.
이 Codelab에서는 새로운 Spring Boot 애플리케이션을 빌드하고 분산 추적에 Spring Cloud GCP Trace를 사용하는 방법을 알아봅니다.
학습할 내용
- Spring Boot Java 애플리케이션을 만들고 Cloud Trace를 구성하는 방법
필요한 항목
이 튜토리얼을 어떻게 사용하실 계획인가요?
HTML/CSS 웹 앱 빌드 경험을 평가해 주세요.
귀하의 Google Cloud Platform 서비스 사용 경험을 평가해 주세요.
<ph type="x-smartling-placeholder">2. 설정 및 요구사항
자습형 환경 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID
로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다. - 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.
Google Cloud Shell
Google Cloud 및 Kubernetes는 노트북에서 원격으로 작동할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
Cloud Shell 활성화
- Cloud Console에서 Cloud Shell 활성화를 클릭합니다.
Cloud Shell을 처음 시작하는 경우에는 무엇이 있는지 설명하는 중간 화면이 표시됩니다. 중간 화면이 표시되면 계속을 클릭합니다.
Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.
가상 머신에는 필요한 개발 도구가 모두 들어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저를 사용하여 수행할 수 있습니다.
Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 자신의 프로젝트 ID로 설정된 것을 확인할 수 있습니다.
- Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list
명령어 결과
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project
명령어 결과
[core] project = <PROJECT_ID>
또는 다음 명령어로 설정할 수 있습니다.
gcloud config set project <PROJECT_ID>
명령어 결과
Updated property [core/project].
3. 새 Spring Boot REST 서비스 만들기
Cloud Shell이 실행되면 명령줄을 사용하여 Spring Initializr로 새로운 Spring Boot 애플리케이션을 생성할 수 있습니다.
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d bootVersion=2.7.6 \
-d dependencies=web,lombok,cloud-gcp,distributed-tracing \
-d jvmVersion=17 \
-d type=maven-project \
-d baseDir=trace-service-one | tar -xzvf - \
&& cd trace-service-one
새 클래스를 추가하여 새 REST 컨트롤러를 만듭니다.
src/main/java/com/example/demo/WorkController.java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@Slf4j
public class WorkController {
Random r = new Random();
public void meeting() {
try {
log.info("meeting...");
// Delay for random number of milliseconds.
Thread.sleep(r.nextInt(500));
} catch (InterruptedException e) {
}
}
@GetMapping("/")
public String work() {
// What is work? Meetings!
// When you hit this URL, it'll call meetings() 5 times.
// Each time will have a random delay.
log.info("starting to work");
for (int i = 0; i < 5; i++) {
this.meeting();
}
log.info("finished!");
return "finished work!";
}
}
애플리케이션에 맞는 JVM 버전이 있는지 확인합니다.
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Spring Boot 플러그인을 사용하면 Spring Boot 애플리케이션을 정상적으로 시작할 수 있습니다. 이 실습의 테스트는 건너뛰겠습니다.
$ ./mvnw -DskipTests spring-boot:run
애플리케이션이 시작되면 Cloud Shell 툴바의 웹 미리보기 아이콘 을 클릭하고 포트 8080에서 미리보기를 선택합니다.
잠시 후 결과가 표시됩니다.
Cloud Shell에서 trace ID와 스팬 ID가 포함된 로그 메시지도 표시됩니다.
4. Cloud Trace 사용
Cloud Trace API 사용 설정
Cloud Trace를 사용하여 trace 데이터를 저장하려면 먼저 Cloud Trace API를 사용 설정해야 합니다. API를 사용 설정하려면 다음을 실행합니다.
$ gcloud services enable cloudtrace.googleapis.com
애플리케이션 기본 사용자 인증 정보 설정
이 실습에서는 애플리케이션 기본 사용자 인증 정보를 구성해야 합니다. 이 사용자 인증 정보는 Spring Cloud GCP Trace starter에 자동으로 선택됩니다.
먼저 로그인합니다.
$ gcloud auth application-default login
You are running on a Google Compute Engine virtual machine.
The service credentials associated with this virtual machine
will automatically be used by Application Default
Credentials, so it is not necessary to use this command.
If you decide to proceed anyway, your user credentials may be visible
to others with access to this virtual machine. Are you sure you want
to authenticate with your personal account?
Do you want to continue (Y/n)? Y
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth...
Enter verification code: ...
링크를 클릭하여 새 브라우저 탭을 연 다음 허용을 클릭합니다.
그런 다음 인증 코드를 복사하여 Cloud Shell에 다시 붙여넣고 Enter 키를 누릅니다. 다음과 같이 표시됩니다.
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
Spring Cloud GCP Trace 추가
이 서비스에서는 이미 Spring Cloud Sleuth를 추적에 사용했습니다. Spring Cloud GCP Trace 시작 조건을 추가하여 데이터를 Cloud Trace로 전달하겠습니다.
Spring Cloud GCP Trace 종속 항목을 추가합니다.
pom.xml
<project>
...
<dependencies>
...
<!-- Add Cloud Trace Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
기본적으로 Spring Cloud Sleuth는 모든 요청을 샘플링하지는 않습니다. 테스트를 좀 더 쉽게 하려면 application.properties
에서 샘플링 레이트를 100% 로 높여 trace 데이터가 표시되도록 하고 관심 없는 일부 URL은 무시하세요.
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
애플리케이션을 다시 실행하고 Cloud Shell 웹 미리보기를 사용하여 애플리케이션을 확인합니다.
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
기본적으로 Spring Cloud GCP Trace는 추적 데이터를 일괄 처리하여 10초마다 또는 최소 개수의 추적 데이터가 수신될 때 이를 전송합니다. 이는 구성이 가능하며 자세한 내용은 Spring Cloud GCP Trace 참조 문서를 참조하세요.
서비스에 요청을 실행합니다.
$ curl localhost:8080
Cloud 콘솔에서 작업 → 트레이스 → 트레이스 목록으로 이동합니다.
상단에서 기간을 1시간으로 좁힙니다. 기본적으로 자동 새로고침이 사용 설정되어 있습니다. 따라서 trace 데이터가 도착하면 콘솔에 표시되어야 합니다.
트레이스 데이터는 약 30초 이내에 표시됩니다.
파란색 점을 클릭하여 trace 세부정보를 확인합니다.
아주 간단했습니다.
5. 두 번째 Spring Boot 웹 애플리케이션 만들기
+ 아이콘을 클릭하여 새 Cloud Shell 세션을 엽니다.
새 세션에서 두 번째 Spring Boot 애플리케이션을 만듭니다.
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d bootVersion=2.7.6 \
-d dependencies=web,lombok,cloud-gcp,distributed-tracing \
-d jvmVersion=17 \
-d type=maven-project \
-d baseDir=trace-service-two | tar -xzvf - \
&& cd trace-service-two
새 클래스를 추가하여 새 REST 컨트롤러를 만듭니다.
src/main/java/com/example/demo/MeetingController.java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@Slf4j
public class MeetingController {
Random r = new Random();
@GetMapping("/meet")
public String meeting() {
try {
log.info("meeting...");
Thread.sleep(r.nextInt(500 - 20 + 1) + 20);
} catch (InterruptedException e) {
}
return "finished meeting";
}
}
pom.xml에 Spring Cloud GCP Trace 추가
pom.xml
<project>
...
<dependencies>
...
<!-- Add Cloud Trace starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
요청의 100% 를 샘플링하도록 Sleuth를 구성합니다.
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
마지막으로 Spring Boot 플러그인을 사용하여 포트 8081에서 Spring Boot 애플리케이션을 시작할 수 있습니다.
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"
6. 두 번째 서비스를 사용하도록 첫 번째 서비스 업데이트
trace-service-two
를 실행하는 동안 첫 번째 Cloud Shell 세션 창으로 돌아가서 trace-service-one
을 수정합니다.
먼저 새 RestTemplate
Bean을 초기화합니다.
src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
...
import org.springframework.web.client.RestTemplate;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class DemoApplication {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
WorkController.meeting()
에서 회의 서비스에 전화를 겁니다.
src/main/java/com/example/demo/WorkController.java
package com.example.demo;
...
import org.springframework.web.client.RestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
@RestController
@Slf4j
public class WorkController {
@Autowired
RestTemplate restTemplate;
public void meeting() {
String result = restTemplate.getForObject("http://localhost:8081/meet", String.class);
log.info(result);
}
...
}
서비스를 다시 시작하고 명령줄에서 엔드포인트를 트리거합니다.
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
# The '&' places the process in the background. Bring it back to the foreground with 'fg'.
$ ./mvnw -DskipTests spring-boot:run &
$ curl localhost:8080
두 세션 창에 Trace ID가 한 서비스에서 다른 서비스로 전파된 로그 메시지가 표시됩니다.
Cloud Trace의 Trace 목록에 두 번째 trace가 표시됩니다.
새로운 파란색 점을 클릭하면 trace 세부정보를 확인할 수 있습니다.
이 다이어그램에서 스팬을 클릭하여 스팬 세부정보를 확인할 수도 있습니다.
7. 지연 시간 분포 및 실적 보고서
Cloud Trace를 trace 데이터 스토리지로 사용하면 Cloud Trace에서 해당 데이터를 사용해 지연 시간 분포 보고서를 작성할 수 있습니다. 다음과 같이 보고서를 작성하려면 trace가 100개 이상 있어야 합니다.
Cloud Shell에 사전 설치되어 있는 Hey를 사용하여 처음 100개 이상의 요청을 실행할 수 있습니다.
$ hey localhost:8080 -n 150
또한 Cloud Trace는 분석 보고서에서 서로 다른 두 기간에 걸쳐 동일한 서비스의 성능 회귀를 자동으로 감지할 수 있습니다.
8. 요약
이 실습에서는 간단한 서비스 2개를 만들고, Spring Cloud Sleuth로 분산 추적을 추가했으며, Spring Cloud GCP를 사용하여 trace 정보를 Cloud Trace로 전달했습니다.
9. 축하합니다.
첫 번째 App Engine 웹 애플리케이션을 작성하는 방법을 알아봤습니다.
자세히 알아보기
- Cloud Trace: https://cloud.google.com/trace/
- GCP의 Spring 프로젝트: http://cloud.spring.io/spring-cloud-gcp/
- GCP의 Spring GitHub 저장소: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Google Cloud Platform의 자바: https://cloud.google.com/java/
라이선스
이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.