1. Ringkasan
Pelacakan terdistribusi penting untuk mendapatkan insight dan kemampuan observasi pada arsitektur microservice multi-tingkat. Jika Anda telah merangkai panggilan layanan ke panggilan layanan, dari layanan A ke layanan B hingga layanan C, penting untuk dipahami bahwa panggilan berhasil dan juga latensi di setiap langkah.
Di Spring Boot, Anda dapat menggunakan Spring Cloud Sleuth untuk menambahkan instrumentasi pelacakan terdistribusi dengan lancar ke aplikasi Anda. Secara default, tindakan ini dapat meneruskan data trace ke Zipkin.
Google Cloud Platform memiliki Cloud Trace, yaitu layanan terkelola yang dapat Anda gunakan untuk menyimpan data trace tanpa harus mengelola instance atau penyimpanan Zipkin Anda sendiri. Cloud Trace juga dapat menghasilkan laporan distribusi latensi dan otomatis mendeteksi regresi performa.
Anda memiliki dua opsi untuk menggunakan Cloud Trace dari aplikasi Spring Boot:
- Gunakan Proxy Stackdriver Trace Zipkin dan cukup konfigurasikan Spring Cloud Sleuth untuk menggunakan proxy ini sebagai endpoint Zipkin
- Atau, gunakan Spring Cloud GCP Trace, yang terintegrasi secara lancar dengan Spring Cloud Sleuth dan meneruskan data trace langsung ke Cloud Trace.
Dalam codelab ini, Anda akan mempelajari cara membangun aplikasi Spring Boot baru dan menggunakan Spring Cloud GCP Trace untuk pelacakan terdistribusi.
Yang akan Anda pelajari
- Cara membuat aplikasi Java Spring Boot dan mengonfigurasi Cloud Trace.
Yang Anda butuhkan
- Project Google Cloud Platform
- Browser, seperti Chrome atau Firefox
- Pemahaman tentang editor teks Linux standar seperti Vim, EMACs, atau Nano
Bagaimana Anda akan menggunakan tutorial ini?
Bagaimana Anda menilai pengalaman Anda membuat aplikasi web HTML/CSS?
Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud Platform?
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.
- Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
- Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai
PROJECT_ID
). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project. - Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
- Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Google Cloud Shell
Meskipun Google Cloud dan Kubernetes dapat dioperasikan secara jarak jauh dari laptop Anda, dalam codelab ini kita akan menggunakan Google Cloud Shell, yakni lingkungan command line yang berjalan di Cloud.
Mengaktifkan Cloud Shell
- Dari Cloud Console, klik Aktifkan Cloud Shell .
Jika ini pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.
Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.
Mesin virtual ini dimuat dengan semua alat pengembangan yang dibutuhkan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.
Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project sudah ditetapkan ke project ID Anda.
- Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list
Output perintah
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project
Output perintah
[core] project = <PROJECT_ID>
Jika tidak, Anda dapat menyetelnya dengan perintah ini:
gcloud config set project <PROJECT_ID>
Output perintah
Updated property [core/project].
3. Membuat Layanan REST Spring Boot baru
Setelah Cloud Shell diluncurkan, Anda dapat menggunakan command line untuk membuat aplikasi Spring Boot baru dengan Spring Initializr:
$ 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
Buat pengontrol REST baru dengan menambahkan class baru:
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!";
}
}
Pastikan Anda memiliki versi JVM yang tepat untuk aplikasi tersebut:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Anda dapat memulai aplikasi Spring Boot secara normal dengan plugin Spring Boot. Mari lewati pengujian untuk lab ini:
$ ./mvnw -DskipTests spring-boot:run
Setelah aplikasi dimulai, klik ikon Web Preview di toolbar Cloud Shell dan pilih preview di port 8080.
Setelah menunggu sebentar, Anda akan melihat hasilnya:
Di Cloud Shell, Anda juga akan melihat pesan log dengan ID trace dan ID span:
4. Menggunakan Cloud Trace
Mengaktifkan Cloud Trace API
Anda harus mengaktifkan Cloud Trace API terlebih dahulu sebelum menggunakan Cloud Trace untuk menyimpan data trace. Untuk mengaktifkan API, jalankan:
$ gcloud services enable cloudtrace.googleapis.com
Menyiapkan Kredensial Default Aplikasi
Untuk lab ini, Anda harus mengonfigurasi kredensial default aplikasi. Kredensial ini akan otomatis diambil oleh pemicu Spring Cloud GCP Trace.
Pertama, masuk:
$ 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: ...
Klik link untuk membuka tab browser baru, lalu klik Izinkan
Kemudian, salin dan tempel kembali kode verifikasi ke Cloud Shell dan tekan enter. Anda akan melihat:
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
Menambahkan Spring Cloud GCP Trace
Di layanan ini, kita telah menggunakan Spring Cloud Sleuth untuk melakukan pelacakan. Mari kita tambahkan pemicu Spring Cloud GCP Trace untuk meneruskan data ke Cloud Trace.
Tambahkan dependensi 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>
Secara default, Spring Cloud Sleuth tidak mengambil sampel dari setiap permintaan. Untuk mempermudah pengujian, tingkatkan frekuensi sampel hingga 100% di application.properties
untuk memastikan kita melihat data trace, serta mengabaikan beberapa URL yang tidak penting:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Jalankan kembali aplikasi, lalu gunakan Pratinjau Web Cloud Shell untuk melihat aplikasi:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
Secara default, Spring Cloud GCP Trace mengelompokkan data trace dan mengirimkannya sekali setiap 10 detik, atau saat jumlah minimum data trace diterima. Hal ini dapat dikonfigurasi dan Anda dapat membaca dokumentasi referensi Spring Cloud GCP Trace untuk informasi selengkapnya.
Membuat permintaan ke layanan:
$ curl localhost:8080
Di Konsol Cloud, buka Operations → Trace → Trace list
Di bagian atas, persempit rentang waktu menjadi 1 jam. Secara default, opsi Muat Ulang Otomatis diaktifkan. Jadi saat data trace tiba, data tersebut akan muncul di konsol.
Data rekaman aktivitas akan muncul dalam waktu sekitar 30 detik.
Klik titik biru untuk melihat detail trace:
Cukup mudah.
5. Membuat Aplikasi Web Spring Boot kedua
Buka sesi Cloud Shell baru dengan mengklik ikon +:
Pada sesi baru, buat aplikasi Spring Boot kedua:
$ 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
Buat pengontrol REST baru dengan menambahkan class baru:
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";
}
}
Menambahkan Spring Cloud GCP Trace ke pom.xml
pom.xml
<project>
...
<dependencies>
...
<!-- Add Cloud Trace starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Konfigurasikan Sleuth untuk mengambil sampel 100% permintaan:
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Terakhir, Anda dapat memulai aplikasi Spring Boot pada port 8081 dengan plugin 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. Memperbarui Layanan Pertama untuk Menggunakan Layanan Kedua
Saat trace-service-two
berjalan, kembali ke jendela sesi Cloud Shell pertama dan buat perubahan pada trace-service-one
.
Pertama-tama, inisialisasi bean RestTemplate
baru:
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);
}
}
Di WorkController.meeting()
, lakukan panggilan ke layanan Rapat.
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);
}
...
}
Mulai layanan lagi dan picu endpoint dari command line:
$ 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
Di kedua jendela sesi, Anda akan melihat pesan log, dengan Trace ID yang disebarkan dari satu layanan ke layanan lainnya.
Dalam Trace List Cloud Trace, Anda akan melihat trace kedua:
Anda dapat mengklik titik biru baru dan melihat detail rekaman aktivitas:
Anda juga dapat mengklik span mana pun dalam diagram ini untuk melihat detail span.
7. Distribusi Latensi & Laporan Performa
Saat Anda menggunakan Cloud Trace sebagai penyimpanan data trace, Cloud Trace dapat menggunakan data tersebut untuk membuat laporan distribusi latensi. Anda memerlukan lebih dari 100 trace untuk membuat laporan seperti ini:
Anda dapat menjalankan 100+ permintaan pertama menggunakan ok, yang sudah terinstal di Cloud Shell.
$ hey localhost:8080 -n 150
Selain itu, Cloud Trace dapat otomatis mendeteksi regresi performa layanan yang sama di dua jangka waktu yang berbeda di bagian Laporan Analisis.
8. Ringkasan
Di lab ini, Anda telah membuat 2 layanan sederhana dan menambahkan pelacakan terdistribusi dengan Spring Cloud Sleuth, serta menggunakan Spring Cloud GCP untuk meneruskan informasi trace ke Cloud Trace.
9. Selamat!
Anda telah mempelajari cara membuat aplikasi web App Engine pertama Anda!
Pelajari Lebih Lanjut
- Cloud Trace: https://cloud.google.com/trace/
- Project musim semi di GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repositori GitHub Spring di GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java di Google Cloud Platform: https://cloud.google.com/java/
Lisensi
Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.