Spring Cloud Combat Series (7) — отслеживание служебных ссылок Spring Cloud Sleuth

Spring Cloud

Связанный

  1. Spring Cloud Combat Series (1) — регистрация и обнаружение сервисов Eureka

  2. Spring Cloud Combat Series (2) — клиентский вызов + лента

  3. Spring Cloud Combat Series (3) — Декларативное притворство клиента

  4. Боевая серия Spring Cloud (4) - Fuse Hystrix

  5. Spring Cloud Combat Series (5) — Service Gateway Zuul

  6. Spring Cloud Combat Series (6) — Распределенный центр конфигурации Spring Cloud Config

  7. Spring Cloud Combat Series (7) — отслеживание служебных ссылок Spring Cloud Sleuth

  8. Боевая серия Spring Cloud (восемь) — мониторинг сервиса Micro Spring Boot Admin

  9. Spring Cloud Combat Series (9) — Аутентификация и авторизация службы Spring Cloud OAuth 2.0

  10. Практическая серия Spring Cloud (10) — Единый вход JWT и Spring Security OAuth

предисловие

Spring Cloud SleuthОсновная функция состоит в том, чтобыРаспределенные системыпоставкаРешения для отслеживания, и совместим сZipkin, просто нужноpom.xmlВключите соответствующийполагатьсяВот и все. В этой статье в основном говорится окомпонент отслеживания услуг Zipkin,Spring Cloud SleuthИнтегрированныйZipkinкомпоненты. В основном используется длясобиратьс каждогоГетерогенная системаизДанные мониторинга в реальном времениИспользуется для отслеживанияМикросервисная архитектуравнизпроблема с задержкой системы.

текст

1. Связанные термины

1.1. Span

Spanявляется основнымрабочая единица, используется для описания один разRPCперечислить,Spanчерез64немногоspanIdв видеУникально идентифицирует.ZipkinсерединаSpanЕсть и другие данные, такие какРезюме,Отметка времени событий,Ключевые ценности Примечания (tags) а такжерасписание ID(как правилоIPадрес).Spanв постоянном запуске и остановке во время записиинформация о времени,ОдинSpanОднажды созданный, он должен остановиться в какой-то момент в будущем.

1.2. Trace

наборSpanсостоит из одногоДерево. Например, если вы работаете с большимРаспределенные системы, возможно, потребуется создатьTrace.

1.3. Annotation

выражатьОсновной список выноски,ОдинAnnotationможно понимать какSpanв жизненном циклеважный моментизСнимок данныхТакойAnnotationкак правило, содержитмомент возникновения(timestamp),тип события(value),Конечная точка(endpoint) и другую информацию. вAnnotationизтип событияСодержит следующие четыре категории:

  • cs - Client Sent

клиентИнициирование запроса, этоAnnotionописывает этоSpanНачинать.

  • sr - Server Received

Серверполучить запрос иГотов начатьсправиться с этим, еслиsrминусcsизотметка времениможет получитьсетевая задержка.

  • ss - Server Sent

Серверзавершить обработку запроса, еслиssминусsrизотметка времени, вы можете получитьСерверВремя, потраченное на обработку запроса.

  • cr - Client Received

клиентуспешно полученСерверответ, еслиcrминусcsизотметка времени, вы можете получитьвесь запроспотребляетсяобщее время.

2. Структура проекта

Этот случай в основном состоит изчетыре модулясочинение:

  • eureka-server: в видеРеестр услуг.

  • zipkin-server: в видеСервисный центр отслеживания ссылок, отвечает за хранениесвязать данные.

  • service-hi: выставитьТестовый интерфейс, в то же время, какотслеживание ссылокизСервер,ответственныйгенерировать данные ссылки.

  • service-zuul: в видешлюз маршрутизации,ответственныйзапрос на переадресацию, в то же время, какотслеживание ссылокизклиент,производитьсвязать данные, и загрузить вzipkin-server.

существует8761 портвключиeureka-server Реестр услуг, вы можете обратиться к предыдущей статье, здесь творение демонстрироваться не будет.

3. Соберите zipkin-сервер

создать новыйSpring Bootприкладной модульzipkin-server,этоpom.xmlПолные зависимости следующие:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>io.github.ostenant.springcloud</groupId>
    <artifactId>zipkin-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>zipkin-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

В классе входа приложения добавьте аннотацию@EnableZipkinServerОткрытымZipkin Serverфункция.

@EnableZipkinServer
@EnableEurekaClient
@SpringBootApplication
public class ZipkinServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZipkinServerApplication.class, args);
    }
}

существуетконфигурационный файл application.ymlУказанный номер порта службы9411, и кEurekaрегистрационный центррегистрация службы.

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 9411
spring:
  application:
    name: zipkin-server

4. Создайте сервис-привет

создать новыйSpring Bootприкладной модульservice-hi, в егоpom.xmlвведен в引入起步依赖 spring-cloud-starter-zipkin, полные зависимости следующие:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>io.github.ostenant.springcloud</groupId>
    <artifactId>service-hi</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-client</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

В своемконфигурационный файл application.ymlчерез элементы конфигурацииspring.zipkin.base-urlуточнитьzipkin serverадрес г.

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8763
spring:
  application:
    name: service-hi
  zipkin:
  # base-url: http://localhost:9411/
  # 若在同一个注册中心的话可以启用自动发现,省略base-url
    locator:
      discovery:
        enabled: true #自动发现
  sleuth:
    sampler:
      percentage: 1.0

ужеZipKin клиентбыл интегрирован, и, наконец,Класс запуска приложенияразоблачитьAPIинтерфейслегко проверить.

@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceHiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceHiApplication.class, args);
    }

    @Value("${server.port}")
    private String port;

    @RequestMapping("/hi")
    public String home(@RequestParam String name) {
        return "Hi " + name + ", I am from port: " + port;
    }
}

5. Построить сервис-зуул

создать новыйSpring Bootприкладной модульservice-zuul,существуетpom.xmlимпортировать зависимостиspring-cloud-starter-zipkin, полные зависимости следующие:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>io.github.ostenant.springcloud</groupId>
    <artifactId>service-zuul</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>service-zuul</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

в егоконфигурационный файл application.ymlчерез элементы конфигурацииspring.zipkin.base-urlуточнитьzipkin serverадрес г. Также укажитеservice-hiна основеzuulизпуть обслуживанияпрефикс совпадения.

server:
  port: 8769
spring:
  application:
    name: service-zuul
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  sleuth:
    sampler:
      percentage: 1.0
  zipkin:
    # base-url: http://localhost:9411/
    # 若在同一个注册中心的话可以启用自动发现,省略base-url
    locator:
      discovery:
        enabled: true #自动发现
zuul:
  routes:
    api-hi:
      path: /api-hi/**
      serviceId: service-hi

Здесь вы можете найти, импортироватьZipKinСервис нужен тольконаправляющая зависимость,свойства конфигурацииВсего два шага. в приложениистартовый классиспользовать на@EnableZuulProxyАннотация включенашлюз маршрутизации.

@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ServiceZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceZuulApplication.class, args);
    }
}

6. Процесс отслеживания тестов

всемодуль отслеживания ссылокПосле завершения строительства подведем итоги:

  1. построить одинzipkin serverв видеСсылка на сервисный центр.

  2. Дайте каждомуСлужитьвводитьzipkinзависеть, настраиватьzipkin serverадрес.

Начать по порядку нижеeureka-server,service-zipkin,service-hiиservice-zuul. Получите доступ к сервисному шлюзу по адресу:http://localhost:8769/api-hi/hi?name=vainlgory, содержание ответа службы выглядит следующим образом:

Hi Vainlgory, I am from port: 8763

тогда посетитеhttp://localhost:9411, т.е. доступZipKinПредоставленная страница визуализации.

Этот интерфейс используется для отображенияZipKin Serverсобралсвязать данные, в соответствии снаименование услуги,Время начала,Время окончания,время, потраченное на запроси другие условия, чтобы найти. нажмитеFind Tracksкнопка для просмотра запрошенногоВремя звонка,потреблять времяИ попросилСостояние связи.

Нажмите на верхнююDependenciesкнопка для просмотра сервисазависимости.

7. Добавьте пользовательские данные в данные ссылки

Теперь нам нужно реализовать функцию: всвязать данныеплюс просилОператор. Этот случай вservice-zuul Служба шлюзареализовано в.

  1. создать новыйZuulFilter фильтр, который имеет типpostтип,orderза900, наФункция перехвата.

  2. в фильтреЛогические методы перехвата run()внутри, черезTracerизaddTag()метод плюснастроитьданные, в данном случае ссылкаОператор.

  3. также доступно здесьфильтрполучено втекущая ссылкаизtraceldИнформация,traceldв видесвязать данныеизУникально идентифицирует, который можно хранить вlogВ журнале удобно для последующих поисков, в этом случаеtraceldИнформация просто выводится на консоль. код показывает, как показано ниже:

@Component
public class LoggerFileter extends ZuulFilter {
    @Autowired
    private Tracer tracer;

    @Override
    public String filterType() {
        return FilterConstants.POST_TYPE;
    }

    @Override
    public int filterOrder() {
        return 900;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        tracer.addTag("operator","forezp");
        System.out.println(tracer.getCurrentSpan().traceIdString());
        return null;
    }
}

8. Используйте RabbitMQ для передачи данных ссылки

Преобразуйте сначалаzipkin-serverмодуль проекта, в егоpom.xmlдокумент будетzipkin-serverЗависимости удаляются, добавляютсяspring-cloud-sleuth-zipkin-streamиspring-cloud-starter-stream-rabbitЗависимости настроены следующим образом:

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

существуетzipkin-serverфайл конфигурацииapplication.ymlплюсRabbitMQконфигурация, в том числеИмя процессора,порт,имя пользователя,пароль, код показан ниже:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

В стартовом классе приложенияZipkinServerApplicationверхняя нота@EnableZipkinServerзаменить на аннотацию@EnableZipkinStreamServer, наZipkinStreamServer, код показан ниже:

@EnableEurekaClient
@SpringBootApplication
@EnableZipkinStreamServer
public class ZipkinServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZipkinServerApplication.class, args);
    }
}

Теперь к реформеZipkin Client(включаютservice-zuulиservice-hiдва модуля) соответственно в ихpom.xmlдокумент будетspring-cloud-starter-zipkinЗависимость изменена наspring-cloud-sleuth-zipkin-streamиspring-cloud-starter-stream-rabbit, код показан ниже:

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

Спередиzipkin-serverмодули, а в конфигурационном файлеapplicayion.ymlплюсRabbitMQКонфигурация. Таким образом, ссылказагрузка данныхотHTTPиспользовать вместо этогокомпонент генерации сообщений RabbitMQПуть.

9. Храните данные о ссылках в базе данных MySQL.

В приведенном выше примереZipkin Serverхранить данные вОЗУ, после применения услугиперезагружать,предыдущийВсе данные ссылки потеряны, то необходимо ввестимеханизм сохранения.Zipkinподдержка будетсвязать данныесохранить вMySQL,ElasticsearchиCassandraв базе данных. В этом разделе объясняется, как использоватьMySQLместо хранения.

Zipkin ClientЕсть два способасвязать данныетрансфер вZipkin Serverодин должен использоватьHTTP, другой должен использоватьRabbitMQ.Zipkin Serverэтими двумя способамиСобирать данные о ссылках, и хранится вMySQLсередина.

9.1. Использование HTTP для передачи данных о ссылке

существуетzipkin-serverмодульныйpom.xmlфайл плюс следующие зависимости:

  • Zipkin Serverзависимостьzipkin-server

  • ZipkinизMySQLзависимости хранилищаzipkin-storage-mysql

  • Zipkin ServerизUIзависимость интерфейсаzipkin-autoconfigure-ui

  • MySQLРазъем зависит отmysql-connector-java

  • JDBCизЗависит от запуска spring-boot-starter-jdbc

код показывает, как показано ниже:

<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-server</artifactId>
    <version>1.19.0</version>
</dependency>
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-storage-mysql</artifactId>
    <version>1.19.0</version>
</dependency>
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

существуетzipkin-serverмодульныйконфигурационный файл application.ymlплюсисточник данныхконфигурация, в том числебаза данныхизUrl,имя пользователя,парольидрайвер подключения, и необходимо настроитьzipkin.storage.typeзаmysql, код показан ниже:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring-cloud-zipkin?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: 123456
zipkin:
  storage:
    type: mysql

Кроме того, необходимоMySQLПоместите базу данных в базе данныхсценарий инициализации, который создаетzipkin_spans,zipkin_annotationsиzipkin_dependenciesэти таблицы.

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,
  `error_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

Наконец, вам нужно запустить приложение в классе запускаZipkinServerApplicationВведенныйMySQLStorageизBean, код показан ниже:

@Bean
public MySQLStorage mySQLStorage(DataSource datasource) {
    return MySQLStorage.builder()
        .datasource(datasource)
        .executor(Runnable::run)
        .build();
}

Просто нужны вышеуказанные шаги, вы можете использоватьHTTPПередача инфекциисвязать данныесохранить вMySQLв базе данных.

9.2 Использование RabbitMQ для передачи данных ссылки

Истории этого раздела используютсяRabbitMQ передача данныхНа основе преобразования требуется только преобразованиеzipkin-serverинженерия.

существуетzipkin-serverИнжинирингpom.xmlдобавлено в файлMySQLизРазъем зависимости mysql-connector-javaиJDBCизЗависит от запуска spring-boot-starter-jdbc, код показан ниже:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

существуетzipkin-serverмодульныйконфигурационный файл application.ymlплюсисточник данныхконфигурация, включая базу данныхUri,имя пользователя,парольидрайвер подключения, такая же конфигурацияzipkin.storage.typeзаmysql, код показан ниже:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/spring-cloud-zipkin?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
zipkin:
  storage:
    type: mysql

Кроме того, необходимоMySQLИнициализировать в базе данныхсценарий базы данных, как и в предыдущем разделе.

10. Храните данные ссылок в ElasticSearch

существуетПараллелизм высокийслучае, использоватьMySQLместо хранениясвязать данныеОчевидно, необоснованно, тогда вы можете использоватьElasticSearchкак хранилище.

Загрузить и установитьElasticSearchиKibana, адрес загрузкиwoohoo.elastic.co/products/horrible…. Запустите после завершения установки, гдеElasticSearchизНомер порта по умолчаниюза9200,Kibanaизномер порта по умолчаниюза5601.

Этот раздел находится вРаздел 8на основе трансформации. первый вpom.xmlдобавлено в файлzipkinзависимости иzipkin-autoconfigure-storage-elasticsearch-httpЗависимость, код выглядит следующим образом:

<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin</artifactId>
    <version>1.28.1</version>
</dependency>
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
    <version>1.28.1</version>
</dependency>

в файле конфигурации приложенияapplication.ymlплюсZipkinконфигурация, настроенныйzipkinизтип хранения(type) заElasticsearch,в использованиикомпоненты хранения(StorageComponent)заElasticsearch, а затем нужно настроитьElasticsearch,включаютhosts(можно настроитьнесколько реальныхНапример, с“,”разделены). Конкретный код конфигурации выглядит следующим образом:

zipkin:
  storage:
    type: elasticsearch
    StorageComponent: elasticsearch
    elasticsearch:
      cluster: elasticsearch
      max-requests: 30
      index: zipkin
      index-shards: 3
      index-replicas: 1
      hosts: localhost:9200

Просто заполните эти конфигурации,Zipkin Serverизсвязать данныеможно хранить вElasticSearchв.

11. Отображение данных ссылки с помощью Kibana

В предыдущем разделе было описано, каксвязать данныесохранить вElasticSearchсередина,ElasticSearchможет иKibanaв сочетании, будетсвязать данныеотображается вKibanaначальство. Запустить после завершения установкиKibana,KibanaПо умолчанию это будетместный портза9200изElasticSearchПрочитать данные.Kibanaизпорт по умолчаниюза5601,доступKibanaдомашняя страницаhttp://localhost:5601.

нажмитеManagementкнопку, а затем щелкнитеAdd New,добавить однуindex. предыдущий разделElasticSearchнаписать всвязать данныеизindexнастроенzipkin,существуетKibanaЗаполните интерфейсzipkin-*, нажмитеCreateкнопка, созданнаяindex, нажмитеDiscover, который появляется на страницесвязать данные.

Ссылаться на

  • Фан Чжипэн «Глубокое понимание Spring Cloud и построения микросервисов»

Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack

零壹技术栈

Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.