我们来讲服务追踪,创建订单时候发一个请求,发现耗时很严重,2.2秒,下个订单发这么多时间,用户体验还是很不好的,那么问题原因出在哪儿呢,我们来看一下下单的代码,我们猜测可能是在调用商品服务的时候,获取商品信息这个接口,耗时比较严重,调用WEB服务,也可能是扣库存这个地方,耗时比较严重,那我怎么确认是这个接口耗时比较严重呢,想到的方法是计时,在调用前我记一下时间,在调用之后记一下时间,这不就得出来了吗,那假设定位到了这个问题,是调这个接口造成的,那我们就要和负责人去沟通了,我调你这个接口耗时很严重,你得给我解决,然后他开始看他的代码了,他看他这个方法,他这个方法又可能调用WEB的服务,就像这个图里面的,A调用B,B再调用C,这是一整条链路,当服务的链路越来越多,链路越来越长的时候,你再通过日志打点计时这种方法去排查问题,这效率也非常低,排查起来非常非常不方便,那应该怎么办呢,这就是我们的内容,我们要做的事情其实有一个专有名词,叫做链路监控,Spring Cloud也提供了非常方便的组件,叫做Spring Cloud Sleuth,Sleuth翻译成中文,就是侦查的意思,链路监控这块的内容呢,要写的并不是特别多,主要是要会看,呈现出来的界面指标,大家要学会去看,接下来我来演示一下,如何来使用这个组件,打开我们的项目,order这个服务,第一步引入sleuth这个组件org.springframework.cloudspring-cloud-starter-sleuthlocalhost:8010/order/createWARN [order,4272188df7f7932b,4272188df7f7932b,false]看一下日志,多了好几条这样的日志,这个地方的日志就是我们刚刚用的sleuth,组件打印出来的,我们来看一下到底什么意思,第一个想都不用想,肯定是服务的名字,第二个值是ID,一条链路里面,最多包含一个ID,也就是唯一标识,第三个值是ID,是一个基本单元,一条链路请求里面,包含多个ID,可以理解成一个基本的工作单元,比如发送一个HTTP请求,最后一个值看奥是false,true是标识要把这个信息输出到其他服务,来搜集和展示,false就是不搜集,我们再多下几个订单看一下,可以看到没有打印出来sleuth的指标,我们现在可以把日志级别给他调整了,可以看到更多的内容,日志的级别改成debug模式logging.level.org.springframework.cloud.netflix.feign=debug
logging.file=springboot.log
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd} ==== [%thread] %-5level ==== %logger{50} ==== %msg%n我们现在给商品组件也加上sleuth组件logging.level.com.learn=trace日志级别也给他调整一下,logging.level.com.learn=trace已经启动了,我们再来下个单http://localhost:8010/createOrder可以看到这里日志打印出来了2019-09-09 10:45:12.195 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.290 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.650 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.686 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.730 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.739 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.781 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]
2019-09-09 10:45:12.784 INFO [order,2e776ec6dfbf8055,2e776ec6dfbf8055,false]http://localhost:8010/createOrder2019-09-09 10:50:37.430 INFO [product,,,]
2019-09-09 10:50:37.430 INFO [product,,,]
2019-09-09 10:50:38.023 INFO [product,,,]现在监控的指标内容是产生了,我们看不能在控制台看来看去,我们肯定需要一个界面化的东西,比较友好的展示出来,最主要的还是学会看,这里我们用到的是zipkin这个框架https://zipkin.io可以看一下他的介绍,这是官网,我们看一下如何来使用,这里有一个quickstarthttps://zipkin.io/pages/quickstart.html我们使用到的方式呢,第一个也是提供了docker的方式,我们也用这个来做,特别方便,直接用docker来做,下面是用JAVA,使用他的源码,我们就用docker他默认的端口是9411docker run -d -p 9411:9411 openzipkin/zipkin大家在自己电脑上运行得一段时间,看现在已经启动起来了
59.110.158.145:9411用docker就是方便,搭建了这么一个系统,可以看到上面有服务名,这里有种种指标,他这里只是一个展示的界面,我们如何把数据跟这个界面,给他接起来呢,我们要把数据发过来,我们回到项目里面,同样的添加依赖,org.springframework.cloudspring-cloud-starter-sleuth-zipkin在这其实我们还有一个依赖,我们来看一下这三个依赖,org.springframework.cloudspring-cloud-starter-zipkin这三个,每一个是不一样的,仔细看这单词,spring-cloud-starter-zipkin这个包含了这两个org.springframework.cloudspring-cloud-sleuth-zipkin${project.version}org.springframework.cloudspring-cloud-starter-sleuth${project.version}start-sleuth,sleuth-zipkin,刚好是包好了这两个,所以我们可以只用这一个依赖,写一个注释,包含sleuth和zipkin,引入依赖之后,我们要把数据给传过去,直接配置就好了zipkin.base-url=localhost:9411spring.zipkin.base-url=http://59.110.158.145:9411/我们现在order项目里面重启一下,我们再来请求一下下单的接口你会发现这里还是没有数据http://59.110.158.145:9411/zipkin/按理来说数据不是应该发过来了吗,怎么回事呢,还记得刚刚说的第四个值吗,第四个值是是否将该信息给他输出到外部去观察,比如输出到zipkin去观察,这里都是false,没有输出过去,开发环境下我们要求所有的都输出过去,要想输出过去,在配置=文件里面还要配置一个东西,spring:zipkin:base-url: http://localhost:9411/sleuth:sampler:probability: 1 #样本采集量,默认为0.1,为了测试这里修改为1,正式环境一般使用默认值。spring.sleuth.sampler.probability=1我们可以点进去看,这个是个百分比,/*** Properties related to sampling** @author Marcin Grzejszczak* @author Adrian Cole* @since 1.0.0*/
@ConfigurationProperties("spring.sleuth.sampler")
public class SamplerProperties {/*** Percentage of requests that should be sampled. E.g. 1.0 - 100% requests should be* sampled. The precision is whole-numbers only (i.e. there's no support for 0.1% of* the traces).*/private float percentage = 0.1f;public float getPercentage() {return this.percentage;}public void setPercentage(float percentage) {this.percentage = percentage;}
}默认的是0.1,0.1就是10%,这个什么意思呢,其实它并不是我们想象中的,把所有的请求都发出去,默认的只将10%的请求,发送到外部的服务,比如zipkin,那么他为什么不全部发出去呢,大家要想一下,如果全部发出去的话,对服务的性能啊,还有带宽,都是有要求的,我们要监控的请求,他就是10%,那么你万个请求里面,挑1千个,其实也能够发现问题的,这就是一个抽样,抽样观察,那么开发环境我们可以设置为1,1就是百分之百,所有的数据都发送出去,spring.sleuth.sampler.percentage=1已经重启成功了,再来下个单,现在再来看一下链路追踪,现在已经有了,有了order这个服务http://59.110.158.145:9411/zipkin/http://localhost:8010/listForOrder我们点查找,就可以看到请求了