Spring Cloud - Layanan Penelusuran dengan Zipkin

1. Ikhtisar

Pada artikel ini, kami akan menambahkan Zipkin ke proyek awan musim semi kami. Zipkin adalah proyek sumber terbuka yang menyediakan mekanisme untuk mengirim, menerima, menyimpan, dan memvisualisasikan jejak. Hal ini memungkinkan kami untuk menghubungkan aktivitas antar server dan mendapatkan gambaran yang lebih jelas tentang apa yang sebenarnya terjadi di layanan kami.

Artikel ini bukan artikel pengantar untuk penelusuran terdistribusi atau awan pegas. Jika Anda menginginkan informasi lebih lanjut tentang pelacakan terdistribusi, baca pengantar kami tentang spring sleuth.

2. Layanan Zipkin

Layanan Zipkin kami akan berfungsi sebagai toko untuk semua span kami. Setiap rentang dikirim ke layanan ini dan dikumpulkan menjadi jejak untuk identifikasi di masa mendatang.

2.1. Mendirikan

Buat proyek Spring Boot baru dan tambahkan dependensi ini ke pom.xml:

 io.zipkin.java zipkin-server   io.zipkin.java zipkin-autoconfigure-ui runtime 

Untuk referensi: Anda dapat menemukan versi terbaru di Maven Central (zipkin-server, zipkin-autoconfigure-ui). Versi dependensi diwarisi dari spring-boot-starter-parent.

2.2. Mengaktifkan Server Zipkin

Untuk mengaktifkan server Zipkin , kita harus menambahkan beberapa anotasi ke kelas aplikasi utama:

@SpringBootApplication @EnableZipkinServer public class ZipkinApplication {...}

Anotasi baru @EnableZipkinServer akan menyiapkan server ini untuk mendengarkan span yang masuk dan bertindak sebagai UI untuk kueri.

2.3. Konfigurasi

Pertama, mari buat file bernama bootstrap.properties di src / main / resources . Ingatlah bahwa file ini diperlukan untuk mengambil konfigurasi kita dari server konfigurasi keluar.

Mari tambahkan properti ini ke dalamnya:

spring.cloud.config.name=zipkin spring.cloud.config.discovery.service-id=config spring.cloud.config.discovery.enabled=true spring.cloud.config.username=configUser spring.cloud.config.password=configPassword eureka.client.serviceUrl.defaultZone= //discUser:[email protected]:8082/eureka/

Sekarang mari tambahkan file konfigurasi ke repo config kita, yang terletak di c: \ Users \ {username} \ di Windows atau / home / {username} / on * nix.

Di direktori ini, mari tambahkan file bernama zipkin.properties dan tambahkan konten berikut:

spring.application.name=zipkin server.port=9411 eureka.client.region=default eureka.client.registryFetchIntervalSeconds=5 logging.level.org.springframework.web=debug

Ingatlah untuk melakukan perubahan dalam direktori ini sehingga layanan konfigurasi akan mendeteksi perubahan dan memuat file.

2.4. Lari

Sekarang mari jalankan aplikasi kita dan arahkan ke // localhost: 9411. Kami akan disambut dengan beranda Zipkin :

Bagus! Sekarang kami siap untuk menambahkan beberapa dependensi dan konfigurasi ke layanan kami yang ingin kami lacak.

3. Konfigurasi Layanan

Pengaturan untuk server sumber daya hampir sama. Di bagian berikut, kami akan menjelaskan secara rinci cara menyiapkan layanan buku. Kami akan menindaklanjutinya dengan menjelaskan modifikasi yang diperlukan untuk menerapkan pembaruan ini ke layanan peringkat dan layanan gateway .

3.1. Mendirikan

Untuk mulai mengirim span ke server Zipkin kami , kami akan menambahkan dependensi ini ke file pom.xml kami :

 org.springframework.cloud spring-cloud-starter-zipkin 

Untuk referensi: Anda dapat menemukan versi terbaru di Maven Central (spring-cloud-starter-zipkin).

3.2. Konfigurasi Musim Semi

Kita perlu menambahkan beberapa konfigurasi agar layanan buku akan menggunakan Eureka untuk menemukan layanan Zipkin kita . Buka BookServiceApplication.java dan tambahkan kode ini ke file:

@Autowired private EurekaClient eurekaClient; @Autowired private SpanMetricReporter spanMetricReporter; @Autowired private ZipkinProperties zipkinProperties; @Value("${spring.sleuth.web.skipPattern}") private String skipPattern; // ... the main method goes here @Bean public ZipkinSpanReporter makeZipkinSpanReporter() { return new ZipkinSpanReporter() { private HttpZipkinSpanReporter delegate; private String baseUrl; @Override public void report(Span span) { InstanceInfo instance = eurekaClient .getNextServerFromEureka("zipkin", false); if (!(baseUrl != null && instance.getHomePageUrl().equals(baseUrl))) { baseUrl = instance.getHomePageUrl(); delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter); if (!span.name.matches(skipPattern)) delegate.report(span); } } }; }

Konfigurasi di atas mendaftarkan ZipkinSpanReporter khusus yang mendapatkan URL-nya dari eureka. Kode ini juga melacak URL yang ada dan hanya memperbarui HttpZipkinSpanReporter jika URL berubah. Dengan cara ini di mana pun kami menerapkan server Zipkin kami, kami akan selalu dapat menemukannya tanpa memulai ulang layanan.

Kami juga mengimpor properti Zipkin default yang dimuat oleh boot musim semi dan menggunakannya untuk mengelola pelapor khusus kami.

3.3. Konfigurasi

Sekarang mari tambahkan beberapa konfigurasi ke file book-service.properties kita di repositori config:

spring.sleuth.sampler.percentage=1.0 spring.sleuth.web.skipPattern=(^cleanup.*)

Zipkin bekerja dengan mengambil sampel tindakan di server. Dengan menyetel persentase spring.sleuth.sampler.percentage ke 1.0, kami menyetel tingkat pengambilan sampel ke 100%. Pola lewati hanyalah regex yang digunakan untuk mengecualikan span yang namanya cocok.

Pola lewati akan memblokir semua span agar tidak dilaporkan yang dimulai dengan kata 'pembersihan'. Ini untuk menghentikan span yang berasal dari basis kode sesi pegas.

3.4. Layanan Peringkat

Ikuti langkah-langkah yang sama dari bagian layanan buku di atas, menerapkan perubahan ke file yang setara untuk layanan peringkat.

3.5. Layanan Gateway

Follow the same steps book-service. But when adding the configuration to the gateway.properties add these instead:

spring.sleuth.sampler.percentage=1.0 spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)

This will configure the gateway service not to send spans about the favicon or spring session.

3.6. Run

If you haven't done so already, start the config, discovery, gateway, book, rating, and zipkin services.

Navigate to //localhost:8080/book-service/books.

Open a new tab and navigate to //localhost:9411. Select book-service and press the ‘Find Traces' button. You should see a trace appear in the search results. Click that trace of opening it:

On the trace page, we can see the request broken down by service. The first two spans are created by the gateway, and the last is created by the book-service. This shows us how much time the request spent processing on the book-service, 18.379 ms, and on the gateway, 87.961 ms.

4. Conclusion

We have seen how easy it is to integrate Zipkin into our cloud application.

This gives us some much-needed insight into how communication travels through our application. As our application grows in complexity, Zipkin can provide us with much-needed information on where requests are spending their time. This can help us determine where things are slowing down and indicate what areas of our application need improvement.

Seperti biasa, Anda dapat menemukan kode sumber di Github.