在上一节《spring-cloud-sleuth+zipkin追踪服务实现(一)》中,咱们使用microservice-zipkin-server、microservice-zipkin-client、microservice-zipkin-client-backend 三个程序实现了使用http方式进行通讯,数据持久化到内存中的服务调用链路追踪实现。
在这里咱们作两点改动,首先是数据从保存在内存中改成持久化到数据库,其次是将http通讯改成mq异步方式通讯。java
咱们仍是使用以前上一节中的三个程序作修改,方便你们看到对比不一样点。这里每一个项目名都加了一个stream,用来表示区别。mysql
要将http方式改成经过MQ通讯,咱们要将依赖的原来依赖的io.zipkin.java:zipkin-server换成spring-cloud-sleuth-zipkin-stream和spring-cloud-starter-stream-rabbit
同时要使用mysql持久化,咱们须要添加mysql相关依赖。
所有maven依赖以下:git
``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--zipkin依赖--> <!--此依赖会自动引入spring-cloud-sleuth-stream而且引入zipkin的依赖包--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> <dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> <scope>runtime</scope> </dependency> <!--保存到数据库须要以下依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> ```
添加以上maven依赖后,咱们将启动类ZipkinServer中@EnableZipkinServer注解替换成@EnableZipkinStreamServer,
具体以下:github
package com.yangyang.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.sleuth.zipkin.stream.EnableZipkinStreamServer; /** * Created by chenshunyang on 2017/5/24. */ @EnableZipkinStreamServer// //使用Stream方式启动ZipkinServer @SpringBootApplication public class ZipkinStreamServerApplication { public static void main(String[] args) { SpringApplication.run(ZipkinStreamServerApplication.class,args); } }
点击@EnableZipkinStreamServer注解的源码咱们能够看到它也引入了@EnableZipkinServer注解,同时还建立了一个rabbit-mq的消息队列监听器。
spring
以方便接收从消息客户端收集发过来的mq消息。sql
因为使用了消息中间件rabbit mq以及mysql,因此咱们还须要在配置文件application.properties加入相关的配置:数据库
server.port=11020 spring.application.name=microservice-zipkin-stream-server #zipkin数据保存到数据库中须要进行以下配置 #表示当前程序不使用sleuth spring.sleuth.enabled=false #表示zipkin数据存储方式是mysql zipkin.storage.type=mysql #数据库脚本建立地址,当有多个是可以使用[x]表示集合第几个元素 spring.datasource.schema[0]=classpath:/zipkin.sql #spring boot数据源配置 spring.datasource.url=jdbc:mysql://localhost:3306/zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.initialize=true spring.datasource.continue-on-error=true #rabbitmq配置 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
其中zipkin.sql直接到官网去拷贝,也能够从本demo中拷贝
为了不http通讯的干扰,咱们将原来的监听端口有11008更改成11020,启动程序,未报错且可以看到rabbit链接日志,说明程序启动成功。app
与上一节中的配置同样,客户端的配置也很是简单,maven依赖只须要将原来的spring-cloud-starter-zipkin替换为以下两个依赖便可异步
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
此外,在配置文件中也加上链接MQ的配置maven
server: port: 11021 spring: application: name: microservice-zipkin-stream-client #rabbitmq配置 rabbitmq: host: 127.0.0.1 port : 5672 username: guest password: guest
固然为了以示区别,端口也作了相应的调整
按照上一节的方式访问:http://localhost:11021/call/1,咱们能够上一节,说明rabbit-mq方式通讯的sleuth功能已经生效了。
咱们屡次访问consumer的地址能够看到日志中,请求的耗时时间不会再次出现忽然耗时特长的状况。
为了体验MQ通讯给咱们带来的数据不丢失的特色,咱们将数据库中的数据清空,而后刷新zipkin server的界面,能够看到再也不有数据
而后咱们将zipkin-server程序想关闭,而后再屡次访问consumer的地址,以后,咱们重启zipkin server程序,启动成功后访问UI界面
很快看到Span Name选项有数据能够选择了,同时数据库中的记录条数也再也不是以前的0条了
如此说明咱们的zipkin重启后,从MQ中成功获取出了在关闭这段时间里provider和consumer产生的信息数据。这样咱们使用spring-cloud-sleuth-stream+zipkin方式的rest服务调用追踪功能就OK了。
https://git.oschina.net/shunyang/spring-cloud-microservice-study.git
https://github.com/shunyang/spring-cloud-microservice-study.git
spring cloud 官方文档:https://github.com/spring-cloud/spring-cloud-sleuth
第三方:https://yq.aliyun.com/articles/78128?utm_campaign=wenzhang&utm_medium=article&utm_source=QQ-qun&201758&utm_content=m_19862