随着业务的发展,系统规模也会变得越来越大,各微服务间的调用关系也变得越来越错综复杂。通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,在复杂的微服务架构系统中,几乎每一个前端请求都会形成一条复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟过高或错误的时候都有可能引起请求最后的失败。这时候,对于每个请求,全链路调用的跟踪就变得越来越重要,通过实现对请求调用的跟踪可以帮助我们快速发现错误根源以及监控分析每条请求链路上的性能瓶颈等。
针对上面所述的分布式服务跟踪问题,Spring Cloud Sleuth提供了 一套完整的解决方案。
Zipkin是Twitter的一个开源项目,它基于 Google Dapper 实现。我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助查询跟踪数据以实现对分布式系统的监控程序,从而及时发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的API接口之外,它还提供了方便的UI组件来帮助我们直观地搜索跟踪信息和分析请求链路明细,比如可以查询某段时间内各用户请求的处理时间等。
下图展示了Zipkin的基础架构, 它主要由4个核心组件构成。
(1)新建一个SpringBoot项目,命名无要求;
(2)pom.xml,添加zipkin依赖
io.zipkin.java
zipkin-server
io.zipkin.java
zipkin-autoconfigure-ui
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
(3)application.yml
spring:
application:
name: zipkin-server
server:
port: 5595
(4)入口类
@EnableZipkinServer
@SpringBootApplication
public class SpringcloudsleuthzipkinApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudsleuthzipkinApplication.class, args);
}
}
(5)创建完上述工程之后,我们将其启动起来,并访问http: I /localhost:5595/, 可以看到如下图所示的Zipkin管理页面:
(2)pom.xml
4.0.0
com.example
springcloudsleuthtrace1
0.0.1-SNAPSHOT
jar
springcloudsleuthtrace1
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
UTF-8
UTF-8
1.8
Edgware.SR1
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-zipkin
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
(3)application.yml
server:
port: 5596
spring:
zipkin:
base-url: http://localhost:5595
application:
name: trace1-client
(4)入口类
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class Springcloudsleuthtrace1Application {
private static final Logger log = LoggerFactory.getLogger(Springcloudsleuthtrace1Application.class);
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
@RequestMapping(value = "/trace1", method = RequestMethod.GET)
public String trace() {
log.info("<<<<<-call trace1->>>>>");
return restTemplate().getForEntity("http://localhost:5597/trace2", String.class).getBody();
}
public static void main(String[] args) {
SpringApplication.run(Springcloudsleuthtrace1Application.class, args);
}
}
(2)pom.xml
4.0.0
com.example
springcloudsleuthtrace2
0.0.1-SNAPSHOT
jar
springcloudsleuthtrace2
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
UTF-8
UTF-8
1.8
Edgware.SR1
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-zipkin
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
(3)application.yml
server:
port: 5597
spring:
zipkin:
base-url: http://localhost:5595
application:
name: trace2-client
(4)入口类
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class Springcloudsleuthtrace2Application {
private static final Logger log = LoggerFactory.getLogger(Springcloudsleuthtrace2Application.class);
@RequestMapping(value = "/trace2", method = RequestMethod.GET)
public String trace(){
log.info("=====<<>>=====");
return "Trace";
}
public static void main(String[] args) {
SpringApplication.run(Springcloudsleuthtrace2Application.class, args);
}
}
(2)访问http://localhost:5596/trace1
得到的结果是http://localhost:5597/trace2的内容,程序通过:
restTemplate().getForEntity("http://localhost:5597/trace2", String.class).getBody();
使用RestTemplate调用 trace2应用的接口。
(3)打开zipkin管理界面--依赖分析
参考资料《Spring Cloud微服务实战》