咱们都知道,微服务之间经过feign传递,在复杂的微服务架构系统中,几乎每个前端请求都会造成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟超时或者错误都有可能引发整个请求最后的失败。当业务流程足够复杂时,一个完整的HTTP请求调用链通常会通过多个微服务系统,要经过日志来跟踪一整个调用链变得再也不那么简单。经过sleuth能够很方便的看出每一个采集请求的耗时状况,分析出哪些服务调用比较耗时,当服务调用的耗时随着请求量的增大而增大时,能够针对业务作一些优化措施。因此咱们能够经过咱们能够经过Spring Cloud Sleuth来解决这个问题。这里咱们将演示如何经过Spring Cloud Sleuth来追踪这个过程,并借助Zipkin以图形化界面的方式展现。 展现以前,分别介绍一下rabbitmq、sleuth、zinkip。html
rabbitmq前端
sleuth和zinkipjava
sleuth中的一些术语mysql
- 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时间戳即可获得客户端从服务端获取回复的全部所需时间
接下来就开始搭建
这里cloud版本用的Greenwich.SR1,boot使用的是2.1.6 git
1.在pom.xml中 引入sleuth依赖程序员
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
2.模拟两个日志 这两个服务之间经过feign调用,由test调用system,这里原本有一个注册中心,这里就不在演示了 github
test模块面试
@Slf4j @RestController public class TestController { @Autowired private IHelloService helloService; @GetMapping("hello") public String hello(String name) { log.info("Feign调用system的/hello服务"); return this.helloService.hello(name); } }
在test模块的service包下建立IHelloServicespring
@FeignClient(value = "system",contextId = "helloServiceClient") public interface IHelloService { @GetMapping("hello") String hello(@RequestParam("name") String name); }
system 模块sql
@Slf4j @RestController public class TestController { @GetMapping("hello") public String hello(String name) { log.info("/hello服务被调用"); return "hello" + name; } }
3.访问接口 localhost:8202/test/hello?name=sleuth:会出现两个咱们自定义的日志
启动的时候查看test模块产生的
2019-08-23 14:22:51.774 INFO [test,72bb0469bee07104,72bb0469bee07104,false] 22728 --- [nio-8202-exec-1] c.m.f.s.test.controller.TestController : Feign调用system的/hello服务
启动的时候查看system模块产生的
2019-08-23 14:22:52.469 INFO [system,72bb0469bee07104,43597a6edded6f2e,false] 812 --- [nio-8201-exec-2] c.m.f.s.s.controller.TestController : /hello服务被调用
能够看到,日志里出现了[Test,72bb0469bee07104,72bb0469bee07104,false]信息,这些信息由Spring Cloud Sleuth生成,用于跟踪微服务请求链路。这些信息包含了4个部分的值,它们的含义以下:
下面咱们来整合Zipkin
在整合Zipkin以前,咱们须要先搭建RabbitMQ。RabbitMQ用于收集Sleuth提供的追踪信息,而后Zipkin Server从RabbitMQ里获取,这样能够提高性能。
在安装RabbitMQ以前,须要先安装Erlang/OTP,下载地址为:http://www.erlang.org/downloads/,下载exe文件安装便可。
安装完毕后,下载RabbitMQ,下载地址为 :
http://www.rabbitmq.com/insta...,下载exe文件安装便可。
安装完RabbitMQ以后,咱们到RabbitMQ安装目录的sbin下执行以下命令
rabbitmq-plugins enable rabbitmq_management
而后在浏览器中输入http://localhost:15672,默认用户名和密码都是guest,登陆后可看到:
点击Admin Tab页面,新增一个用户:
用户名为febs,密码为123456,角色为管理员。新添加的用户仍是No access状态,须要进一步对该用户进行受权后,方能够远程经过该用户名访问。点击该新增用户名。进入受权页面,点击Set permission按钮,进行用户受权操做。
安装好RabbitMQ后,咱们开始整合Zipkin。在较低版本的Spring Cloud中,咱们能够本身搭建Zipkin Server,如今咱们只能使用官方搭建好的Zipkin Server,地址为:https://github.com/openzipkin...
在cmd窗口下运行下面这条命令(windows下没有curl环境的话,能够在git bash中运行这条命令),下载zipkin.jar:
curl -sSL https://zipkin.io/quickstart.sh | bash -s
若是下载速度极慢,能够复制连接到迅雷下载中下载,下载后重命名为zipkin.jar便可。
zipkin支持将追踪信息保存到MySQL数据库,因此在运行zipkin.jar以前,咱们先准备好相关库表,SQL脚本地址为:
https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql。
库表准备好后,运行下面这条命令启动zipkin.jar:
java -jar zipkin.jar --server.port=8402 --zipkin.storage.type=mysql --zipkin.storage.mysql.db=febs_cloud_base --zipkin.storage.mysql.username=root --zipkin.storage.mysql.password=123456 --zipkin.storage.mysql.host=localhost --zipkin.storage.mysql.port=3306 --zipkin.collector.rabbitmq.addresses=localhost:5672 --zipkin.collector.rabbitmq.username=febs --zipkin.collector.rabbitmq.password=123456
上面命令指定了数据库连接和RabbitMQ连接信息。更多可选配置能够解压zipkin.jar,查看zipkinBOOT-INFclasses路径下的zipkin-server-shared.yml配置类源码。
启动好zipkin.jar后,在对应模块的pom里引入以下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> </dependency>
修改对应模块的application.yml
spring: zipkin: sender: type: rabbit sleuth: sampler: probability: 1 rabbitmq: host: localhost port: 5672 username: febs password: 123456
spring.zipkin.sender.type指定了使用RabbitMQ收集追踪信息;
spring.sleuth.sampler.probability默认值为0.1,即采样率才1/10,发送10笔请求只有一笔会被采集。为了测试方便,咱们能够将它设置为1,即100%采样;
spring.rabbitmq用于配置RabbitMQ链接信息,你可能会问,为何刚刚RabbitMQ端口是15672,这里却配置为5672,是否是写错了呢?其实不是,15672是RabbitMQ的管理页面端口,5672是AMPQ端口。
添加好配置后,启动system和test模块,发送一笔localhost:8202/test/hello?name=夏天请求后,使用浏览器访问http://localhost:8402/zipkin/连接,而后点击图中所示
查看依赖关系:
查看数据表,看是否存储了信息:
最后,最近不少小伙伴找我要Linux学习路线图,因而我根据本身的经验,利用业余时间熬夜肝了一个月,整理了一份电子书。不管你是面试仍是自我提高,相信都会对你有帮助!
免费送给你们,只求你们金指给我点个赞!
也但愿有小伙伴能加入我,把这份电子书作得更完美!
推荐阅读: