浅尝Spring Cloud Sleuth

Spring Cloud Sleuth提供了分布式追踪(distributed tracing)的一个解决方案。其基本思路是在服务调用的请求和响应中加入ID,标明上下游请求的关系。利用这些信息,可以方便地分析服务调用链路和服务间的依赖关系。

Only Sleuth

在Spring Tool Suite的文件菜单中,点击新建Spring Starter Project。

在请求处理方法内加上一行日志代码。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

@RestController
@SpringBootApplication
public class SpringcloudSleuthApplication {

	private static Logger log = LoggerFactory.getLogger(SpringcloudSleuthApplication.class);
	@RequestMapping("/")
	public String home() {
		log.info("Handling home");
		return "Hello World";
	}

	public static void main(String[] args) {
		SpringApplication.run(SpringcloudSleuthApplication.class, args);
	}
}

设定应用程序端口及名称。

server.port=10001

spring.application.name=sleuth-demo-without-zipkin

启动程序并浏览页面后,可以看到日志信息里多了点东西。

[sleuth-demo-without-zipkin,6c00dba1679ee164,6c00dba1679ee164,false]

这一串数据里包含四个部分

  • appname - 应用程序名称
  • traceId - 追踪系统中的唯一标识
  • spanId - 具体操作的唯一标识
  • exportable - 是否日志要导出到Zipkin

Sleuth + Zipkin

Zipkin Server

要想把追踪数据发送到Zipkin上,首先需要建立一个Zipkin Server应用程序,在pom.xml里加上如下依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>

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

然后在启动类加上@EnableZipkinServer标记。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import zipkin2.server.internal.EnableZipkinServer;

@EnableZipkinServer
@SpringBootApplication
public class SpringcloudZipkinServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringcloudZipkinServerApplication.class, args);
	}
}

application.properties文件中可修改默认端口,server.port=10000

打开相关页面,如下:

Zipkin Client

再新建一个应用程序。

启动程序代码基本一样。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

@RestController
@SpringBootApplication
public class SpringcloudZipkinApplication {

	private static Logger log = LoggerFactory.getLogger(SpringcloudZipkinApplication.class);
	@RequestMapping("/")
	public String home() {
		log.info("Handling home");
		return "Hello World";
	}
	
	public static void main(String[] args) {
		SpringApplication.run(SpringcloudZipkinApplication.class, args);
	}
}

application.properties文件里加上Zipkin Server的地址,同时为了每次都将数据传入Zipkin,需要把spring.sleuth.sampler.probability的值改为1.0。

server.port=10002

spring.application.name=sleuth-demo-with-zipkin
spring.zipkin.base-url=http://localhost:10000
spring.sleuth.sampler.probability=1.0

启动Zipkin Client后,可以看到Zipkin Server页面上多了一条追踪数据。

再次刷新Zipkin Client页面,又会有条新的数据。

在看控制台的日志记录,exportable项变成了true,说明数据已传入Zipkin。

posted @ 2018-09-28 22:57  Ken.W  阅读(7773)  评论(1编辑  收藏  举报