Spring Boot - Melacak Log Layanan Mikro

Sebagian besar pengembang menghadapi kesulitan dalam melacak log jika terjadi masalah. Ini dapat diselesaikan dengan server Spring Cloud Sleuth dan ZipKin untuk aplikasi Spring Boot.

Spring Cloud Sleuth

Log Spring cloud Sleuth dicetak dalam format berikut -

[application-name,traceid,spanid,zipkin-export]

Dimana,

  • Application-name = Nama aplikasi

  • Traceid = setiap permintaan dan respons traceid sama saat memanggil layanan yang sama atau satu layanan ke layanan lain.

  • Spanid = Span Id dicetak bersama dengan Trace Id. Span Id berbeda setiap permintaan dan respon memanggil satu layanan ke layanan lain.

  • Zipkin-export = Secara default ini salah. Jika benar, log akan diekspor ke server Zipkin.

Sekarang, tambahkan dependensi Spring Cloud Starter Sleuth di file konfigurasi build Anda sebagai berikut -

Pengguna Maven dapat menambahkan dependensi berikut ke file pom.xml Anda -

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

Pengguna Gradle dapat menambahkan dependensi berikut dalam file build.gradle Anda -

compile('org.springframework.cloud:spring-cloud-starter-sleuth')

Sekarang, tambahkan Log ke dalam file kelas Rest Controller aplikasi Spring Boot Anda seperti yang ditunjukkan di sini -

package com.tutorialspoint.sleuthapp;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SleuthappApplication {
   private static final Logger LOG = Logger.getLogger(SleuthappApplication.class.getName());
   public static void main(String[] args) {
      SpringApplication.run(SleuthappApplication.class, args);
   }
   @RequestMapping("/")
   public String index() {
      LOG.log(Level.INFO, "Index API is calling");
      return "Welcome Sleuth!";
   }
}

Sekarang, tambahkan nama aplikasi di file application.properties seperti yang ditunjukkan -

spring.application.name = tracinglogs

Kode lengkap untuk file konfigurasi build diberikan di bawah ini -

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>sleuthapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>sleuthapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-sleuth</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
ext {
   springCloudVersion = 'Edgware.RELEASE'
}
dependencies {
   compile('org.springframework.cloud:spring-cloud-starter-sleuth')
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
   imports {
      mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle berikut.

Untuk Maven, Anda dapat menggunakan perintah berikut -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, Anda dapat menggunakan perintah berikut -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Sekarang, jalankan file JAR dengan menggunakan perintah yang ditunjukkan di sini -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 8080.

Sekarang, tekan URL di browser web Anda dan lihat hasilnya di log konsol.

http://localhost:8080/

Anda dapat melihat log berikut di jendela konsol. Perhatikan bahwa log dicetak dalam format berikut [application-name, traceid, spanid, zipkin-export]

Server Zipkin

Zipkin adalah aplikasi yang memantau dan mengelola log Spring Cloud Sleuth dari aplikasi Spring Boot Anda. Untuk membangun server Zipkin, kita perlu menambahkan dependensi Zipkin UI dan Zipkin Server di file konfigurasi build kita.

Pengguna Maven dapat menambahkan dependensi berikut ke file pom.xml Anda -

<dependency>
   <groupId>io.zipkin.java</groupId>
   <artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
   <groupId>io.zipkin.java</groupId>
   <artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>

Pengguna Gradle dapat menambahkan dependensi di bawah ini dalam file build.gradle Anda -

compile('io.zipkin.java:zipkin-autoconfigure-ui')
compile('io.zipkin.java:zipkin-server')

Sekarang, konfigurasikan server.port = 9411 di file properti aplikasi.

Untuk pengguna file properti, tambahkan properti di bawah ini dalam file application.properties.

server.port = 9411

Untuk pengguna YAML, tambahkan properti di bawah ini dalam file application.yml.

server:
   port: 9411

Tambahkan anotasi @EnableZipkinServer di kelas aplikasi Spring Boot utama Anda. Anotasi @EnableZipkinServer digunakan untuk memungkinkan aplikasi Anda bertindak sebagai server Zipkin.

package com.tutorialspoint.zipkinapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.EnableZipkinServer;

@SpringBootApplication
@EnableZipkinServer
public class ZipkinappApplication {
   public static void main(String[] args) {
      SpringApplication.run(ZipkinappApplication.class, args);
   }
}

Kode untuk file konfigurasi build lengkap diberikan di bawah ini.

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>zipkinapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>zipkinapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.RELEASE</version>
      <relativePath /> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>io.zipkin.java</groupId>
         <artifactId>zipkin-server</artifactId>
      </dependency>
      <dependency>
         <groupId>io.zipkin.java</groupId>
         <artifactId>zipkin-autoconfigure-ui</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
ext {
   springCloudVersion = 'Edgware.RELEASE'
}
dependencies {
   compile('io.zipkin.java:zipkin-autoconfigure-ui')
   compile('io.zipkin.java:zipkin-server')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
   imports {
      mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

Anda dapat membuat file JAR yang dapat dieksekusi, dan menjalankan aplikasi Spring Boot menggunakan perintah Maven atau Gradle di bawah ini -

Untuk Maven, gunakan perintah yang diberikan di bawah ini -

mvn clean install

Setelah “BUILD SUCCESS”, Anda dapat menemukan file JAR di bawah direktori target.

Untuk Gradle, gunakan perintah yang diberikan di bawah ini -

gradle clean build

Setelah "BUILD SUCCESSFUL", Anda dapat menemukan file JAR di bawah direktori build / libs.

Jalankan file JAR dengan menggunakan perintah yang ditunjukkan -

java –jar <JARFILE>

Sekarang, aplikasi telah dimulai pada port Tomcat 9411 seperti yang ditunjukkan di bawah ini -

Sekarang, tekan URL di bawah dan lihat UI server Zipkin.

http://localhost:9411/zipkin/

Kemudian, tambahkan ketergantungan berikut di aplikasi layanan klien Anda dan tunjukkan URL Server Zipkin untuk melacak log layanan mikro melalui Zipkin UI.

Sekarang, tambahkan dependensi Spring Cloud Starter Zipkin di file konfigurasi build Anda seperti yang ditunjukkan -

Pengguna Maven dapat menambahkan dependensi berikut dalam file pom.xml -

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

Pengguna Gradle dapat menambahkan dependensi di bawah ini dalam file build.gradle -

compile('org.springframework.cloud:spring-cloud-sleuth-zipkin')

Sekarang, tambahkan Always Sampler Bean di aplikasi Spring Boot Anda untuk mengekspor log ke server Zipkin.

@Bean
public AlwaysSampler defaultSampler() {
   return new AlwaysSampler();
}

Jika Anda menambahkan AlwaysSampler Bean, maka secara otomatis opsi Spring Sleuth Zipkin Export akan berubah dari false menjadi true.

Selanjutnya, konfigurasikan URL basis Server Zipkin Anda di file application.properties layanan klien.

spring.zipkin.baseUrl = http://localhost:9411/zipkin/

Kemudian, berikan id pelacakan dan temukan jejaknya di Zipkin UI.

http://localhost:9411/zipkin/traces/{traceid}/