微服务的出现使得业务得到解放,将各个业务分散到服务中,同时也出现了其他问题比如某个服务出现慢接口成为系统的瓶颈,spring-cloud-sleuth能解决这个问题,顺便甩锅,废话不多说下面上教程。
spring-cloud-sleuth 的存储方式可以使用mysql,elasticsearch。收集方式可以使用kafka,rabbitmq和rest接口,这里需要了解 springcloud Dalston(以下成为D版本)和Edgware(以下成为E版本)是一个分水岭,D以及以下版本只支持rest方式,E以及以上版本只支持mq(rabbitmq和kafka)的方式。sleuth2.0以上版本官方建议直接下载jar包使用 以下是下载地址 https://www.oschina.net/news/97221/spring-cloud-sleuth-2-released 。本篇介绍rest和rabbitmq(虽然比较建议kafka)的方式,采用elasticsearch存储(尝试了mysql 查询太慢了)
服务端:
直接下载jar包 以下附带启动方式
nohup java -jar zipkin.jar --zipkin.storage.StorageComponent=elasticsearch --zipkin.storage.type=elasticsearch --zipkin.storage.elasticsearch.username='es的账号' --zipkin.storage.elasticsearch.password='es的密码' --zipkin.storage.elasticsearch.hosts='es的服务器地址' --zipkin.storage.elasticsearch.cluster=elasticsearch --zipkin.storage.elasticsearch.index=zipkin --zipkin.storage.elasticsearch.timeout=3000 --zipkin.storage.elasticsearch.index-shards=5 --zipkin.storage.elasticsearch.index-replicas=1 --zipkin.collector.rabbitmq.addresses='rabbitmq的地址' --zipkin.collector.rabbitmq.port='rabbitmq的端口 默认是5672' --zipkin.collector.rabbitmq.username='rabbitmq的用户名' --zipkin.collector.rabbitmq.password='rabbitmq的密码' --zipkin.collector.rabbitmq.virtual-host=vhost1 &
启动后访问 http://{ip}::9411 出现页面就成功了,这里有个点纠结了很久就是 es 需要允许自动创建索引 action.auto_create_index:true 不然数据无法存入,连错误也不错打印。
客户端:
客户端分为D版和E版,以下一一介绍
D版:
引入 pom包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
在application.properties里面添加
#zipkin采样率,默认为0.1,改为1后全采样,但是会降低接口调用效率
spring.sleuth.sampler.percentage=1.0
#zipkin服务器地址
spring.zipkin.base-url=http://{ip}:9411
之后启动服务就能接收到
E版:
E版就比较复杂了,因为项目里面可能已经用到rabbitmq,sleuth作为行为数据理论上不应该影响业务的mq,这里需要重写sleuth的mq配置
在
# 2.0版本采集率 (注意 1.0和2.0的这个参数是不同的)
spring.sleuth.sampler.probability=1.0
# 队列的名字 这个用默认的就行
spring.zipkin.rabbitmq.queue=zipkin
# sleuth rabbitmq 配置
spring.sleuth.rabbitmq.addresses='rabbitmq的地址'
spring.sleuth.rabbitmq.port=5672
spring.sleuth.rabbitmq.username='rabbitmq的用户名'
spring.sleuth.rabbitmq.password='rabbitmq的密码'
spring.sleuth.rabbitmq.virtual-host=vhost1
新建一个java类
ZipkinRabbitSenderConfiguration.java (名字自定义没关系)
@Component
public class ZipkinRabbitSenderConfiguration {
@Value("${spring.zipkin.rabbitmq.queue:zipkin}")
private String queue;
@Value("${spring.sleuth.rabbitmq.addresses}")
private String addresses;
@Value("${spring.sleuth.rabbitmq.port}")
private int port;
@Value("${spring.sleuth.rabbitmq.username}")
private String username;
@Value("${spring.sleuth.rabbitmq.password}")
private String password;
@Value("${spring.sleuth.rabbitmq.virtual-host}")
private String virtualHost;
@Bean
public Sender rabbitSender() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(addresses);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualHost);
return RabbitMQSender.newBuilder()
.connectionFactory(connectionFactory.getRabbitConnectionFactory())
.queue(this.queue).addresses(addresses).build();
}
}
至于为什么这么写可以看一下sleuth.client的源码
这样就可以完成了