个人博客:程序员笑笑生,欢迎浏览博客!java
上一章 SpringCloud 基础教程(十)-Zuul 服务网关当中,咱们了解了Zuul在微服架构中担任着重要的网关角色,并实现了一个简单的Token过滤。本章咱们将介绍另外一个服务组件Spring Cloud Sleuth。程序员
在微服务系统中,业务的调用多数不是在一个进程中实现的,能够知道,随着服务的拆分,微服务组件是愈来愈多,每一个模块都是不一样的人维护,一个请求会涉及多个服务协调的处理,那么当出现故障时,如何快速的定位线上的故障呢?spring
比较成熟的方案是经过调用链的方式,把一个用户的请求串联起来。Sping Cloud Sleuth是一个分布式的调用链跟踪工具:架构
在咱们以前的章节中,咱们有了如下的服务组件:app
咱们在服务消费者server-consumer、服务提供者server-provider和eureka-server引入sleuth依赖,并启动注册中心、服务提供者和服务消费者:负载均衡
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
服务消费者server-consumer控制器,helloApi是Feign编写的接口,注入调用:分布式
@RestController @RequestMapping("/hystrix") public class HystrixController { private final Logger logger = LoggerFactory.getLogger(HystrixController.class); @Autowired HelloApi helloApi; @RequestMapping("/sayHello") @HystrixCommand(fallbackMethod = "sayError") public String sayHello(String name) { return helloApi.sayHello(name); } @RequestMapping("/sayHello") @HystrixCommand(fallbackMethod = "sayError") public String sayHello(String name) { logger.info("server-consumer :{}"+name); return helloApi.sayHello(name); }
服务提供者server-provider控制器:ide
@RestController public class RibbonController { private final Logger logger = LoggerFactory.getLogger(RibbonController.class); @Value("${server.port}") private String port; @RequestMapping("/sayHello") public String sayHello(String name) { logger.info("server-provider :{}"+name); return "from:" + port + ",hello!," + name; }
启动程序后,而后经过HTTP方式调用接口 http://localhost:5168/hystrix/sayHello?name=name,接口正确返回结果,同时咱们能够看到后台日志:微服务
服务消费者日志:工具
2020-01-30 22:34:30.118 INFO [server-consumer,ef944d0faefb97cd,c72e13f0bd0a4398,false] 10904 --- [rixController-1] c.m.consumer.test.HystrixController : server-consumer :{}name
服务提供者日志:
2020-01-30 22:34:30.366 INFO [server-provider,ef944d0faefb97cd,aef54537badf8ea0,false] 22664 --- [nio-9001-exec-1] c.m.provider.RibbonController : server-provider :{}name
能够看到日志信息多出了不少信息如: [server-consumer,ef944d0faefb97cd,c72e13f0bd0a4398,false],
在引入spring-cloud-starter-sleuth依赖后,客户端的每一次请求,都会生成这样的日志,Spring Cloud Sleuth借用了Dapper的术语:
Span:最小的工做单元,发送一个RPC请求或者响应一个RPC请求也是一个新的Span,SpringCloud Sleuth会为其生成一个64位的全局惟一的ID,包括了时间、标签、SpanID,进程ID(IP)。
Trace:理解为一个完整的调用链请求
Annotation :用来及时记录时间的存在,用一些重要的注解定义请求的开始和结束
1 、cs Client-Request 客户端发送请求,描述一个Span的开始
2 、sr Server Recoived 服务端接受请求,并开始处理
3 、ss Server Sent 表示请完成
4 、cr Client- Received 表示Span的结束
能够用图的形式表示一次调用链的实例:
从图中咱们能够看到,一次完整的用户请求,TraceID是不变的,无论中间通过了多少的服务,TraceID是惟一肯定的。而SpanId的变化是发生了RPC请求。这样咱们就能够更具这些信息,若是让生为了故障,咱们就能够追踪具体的服务组件了。
本章咱们简单介绍了在分布式环境下,咱们该用什么样的方法快速的定位服务的故障,了解了Spring Cloud Sleuth的简单概念,以及如何在项目中应用,固然仅仅收集这些日志信息是不够的,咱们须要的把它给收集起来,一般Spring Cloud Sleuth会打印日志汇集值Zipkin中,有Zipkin收集、存储、提供查询等。接下来咱们会介绍如何在Spring Cloud生态下集成Zipkin。
----END---- 以就是本期的分享,你还能够关注公众号: 程序员笑笑生,关注更多精彩内容!
SpringCloud基础教程(一)-微服务与SpringCloud
SpringCloud基础教程(二)-服务发现 Eureka
SpringCloud基础教程(五)-配置中心热生效和高可用
SpringCloud 基础教程(六)-负载均衡Ribbon
SpringCloud 基础教程(七)-Feign声明式服务调用
SpringCloud 基础教程(八)-Hystrix熔断器(上)
SpringCloud 基础教程(九)-Hystrix服务监控(下)
SpringCloud 基础教程(十一)- Sleuth 调用链追踪简介
更多精彩内容,请期待...
本文由博客一文多发平台 OpenWrite 发布!
个人博客地址兰陵笑笑生,欢迎浏览!