前言
我们做微服务,随着业务内容越来越多,系统规模也会变得越来越大,各微服务之间的调用关系变得也会越错综复杂。通常一个由客户端发起的请求,在后端很可能会经过多个服务间的调用来协同产生最后的请求结果。
在复杂的微服务架构系统中,几乎每个前端请求都会形成一个复杂的调用链路,在每条链路中,任何一个依赖服务出现延迟过高或错误的时候,都会引起最后的失败,这时候,对于每个服务,全链路跟踪就会越来越重要。
根据上述所说的分布式跟踪问题,spring cloud Sleuth提供了一套完整的解决方案。
搭建
我们还是使用eureka作为服务注册中心,这里不多做解释,直接使用现有工程即可。构建一个微服务应用 trace-1,实现一个rest接口,调用接口后将触发trance-2的接口。
引入依赖starter-web,starter-eureka,starter-ribbon。
创建应用主类,并使用restemplete调用trace-2。代码如下。
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class TranceApplication {
@Bean
@LoadBlanced
RestTemplate restTemplate(){
return new RestTemplate();
}
@RequestMapping(value="/trace-1",method = RequestMethod.GET)
public String trace(){
return restTemplate().getForEntity("*",String.class).getBody();
}
public static void main(String[] args) {
SpringApplication.run(TranceApplication.class,args);
}
}
新建一个微服务应用trace-2,实现一个rest接口,具体代码如下。
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class TranceApplication {
@RequestMapping(value="/trace-2",method = RequestMethod.GET)
public String trace(){
return "trace";
}
public static void main(String[] args) {
SpringApplication.run(TranceApplication.class,args);
}
}
配置eureka。
把eureka和上面两个服务启动起来。实现跟踪,在trace-1和trace-2依赖管理中增加spring-cloud-starter-sleuth依赖即可。然后在打印台上可以看出一些跟踪日志。
跟踪原理
分布式服务跟踪也不发杂,主要实现以下两个关键点。
为了实现请求跟踪,当服务发送到分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的跟踪标识,同时在分布式系统流转中,始终保持这个id。直到返回请求为止。即trace-Id
为了统计各单元的时间延迟,当请求到达各服务组件时,或者处理逻辑到达某个状态时,也通过一个唯一标识来标记它的开始,即spanid,通过请求和结束的时间戳来判断时间延迟。
领取专属 10元无门槛券
私享最新 技术干货