简介:微服务的诞生,带来了大量的便利,随之而来的还有大量问题的产生。
将一个庞大的系统切割为若干个小的系统,各个系统之间相互调用,共同协调完成系统功能。然而在复杂的调用链中如果出现了一些问题,比如一条调用链路错误,如何快速定位错误源,一条调用链路响应缓慢,如何快速定位其中延迟高的服务呢?这将是我们需要解决的问题。
Zipkin 是什么? Zipkin 分布式跟踪系统,它可以帮助收集时间数据。并通过用户易于理解的方式展现给用户(说人话就是链路追踪中的服务端,用于收集和展示数据)。
zipkin涉及几个概念(可以不用管)1. Span:基本工作单元,一次链路调用创建一个span,通过一个64位ID标识它, span通过还有其他的数据,例如描述信息,时间戳,key-value对的(Annotation)tag信息,parent-id等,其中parent-id 可以表示span调用链路来源,通俗的理解span就是一次请求信息。
2. Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识。
3. Annotation: 注解,用来记录请求特定事件相关信息(例如时间),通常包含四个注解信息。
4. BinaryAnnotation:提供一些额外信息,一般已key-value对出现。
Spring Cloud Sleuth 是什么?Spring Cloud Sleuth主要功能就是在分布式系统中提供链路追踪解决方案,并且兼容支持了 zipkin(说人话就是链路追踪中的客户端,用于向zipkin提供数据)。
sleuth与Zipkin关系?spring cloud提供了spring-cloud-sleuth-zipkin来方便集成zipkin实现(指的是Zipkin Client,而不是Zipkin服务器),该jar包可以通过spring-cloud-starter-zipkin依赖来引入。
zipkin服务器搭建。官方提供了现成的jar包以供使用,下面是jar包个人网盘地址。无聊自己像搭建也可以去试试,和Eureka,Zuul搭建方式类似。
链接:https://pan.baidu.com/s/1wUbVnNIV3Ii0TEP-eEahIg 提取码:dw2b
使用方法:
执行命令:java -jar zipkin-server-2.21.4-exec.jar 运行此 spring boot 工程。
客户端使用。客户端对象为需要被监控的微服务。
- 导入依赖
org.springframework.cloud spring-cloud-starter-zipkin
-
配置application.yml文件
spring: application: name: service1 zipkin: base-url: http://localhost:9411 #zipkin服务器地址 sleuth: sampler: probability: 1.0 # sleuth采样率,默认为0.1,值越大收集越及时,但性能影响也越大
配置application.properties文件:
#zipkin服务器地址 spring.zipkin.base-url=http://localhost:9411 #sleuth采样率,默认为0.1,值越大收集越及时,但性能影响也越大 spring.sleuth.sampler.probability=1.0
默认的存储方式:默认采用的是内存进行存储,也不能进行持久化,这在生产环境显然是不现实的。
zipkin服务使用mysql存储日志1. 创建数据库,创建表:官方可以找到数据库与表的创建语句。
create database zipkin; 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', PRIMARY KEY (`trace_id_high`, `trace_id`, `id`) ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; 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 and autocomplete values'; ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values'; 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, `error_count` BIGINT, PRIMARY KEY (`day`, `parent`, `child`) ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
2. 加参数启动zipkin。
java -DSTORAGE_TYPE=mysql -DMYSQL_HOST=localhost -DMYSQL_USER=root -DMYSQL_PASS=123 -DMYSQL_DB=zipkin -jar .\zipkin-server-2.21.4-exec.jar
linux后台运行:java -DSTORAGE_TYPE=mysql -DMYSQL_HOST=localhost -DMYSQL_USER=root -DMYSQL_PASS=123 -DMYSQL_DB=zipkin -jar .\zipkin-server-2.21.4-exec.jar &
官方参数解释: `MYSQL_DB`: The database to use. Defaults to "zipkin". `MYSQL_USER` and `MYSQL_PASS`: MySQL authentication, which defaults to empty string. `MYSQL_HOST`: Defaults to localhost `MYSQL_TCP_PORT`: Defaults to 3306 `MYSQL_MAX_CONNECTIONS`: Maximum concurrent connections, defaults to 10 `MYSQL_USE_SSL`: Requires `javax.net.ssl.trustStore` and `javax.net.ssl.trustStorePassword`, defaults to false.
zipkin服务使用ElasticSerach存储日志1. 搭建elasticSearch服务器 2. 加参数启动zipkin java -DSTORAGE_TYPE=elasticsearch -DDES_HOSTS=http://localhost:9200 -jar zipkin-server-2.21.4-exec.jar
zipkin使用效果(名称取得有点随意,不过不要紧)
页面访问的url:http://localhost:9411
调用链列表
调用成功的调用链详情
调用失败的调用链详情
调用失败服务详情