1. Genel Bakış
Dağıtılmış izleme, çok katmanlı bir mikro hizmet mimarisi hakkında bilgi edinmek ve gözlemlenebilirlik sağlamak için önemlidir. Hizmetten hizmete çağrıları zincirlediğinizde (ör. A hizmetinden B hizmetine, B hizmetinden C hizmetine) çağrıların başarılı olup olmadığını ve her adımda gecikme olup olmadığını anlamanız önemlidir.
Spring Boot'ta, dağıtılmış izleme enstrümantasyonunu uygulamanıza sorunsuz bir şekilde eklemek için Spring Cloud Sleuth'u kullanabilirsiniz. Varsayılan olarak, izleme verilerini Zipkin'e yönlendirebilir.
Google Cloud Platform'da, kendi Zipkin örneğinizi veya depolama alanınızı yönetmek zorunda kalmadan izleme verilerini depolamanıza olanak tanıyan yönetilen bir hizmet olan Cloud Trace bulunur. Cloud Trace, gecikme dağılımı raporları da oluşturabilir ve performans gerilemelerini otomatik olarak algılayabilir.
Cloud Trace'i Spring Boot uygulamasından kullanmak için iki seçeneğiniz vardır:
- Stackdriver Trace Zipkin Proxy'si kullanın ve Spring Cloud Sleuth'u bu proxy'yi Zipkin uç noktası olarak kullanacak şekilde yapılandırın.
- Alternatif olarak, Spring Cloud Sleuth ile sorunsuz bir şekilde entegre olan ve iz verilerini doğrudan Cloud Trace'e ileten Spring Cloud GCP Trace'i kullanabilirsiniz.
Bu codelab'de, yeni bir Spring Boot uygulaması oluşturmayı ve dağıtılmış izleme için Spring Cloud GCP Trace'i kullanmayı öğreneceksiniz.
Neler öğreneceksiniz?
- Spring Boot Java uygulaması oluşturma ve Cloud Trace'i yapılandırma
Gerekenler
- Google Cloud Platform projesi
- Chrome veya Firefox gibi bir tarayıcı
- Vim, EMACs veya Nano gibi standart Linux metin düzenleyicileri hakkında bilgi sahibi olmanız gerekir.
Bu eğiticiden nasıl yararlanacaksınız?
HTML/CSS web uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?
Google Cloud Platform hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Yönlendirmesiz ortam kurulumu
- Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.



- Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
- Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle
PROJECT_IDolarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.
Google Cloud Shell
Google Cloud ve Kubernetes, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak bu codelab'de bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.
Cloud Shell'i etkinleştirme
- Cloud Console'da Cloud Shell'i etkinleştir 'i
tıklayın.

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını tarayıcıyla yapabilirsiniz.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.
- Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list
Komut çıkışı
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Değilse şu komutla ayarlayabilirsiniz:
gcloud config set project <PROJECT_ID>
Komut çıkışı
Updated property [core/project].
3. Yeni bir Spring Boot REST hizmeti oluşturma
Cloud Shell başlatıldıktan sonra, Spring Initializr ile yeni bir Spring Boot uygulaması oluşturmak için komut satırını kullanabilirsiniz:
$ 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
Yeni bir sınıf ekleyerek yeni bir REST denetleyicisi oluşturun:
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!";
}
}
Uygulama için doğru JVM sürümüne sahip olduğunuzdan emin olun:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Spring Boot uygulamasını Spring Boot eklentisiyle normal şekilde başlatabilirsiniz. Bu laboratuvar için testleri atlayalım:
$ ./mvnw -DskipTests spring-boot:run
Uygulama başlatıldıktan sonra Cloud Shell araç çubuğunda Web Önizlemesi simgesini
tıklayın ve 8080 bağlantı noktasında önizle'yi seçin.

Kısa bir süre bekledikten sonra sonucu görürsünüz:

Cloud Shell'de, izleme kimliği ve kapsam kimliği içeren günlük mesajlarını da görmeniz gerekir:

4. Cloud Trace'i kullanma
Cloud Trace API'yi etkinleştirin
İzleme verilerinizi depolamak için Cloud Trace'i kullanmadan önce Cloud Trace API'yi etkinleştirmeniz gerekir. API'yi etkinleştirmek için şu komutu yürütün:
$ gcloud services enable cloudtrace.googleapis.com
Uygulama Varsayılan Kimlik Bilgisi'ni ayarlama
Bu laboratuvar için bir uygulama varsayılan kimlik bilgisi yapılandırmanız gerekir. Bu kimlik bilgisi, Spring Cloud GCP Trace başlatıcısı tarafından otomatik olarak alınır.
Öncelikle giriş yapın:
$ 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: ...
Yeni bir tarayıcı sekmesi açmak için bağlantıyı, ardından İzin ver'i tıklayın.

Ardından, doğrulama kodunu kopyalayıp Cloud Shell'e yapıştırın ve Enter tuşuna basın. Aşağıdaki bilgileri görürsünüz:
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'i ekleme
Bu hizmette izleme için Spring Cloud Sleuth'u zaten kullanmıştık. Verileri Cloud Trace'e yönlendirmek için Spring Cloud GCP Trace başlatıcıyı ekleyelim.
Spring Cloud GCP Trace bağımlılığını ekleyin:
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, varsayılan olarak her isteği örneklemez. Testimizi biraz daha kolay hale getirmek için application.properties bölümünde örnekleme hızını% 100'e çıkararak izleme verilerini görmemizi sağlayın ve önemsemediğimiz bazı URL'leri yoksayın:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Uygulamayı tekrar çalıştırın ve uygulamayı görüntülemek için Cloud Shell Web Önizleme'yi kullanın:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
Varsayılan olarak Spring Cloud GCP Trace, iz verilerini toplu işler ve her 10 saniyede bir veya minimum sayıda iz verisi alındığında gönderir. Bu ayar yapılandırılabilir. Daha fazla bilgi için Spring Cloud GCP Trace referans belgelerine bakabilirsiniz.
Hizmete istekte bulunun:
$ curl localhost:8080
Cloud Console'da Operations (İşlemler) → Trace (İz) → Trace list'e (İz listesi) gidin.

Üst kısımda, zaman aralığını 1 saate daraltın. Otomatik yeniden yükleme özelliği varsayılan olarak açıktır. Bu nedenle, izleme verileri geldiğinde konsolda gösterilir.

İzleme verileri yaklaşık 30 saniye içinde gösterilir.

İz ayrıntılarını görmek için mavi noktayı tıklayın:

Çok kolaydı.
5. İkinci bir Spring Boot web uygulaması oluşturma
+ simgesini tıklayarak yeni bir Cloud Shell oturumu açın:

Yeni oturumda ikinci Spring Boot uygulamasını oluşturun:
$ 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
Yeni bir sınıf ekleyerek yeni bir REST denetleyicisi oluşturun:
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 dosyasına Spring Cloud GCP Trace'i ekleyin.
pom.xml
<project>
...
<dependencies>
...
<!-- Add Cloud Trace starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Sleuth'u isteklerin% 100'ünü örnekleyecek şekilde yapılandırın:
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Son olarak, Spring Boot eklentisiyle Spring Boot uygulamasını 8081 numaralı bağlantı noktasında başlatabilirsiniz:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"
6. İkinci Hizmeti Tüketmek İçin Birinci Hizmeti Güncelleme
trace-service-two çalışırken ilk Cloud Shell oturum penceresine dönün ve trace-service-one üzerinde değişiklik yapın.
Öncelikle yeni bir RestTemplate bean'i başlatın:
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() içinde Meeting hizmetine çağrı yapın.
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);
}
...
}
Hizmeti tekrar başlatın ve uç noktayı komut satırından tetikleyin:
$ 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
Her iki oturum penceresinde de günlük mesajlarını görmeniz gerekir. İzleme kimliği bir hizmetten diğerine yayılır.
Cloud Trace'in İz Listesi'nde ikinci izi görmeniz gerekir:

Yeni mavi noktayı tıklayarak iz ayrıntılarını görebilirsiniz:

Ayrıca, aralık ayrıntılarını görmek için bu şemadaki herhangi bir aralığı tıklayabilirsiniz.
7. Gecikme Dağılımı ve Performans Raporu
İz verisi depolama alanı olarak Cloud Trace'i kullandığınızda Cloud Trace, gecikme dağılımı raporu oluşturmak için verileri kullanabilir. Raporu bu şekilde oluşturmak için 100'den fazla iz gerekir:

Bu ilk 100'den fazla isteği, Cloud Shell'e önceden yüklenmiş olarak gelen hey'i kullanarak çalıştırabilirsiniz.
$ hey localhost:8080 -n 150
Ayrıca Cloud Trace, Analiz Raporu bölümünde aynı hizmetin iki farklı dönemdeki performans düşüşünü otomatik olarak algılayabilir.
8. Özet
Bu laboratuvarda 2 basit hizmet oluşturdunuz, Spring Cloud Sleuth ile dağıtılmış izleme eklediniz ve izleme bilgilerini Cloud Trace'e yönlendirmek için Spring Cloud GCP'yi kullandınız.
9. Tebrikler!
İlk App Engine web uygulamanızı nasıl yazacağınızı öğrendiniz.
Daha Fazla Bilgi
- Cloud Trace: https://cloud.google.com/trace/
- GCP'de Spring projesi: http://cloud.spring.io/spring-cloud-gcp/
- GCP'de Spring GitHub deposu: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Google Cloud Platform'da Java: https://cloud.google.com/java/
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.