程序员开发实例大全宝库

网站首页 > 编程文章 正文

链追踪Zipkin(链路追踪sleuth)

zazugpt 2024-08-13 13:14:52 编程文章 26 ℃ 0 评论

微服务架构上通过业务来划分服务的,通过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,如下图我们可以看到服务之间的依赖关系等信息。


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表