1. Genel Bakış
Dağıtılmış izleme, çok katmanlı mikro hizmet mimarisi hakkında bilgi edinmek ve gözlemlenebilirlik elde etmek açısından önemlidir. A hizmetinden B hizmetine veya C hizmetine kadar hizmet ve hizmet çağrılarına zincirleme bağlı olduğunuzda, hem çağrıların başarılı olduğunu hem de her adımdaki gecikmenin farkında olmanız önemlidir.
Spring Boot'ta, dağıtılmış izleme araçlarını uygulamanıza sorunsuz bir şekilde eklemek için Spring Cloud Sleuth'ü kullanabilirsiniz. Varsayılan olarak, iz verilerini Zipkin'e yönlendirebilir.
Google Cloud Platform, 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'e sahiptir. Cloud Trace, gecikme dağılımı raporları da oluşturabilir ve performans regresyonlarını otomatik olarak tespit edebilir.
Spring Boot uygulamasından Cloud Trace'i kullanmak için iki seçeneğiniz vardır:
- Stackdriver Trace Zipkin Proxy kullanın ve bu proxy'yi Zipkin uç noktası olarak kullanmak için Spring Cloud Sleuth'ü yapılandırın.
- Alternatif olarak, Spring Cloud Sleuth ile sorunsuz bir şekilde entegre olan ve iz verilerini doğrudan Cloud Trace'e yönlendiren Spring Cloud GCP Trace'i de kullanabilirsiniz.
Bu codelab'de, yeni bir Spring Boot uygulaması derlemeyi 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
- Bir Google Cloud Platform Projesi
- Chrome veya Firefox gibi bir tarayıcı
- Vim, EMAC veya Nano gibi standart Linux metin düzenleyicileri hakkında bilgi
Bu eğiticiden nasıl yararlanacaksınız?
HTML/CSS web uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?
Google Cloud Platform hizmetlerinin kullanımıyla ilgili deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- Google Cloud Console'da oturum açıp 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. İstediğiniz zaman güncelleyebilirsiniz.
- Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle
PROJECT_ID
olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır. - Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.
Google Cloud Shell
Google Cloud ve Kubernetes, dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de Cloud'da ç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 simgesini tıklayın.
Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.
- Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki 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 projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Doğru değilse aşağıdaki 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 bir şekilde başlatabilirsiniz. Bu laboratuvara yönelik testleri atlayalım:
$ ./mvnw -DskipTests spring-boot:run
Uygulama başladı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 beklemenin ardından sonucu görürsünüz:
Cloud Shell'de izleme kimliği ve aralık kimliğine sahip günlük mesajlarını da görürsünüz:
4. Cloud Trace'i kullanma
Cloud Trace API'yi etkinleştirin
İz 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
Uygulamanın Varsayılan Kimlik Bilgilerini Ayarlayın
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ı tarafından otomatik olarak alınır.
İlk olarak 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ı tıklayın, ardından İzin ver'i tıklayın
Ardından, doğrulama kodunu kopyalayıp Cloud Shell'e geri 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 İzlemesi Ekleme
Bu hizmette, izleme için zaten Spring Cloud Sleuth'ü kullandı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>
Varsayılan olarak, Spring Cloud Sleuth her isteği örneklemez. Testimizi biraz kolaylaştırmak amacıyla, iz verilerini gördüğümüzden emin olmak için application.properties
ürününde örnek hızını% 100'e yükseltin ve ilgilenmediğ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 Cloud Shell Web Önizlemesi'ni kullanarak uygulamayı görüntüleyin:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
Spring Cloud GCP Trace, izleme verilerini varsayılan olarak gruplar ve 10 saniyede bir ya da minimum sayıda iz verisi alındığında toplu olarak gönderir. Bu yapılandırma yapılandırılabilir. Daha fazla bilgi için Spring Cloud GCP Trace referans belgelerine göz atabilirsiniz.
Hizmete istekte bulunun:
$ curl localhost:8080
Cloud Console'da İşlemler → İzleme → İzleme listesi'ne gidin.
En üstte, zaman aralığını 1 saat olacak şekilde daraltın. Otomatik Yeniden Yükle seçeneği varsayılan olarak açıktır. Yani iz verileri geldiğinde konsolda görünecektir.
İz verileri yaklaşık 30 saniye içinde görünecektir.
İz ayrıntılarını görmek için mavi noktayı tıklayın:
Oldukça basitti.
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'ü 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 8081 numaralı bağlantı noktasında Spring Boot uygulamasını 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 Kullanmak İçin İlk Hizmeti Güncelleme
trace-service-two
çalışırken ilk Cloud Shell oturum penceresine geri dönün ve trace-service-one
üzerinde değişiklik yapın.
İlk olarak yeni bir RestTemplate
çekirdeğ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()
uygulamasında toplantı 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 komut satırından uç noktayı 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ı, bir hizmetten diğerine yayılmış olarak İzleme Kimliğinin yer aldığı şekilde görürsünüz.
Cloud Trace'in Trace Listesinde ikinci izi göreceksiniz:
Yeni mavi noktayı tıklayarak iz ayrıntılarını görebilirsiniz:
Aralık ayrıntılarını görmek için bu şemadaki herhangi bir kapsamı da tıklayabilirsiniz.
7. Gecikme Dağılımı ve Performans Raporu
İz verilerinin depolanması olarak Cloud Trace'i kullandığınızda Cloud Trace, bu verileri kullanarak gecikme dağıtım raporu oluşturabilir. Raporu aşağıdaki gibi oluşturmak için 100'den fazla ize ihtiyacınız vardır:
Cloud Shell'de önceden yüklü olarak gelen hey özelliğini kullanarak bu ilk 100'den fazla isteği çalıştırabilirsiniz.
$ hey localhost:8080 -n 150
Ayrıca Cloud Trace, aynı hizmetin iki farklı dönemdeki performans regresyonunu Analiz Raporu altında otomatik olarak tespit edebilir.
8. Özet
Bu laboratuvarda, 2 basit hizmet oluşturup Spring Cloud Sleuth ile dağıtılmış izleme eklediniz ve izleme bilgilerini Cloud Trace'e iletmek için Spring Cloud GCP'yi kullandınız.
9. Tebrikler!
İlk App Engine web uygulamanızı yazmayı öğrendiniz.
Daha Fazla Bilgi
- Cloud Trace: https://cloud.google.com/trace/
- GCP projesinde ilkbahar: http://cloud.spring.io/spring-cloud-gcp/
- Spring'de GCP 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.