Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可。
微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂。
-
Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过一个64位ID唯一标识,trace以另一个64位ID表示,span还有其他数据信息,比如摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(通常是IP地址)。
span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时刻停止它。 -
Trace:一系列spans组成的一个树状结构,例如,如果你正在跑一个分布式大数据工程,你可能需要创建一个trace。
-
Annotation:用来及时记录一个事件的存在,一些核心annotations用来定义一个请求的开始和结束
- cs - Client Sent -客户端发起一个请求,这个annotion描述了这个span的开始。
- sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络延迟。
- ss - Server Sent -注解表明请求处理的完成(当请求返回客户端),如果ss减去sr时间戳便可得到服务端需要的处理请求时间。
- cr - Client Received -表明span的结束,客户端成功接收到服务端的回复,如果cr减去cs时间戳便可得到客户端从服务端获取回复的所有所需时间。
基本内容讲解完毕,也许您有很多的疑问,但是没关系,您可以先按照接下来的内容进行操作,慢慢消化。本篇文章一共创建了四个工程:
zipkin服务(zipkin-server-2.10.1-exec.jar) 9411
服务注册中心(spring-cloud-eureka-server) 8080
对外提供接口“gethello”服务(spring-cloud-zipkin-app-1) 8081
调用接口服务(spring-cloud-zipkin-app-2) 8082
1、下载zipkin的jar工程
在Spring Cloud新版本当中,,已经不需要自己构建Zipkin Server了,只需要下载jar即可,下载地址:
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
下载完成以后,使用命令进行启动jar:
java -jar zipkin-server-2.10.1-exec.jar
2、创建Eureka Server(spring-cloud-eureka-server)
创建Eureka Server服务注册中心,具体工程不再赘述,可以查看之前的文章 第二章 Spring Cloud 服务的注册与发现(Eureka Server)
3、创建spring-cloud-zipkin-app-1工程
第一步:创建一个Spring Boot的module工程
创建一个普通的Spring Boot项目,具体工程不再赘述,很简单。
第二步:添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
第三步:在配置文件当中进行配置
配置文件当中特别要注意的是要添加Zipkin Server的注册地址
server:
port: 8081
spring:
application:
name: spring-cloud-zipkin-app-1
zipkin:
base-url: http://localhost:9411 #1
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka/
#1、将当前服务添加到Zipkin Server当中
第四步:在入口类Application类注入Sampler
package com.brimen.springcloudzipkinapp1;
import brave.sampler.Sampler;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class SpringCloudZipkinApp1Application {
public static void main(String[] args) {
SpringApplication.run(SpringCloudZipkinApp1Application.class, args);
}
@Bean
public Sampler defaultSampler() {
return Sampler.ALWAYS_SAMPLE;
}
}
第五步:创建一个对外的接口
当前服务的角色主要是作为一个服务提供者,并不直接对外,是提供给spring-cloud-zipkin-app-2调用的接口
代码如下:
package com.brimen.springcloudzipkinapp1;
import brave.sampler.Sampler;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class SpringCloudZipkinApp1Application {
public static void main(String[] args) {
SpringApplication.run(SpringCloudZipkinApp1Application.class, args);
}
@Bean
public Sampler defaultSampler() {
return Sampler.ALWAYS_SAMPLE;
}
}
到此spring-cloud-zipkin-app-1工程创建完成
4、创建spring-cloud-zipkin-app-2工程
第一步:创建一个Spring Boot的module工程
过程不再赘述。
第二步:添加依赖
依赖和spring-cloud-zipkin-app-1一致。
第三步:在配置文件当中进行配置
除了端口不一样外,其它的配置同spring-cloud-zipkin-app-1
server:
port: 8082
spring:
application:
name: spring-cloud-zipkin-app-2
zipkin:
base-url: http://localhost:9411 #1
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka/
#1、将当前服务添加到Zipkin Server当中
第四步:在入口类Application类注入Sampler
依赖和spring-cloud-zipkin-app-1一致。
第五步:创建一个Service接口,来调用spring-cloud-zipkin-app-1的接口
此处使用了“Feign”的调用方式,不理解的可以查看之前的文章。
代码如下:
package com.brimen.springcloudzipkinapp2.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "spring-cloud-zipkin-app-1")
public interface HelloService {
@RequestMapping(value = "/hello/gethello",method = RequestMethod.GET)
public String getHelloValue(@RequestParam(value = "name") String name);
}
第六步:创建一个对外的gethello方法,并且需要调用service方法
代码如下:
package com.brimen.springcloudzipkinapp2.controller;
import com.brimen.springcloudzipkinapp2.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/hello")
public class HelloController {
@Autowired
private HelloService helloService;
/**
* getHello方法
* @return
*/
@GetMapping("/gethello")
public String getHello(){
return helloService.getHelloValue("");
}
}
5、依次启动项目
依次启动zipkin-server-2.10.1-exec.jar、spring-cloud-eureka-server、spring-cloud-zipkin-app-1
和spring-cloud-zipkin-app-2
访问: http://localhost:9411 ,点击Dependencies,可以发现服务的依赖关系