spring cloud 学习(8) - sleuth & zipkin 调用链跟踪
业务复杂的微服务架构中,往往服务之间的调用关系比较难梳理,一次http请求中,可能涉及到多个服务的调用(eg: service A -> service B -> service C...),如果想分析各服务间的调用关系,以及各服务的响应耗时,找出有性能瓶颈的服务,这时zipkin就派上用场,它是Twitter公司开源的一个tracing系统,官网地址为: http://zipkin.io/ , spring cloud可以跟它无疑集成。
使用步骤:
一、微服务方
1.1 添加依赖jar包
compile 'org.springframework.cloud:spring-cloud-starter-bus-kafka'
compile 'org.springframework.cloud:spring-cloud-starter-sleuth'
compile 'org.springframework.cloud:spring-cloud-sleuth-stream'
注:为了实现tracing数据埋点与采集的解耦,spring cloud引入了message bus(消息总线)的概念,微服务无需关心tracing系统在哪,长什么样,只要向bus总线上扔消息就行,所以引入了bus-kafka以及sleuth-stream。
1.2 application.yml配置
spring:
...
cloud:
bus:
enabled: true
stream:
default-binder: kafka
kafka:
binder:
brokers: 10.0.1.2,10.0.1.3,10.0.1.4 //kafaka的服务器集群列表
zkNodes: 10.0.1.5,10.0.1.6,10.0.1.7 //zk的服务器集群列表
defaultZkPort: 2181 //zk的端口
defaultBrokerPort: 9092 //kafka的broker端口
...
sleuth:
sampler:
percentage: 0.2 //采样率 0.2为20%
上面2项配置好就行了,代码不用任何修改,真正的代码零侵入
二、zipkin-server
zipkin从kafka上接收过来数据后,有4种保存方式:in-memory(保存在内存中)、mysql、cassandra、elasticsearch
个人开发调试的话,推荐用in-memory模式,其它环境不要使用!(注:因为随着收集的数据越来越多,都放在内存中 很容易造成OOM)
2.1 mysql 存储
2.1.1 主要jar包依赖
dependencies {
... 关键是下面几个
compile 'org.springframework.cloud:spring-cloud-starter-sleuth'
compile 'org.springframework.cloud:spring-cloud-sleuth-zipkin-stream'
compile 'org.springframework.cloud:spring-cloud-starter-bus-kafka'
compile 'io.zipkin.java:zipkin-server'
compile 'io.zipkin.java:zipkin-autoconfigure-ui'
compile 'io.zipkin.java:zipkin-autoconfigure-storage-mysql' #mysql的存储
... 下面几个是spring-boot/cloud的常规项
compile 'org.springframework.boot:spring-boot-starter-actuator'
compile 'org.springframework.boot:spring-boot-starter-web'
compile 'org.springframework.boot:spring-boot-starter-security'
compile 'log4j:log4j:1.2.17' //zipkin的storage jar包,依赖低版本的log4j
compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2'
compile 'mysql:mysql-connector-java:6.0.5'
}
2.1.2 application.yml配置
spring:
application:
name: zipkin-server
datasource: //指定mysql数据源
schema: classpath:/mysql.sql
url: jdbc:mysql://192.168.1.2:3306/zipkin?autoReconnect=true&useSSL=false
username: root
password: ***
driver-class-name: com.mysql.cj.jdbc.Driver
initialize: true
continue-on-error: true
sleuth:
enabled: false
cloud:
bus:
enabled: true
...
stream:
default-binder: kafka
kafka:
binder:
brokers: ${kafka.brokers}
zkNodes: ${kafka.zkNodes}
defaultZkPort: ${kafka.zkPort}
defaultBrokerPort: ${kafka.brokerPort}
zipkin:
storage:
type: mysql //配置成mysql存储
2.1.3 main入口代码
@SpringBootApplication(exclude = {
MybatisAutoConfiguration.class,
RedisAutoConfiguration.class,
RedisRepositoriesAutoConfiguration.class})
@EnableZipkinStreamServer
public class ZipkinServer {
public static void main(String[] args) {
SpringApplication.run(ZipkinServer.class, args);
}
}
注:如果你的项目中依赖了redis,mybatis等其它包,可以参考上面的写法,排除掉这些自动配置,否则的话,不用加那一堆exclude。
2.2 cassandra
2.2.1 依赖jar包
注:cassandra和elasticsearch下,可能会遇到zipkin中的dependencies面板无数据,详情见github上的讨论:https://github.com/openzipkin/zipkin-dependencies/issues/22
compile 'org.springframework.boot:spring-boot-starter-data-cassandra'
compile('io.zipkin.java:zipkin-autoconfigure-storage-cassandra3:1.29.3') {
exclude group: "com.datastax.cassandra", module: "cassandra-driver-core"
}
compile 'com.datastax.cassandra:cassandra-driver-core:3.1.1'
compile 'com.datastax.cassandra:cassandra-driver-mapping:3.1.1'
2.2.2 application.yml
spring:
data:
cassandra:
contact-points: localhost
port: 9042
keyspace-name: zipkin3
...
zipkin:
storage:
type: cassandra3
2.3 elasticsearch
2.3.1 依赖jar包
compile 'io.zipkin.dependencies:zipkin-dependencies-elasticsearch:1.7.2'
compile 'io.zipkin.java:zipkin-autoconfigure-storage-elasticsearch-http:1.29.2'
2.3.2 application.yml
zipkin:
storage:
type: elasticsearch
elasticsearch:
cluster: elasticsearch
hosts: http://localhost:9200
index: zipkin
index-shards: 5
index-replicas: 1
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- KEIL 生成 Binaxf 文件
- Istio可观测性
- 大点干!早点散----------使用Haproxy搭建web群集
- 嵌入式系统FreeRTOS — 互斥信号量
- 面试题系列第6篇:JVM字符串常量池及String的intern方法详解?
- 机器学习(一)——K-近邻(KNN)算法
- 机器学习(二)——K-均值聚类(K-means)算法
- windows下matplotlib的安装
- Python中常见的数据类型总结
- stm32中阻塞模式和非阻塞模式 in blocking mode 与 in non-blocking mode区别
- 机器学习(四)—决策树
- 机器学习(五)—朴素贝叶斯
- C语言面试题——位域及大小端模式的理解
- stm32添加串口调试
- STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印。(HAL库例程)