微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂。
Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可。
ZipKin是twitter的开源项目,其架构图如下
ZipKin中的关键东西就是Collector、Storage、API、UI,Collection就是收集调用新,Storage存储这些调用信息,默认是放在内存中的,如果怕重启丢失可以放到数据库中,API是暴露给外部访问采集统计信息的,UI是为了方便展示数据采样相信的模块。
几个字段说明:
traceId
全局的跟踪Id,是跟踪的入口点,根据需求来决定在哪里生成traceId,比如我们常见的一个Http请求,入口是web应用,结束点就是请求的返回点。
spanId
下一层的请求跟踪Id,一个traceId可以包含一个以上的spanId。
建个laich-zipkin 微服务工程测试(略)
<!--zipkin-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>${zipkin.version}</version>
<!--排除log4j2 避免和logback冲突警告-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 使用mysql存储-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-storage-mysql</artifactId>
<version>${zipkin-storage-mysql.version}</version>
</dependency>
<!-- zipkin2.x 需要此包连接操作mysql -->
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>${jooq.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
然后建个启动类
@SpringBootApplication
@EnableZipkinServer
public class ZipkinServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZipkinServerApplication.class, args);
}
}
配置也很简单:
server:
port: 9000
spring:
application:
name: laich-zipkin
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/spring-s?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
#zipkin:
# storage:
# type: mysql
sleuth:
enabled: true
# 关闭自动配置启用所有请求得检测
management:
metrics:
web:
server:
auto-time-requests: false
eureka:
instance:
client:
serviceUrl:
defaultZone: http://laich-eureka:8761/eureka/
注意 serverTimezone=Asia/Shanghai和auto-time-requests: false
需要设置。zipkin推荐用这个连接Mysql不用com.mysql.cj.jdbc.Driver
直接用以前的连接也是可以的,这里略。
从ALL service Name中发现没有服务。这时客户端服务也需要引入zipkin
客户端使用
maven包依赖 ,假设建一个laich-user的微服务。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
配置:
spring:
zipkin:
enabled: true
base-url: http://localhost:9000/ #指定了Zipkin服务器的地址
sleuth:
web:
client:
enabled: true
sampler:
# 默认的采样比率为0.1,不能看到所有请求数据
# 更改采样比率为1,就能看到所有的请求数据了,但是这样会增加接口调用延迟
probability: 1
OK将用户服务引入zipkin,再次启动时我们看到了laich-user服务,生产中 probability: 1 不一定是1 。如果不是1的话请求不一定会被采集到。这里测试用。
zipkin 测试
我们先请求http://localhost:8081/user/getUser?id=8 几次,这样zipkin才会有数据出来。如下图:
点击findTraces 查找就有数据出来了。从提示中可以查http.path=/user/getUser 但不支持通配符。
选择一行的数据点击进去看下,采集了什么内容?如下图:
从图中可以看到采集的数据,IP来源,耗时 URL信息等,当出现请求报错时如3行。显示红色,非常好的监控。可以看下这个红色错误信息:
可以看到错误信息是:没有传值为报空指针Exception。
还有链路ID,耗时信息,请求IP地址等,
接下来我们将订单服务也加入zipkin,如下图我们可以看到服务之间的依赖关系等信息。
本文暂时没有评论,来添加一个吧(●'◡'●)