springCloud link tracking technology

SpringCloud link tracking technology

An introduction to link tracking

In the micro-service construction of large-scale systems, a system is split into many modules. These modules are responsible for different functions, combined into

The system can finally provide rich functions. In this architecture, a request often involves multiple services. Internet application construction

On different sets of software modules, these software modules may be developed by different teams and may be implemented in different programming languages.

Now, it is possible to deploy thousands of servers across multiple different data centers, which means that there will be some problems with this type of architecture.

question:

  • How to find the problem quickly?

  • How to judge the scope of the fault?

  • How to sort out service dependence and the rationality of dependence?

  • How to analyze link performance issues and real-time capacity planning

Distributed Tracing (Distributed Tracing) is to restore a distributed request to a call link and log

Recording, performance monitoring and centralized display of the invocation of a distributed request. For example, the time consumption on each service node, where the request arrives

The status of requests on each machine, each service node, and so on.

Common link tracking technologies are as follows:

cat : A real-time application monitoring platform developed by Dianping open source and based on Java, including real-time application monitoring and business monitoring. integrated

The solution is to implement monitoring by burying points in the code, such as interceptors, filters, etc. Very intrusive to the code, integrated

higher cost. The risk is greater.

zipkin: an open source, open source distributed tracking system by Twitter, used to collect service timing data to solve micro

Delay issues in the service architecture include: data collection, storage, search, and presentation. This product combines spring-cloud-sleuth

It is relatively simple to use and easy to integrate, but its functions are relatively simple.

pinpoint : Pinpoint is a Korean open source call chain analysis based on bytecode injection, as well as an application monitoring and analysis tool. Features

It supports a variety of plug-ins, the UI is powerful, and there is no code intrusion on the access terminal.

skywalking: SkyWalking is a local open source call chain analysis based on bytecode injection, and an application monitoring analysis tool. The feature is that it supports many

This kind of plug-in has strong UI function and no code intrusion on the access terminal. Has joined the Apache incubator.

**Sleuth: ** Link tracking solution in distributed system provided by SpringCloud

Note: SpringCloud alibaba technology stack does not provide its own link tracking technology, we can use Sleuth +

Zinkin will do the link tracking solution

achieve

1 All microservices must import sleuth dependencies

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

Then the microservice will print the called log file when it receives the request, but it is inconvenient to view through the log file and needs to be used with zipkin

2 Integrate zipkin

The jar package of zipkin can be downloaded in maven:

Go to maven to download zipkin

Start after downloading (default port 9411):

java -jar zipkin.jar

Then all microservices need to import the configuration and modify the configuration file

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

Modify the configuration file to add the following configuration

spring:
  zipkin:
    base-url: http://127.0.0.1:9411/ #zipkin server的请求地址
    discoveryClientEnabled: false #让nacos把它当成一个URL,而不要当做服务名

  sleuth:
    sampler:
      probability: 1.0 #采样的百分比 0-1之间 将百分之多少的数据推送给zipkin

3zipkin persistence

1 Create zipkin database

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';

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 Add configuration when starting zipkin

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=elasticsearch --ES- HOST=localhost:9200

Note: This tutorial refers to the SpringCloud tutorial of the dark horse

Guess you like

Origin blog.csdn.net/dndndnnffj/article/details/108801728