微服务架构➖SpringCloud➖Sleuth➖Zipkin的集成

微服务架构➖SpringCloud➖Sleuth➖Zipkin的集成

关于作者

  • 作者介绍

🍓 博客主页:作者主页

🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉 🏆、阿里云专家博主51CTO专家博主

🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻


Spring Cloud Alibaba Sleuth--Zipkin的集成

Zipkin的集成

ZipKin介绍

Zipkin是Twitter的一个开源项目,它基于Google Dapper实现,旨在解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。

我们可以利用Zipkin来收集各个服务器上的请求链路跟踪数据,并通过其提供的REST API接口辅助我们查询跟踪数据,实现对分布式系统的监控。这样可以及时发现系统中的延迟增加问题,并找出系统性能瓶颈的根源。

除了面向开发人员的API接口,Zipkin还提供了便捷的UI组件,帮助我们直观地搜索跟踪信息并分析请求链路的详细信息。例如,可以查询某段时间内各个用户请求的处理时间等。

Zipkin提供了可插拔的数据存储方式,包括In-Memory、MySQL、Cassandra和Elasticsearch。

  • 上图展示了Zipkin的基础架构,它主要由四个核心组件构成:

    • Collector(收集器):负责处理来自外部系统的跟踪信息,并将其转换为Zipkin内部处理的Span格式,以支持后续的存储、分析和展示等功能。
    • Storage(存储):用于存储Collector接收到的跟踪信息。默认情况下,信息存储在内存中,但我们也可以根据需要修改存储策略,将跟踪信息存储到数据库中或其他存储组件中。
    • RESTful API(接口):提供外部访问接口,用于展示跟踪信息给客户端或外部系统,以实现监控等功能。
    • Web UI(用户界面):基于API组件开发的上层应用,用户可以通过UI组件方便且直观地查询和分析跟踪信息。

    Zipkin分为两端:Zipkin服务端和Zipkin客户端(即微服务应用)。客户端会配置服务端的URL地址。一旦发生服务间的调用,微服务中配置的Sleuth监听器会监听并生成相应的Trace和Span信息,然后将其发送给服务端。

ZipKin服务端安装

第1步: 下载ZipKin的jar包

search.maven.org/remote_cont...

访问上面的网址,即可得到一个jar包,这就是ZipKin服务端的jar包

第2步: 通过命令行,输入下面的命令启动ZipKin Server

shell 复制代码
java -jar zipkin-server-2.12.9-exec.jar

第3步:通过浏览器访问 http://localhost:9411访问

Zipkin客户端集成

ZipKin客户端和Sleuth的集成非常简单,只需要在微服务中添加其依赖和配置即可。

第1步:在每个微服务上添加依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

第2步:添加配置

yaml 复制代码
spring:
    zipkin:
        base-url: http://127.0.0.1:9411/ #zipkin server的请求地址
        discoveryClientEnabled: false #让nacos把它当成一个URL,而不要当做服务名
    sleuth:
        sampler:
        	probability: 1.0 #采样的百分比

第3步: 访问微服务

http://localhost:7000/order-serv/order/prod/1

第4步: 访问zipkin的UI界面,观察效果

ZipKin数据持久化

Zipkin Server默认会将追踪数据信息保存到内存,但这种方式不适合生产环境。Zipkin支持将追踪 数据持久化到mysql数据库或elasticsearch中。

使用mysql实现数据持久化

第1步: 创建mysql数据环境

sql 复制代码
CREATE TABLE IF NOT EXISTS zipkin_spans (
 
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
 
`trace_id` BIGINT NOT NULL,
 
`id` BIGINT NOT NULL,
 
`name` VARCHAR(255) NOT NULL,
 
`parent_id` BIGINT,
 
`debug` BIT(1),
 
`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
 
`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query'
 
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
 
 
 
ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate';
 
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations';
 
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
 
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
 
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
 
 
 
CREATE TABLE IF NOT EXISTS zipkin_annotations (
 
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
 
`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
 
`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
 
`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
 
`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
 
`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
 
`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
 
`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
 
`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
 
`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
 
`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
 
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
 
 
 
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
 
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
 
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
 
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
 
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces';
 
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';
 
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
 
 
 
CREATE TABLE IF NOT EXISTS zipkin_dependencies (
 
`day` DATE NOT NULL,
 
`parent` VARCHAR(255) NOT NULL,
 
`child` VARCHAR(255) NOT NULL,
 
`call_count` BIGINT
 
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
 
 
 
ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

第2步: 在启动ZipKin Server的时候,指定数据保存的mysql的信息

shell 复制代码
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --
MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=123456

使用elasticsearch实现数据持久化

第1步: 下载elasticsearch

Elasticsearch 7.3.2 | Elastic

第2步: 启动elasticsearch
第3步: 在启动ZipKin Server的时候,指定数据保存的elasticsearch的信息

shell 复制代码
ava -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=elasticsearch --ES-HOST=localhost:9200
相关推荐
drebander2 分钟前
使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
java·python·list
乌啼霜满天2496 分钟前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
tangliang_cn11 分钟前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟12 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
Grey_fantasy21 分钟前
高级编程之结构化代码
java·spring boot·spring cloud
新知图书23 分钟前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
弗锐土豆28 分钟前
工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程
java·opencv·安全·检测·面部
Elaine20239129 分钟前
零碎04 MybatisPlus自定义模版生成代码
java·spring·mybatis
盛夏绽放44 分钟前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
小小大侠客1 小时前
IText创建加盖公章的pdf文件并生成压缩文件
java·pdf·itext