Просторечное «Отслеживание ссылок» действительно ароматно

задняя часть

封面

Изображение на обложке — рабочий стол Zengwen на экране блокировки в 3:30 утра.

предисловие

С 7 прошлой субботы по 11 сегодня я была в больнице.Ребенок госпитализирован с пневмонией.Мне нужно было ухаживать за малышом днем ​​и ночью. Кстати, в больнице нет широкополосного доступа и Wi-Fi, точки доступа, которую я использую на своем мобильном телефоне~

Основное содержание этой статьи

Эта статья в основном представляет собой сочетание теории + практики. Практическая часть включает в себя, как отслеживать ссылкуSleuth + ZipkinДобавлен в мой проект с открытым исходным кодом Spring Cloud "Jia Bi Guo".

Знания в этой статье:

  • Основы отслеживания ссылок
  • Как легко добавить промежуточное программное обеспечение для отслеживания ссылок на проект
  • Как использовать отслеживание ссылок для устранения неполадок.

1. Зачем использовать отслеживание ссылок?

1.1 Причина: разделение сервисной единицы

微服务Архитектура на самом деле分布式Архитектура разделена на несколько сервисных единиц в зависимости от бизнеса.

Из-за сервисной службы数量Их много, возможно, тысячи, и дело будет сложнее, если есть ошибки и исключения, то их трудно локализовать.

1.2 Причина: сложная логика

Например, запрос должен вызывать несколько служб для завершения всего бизнес-замкнутого цикла, а логика кода и бизнес-логика внутренних служб относительно сложны.Если проблема возникает в службе, трудно быстро определить, какая служба имеет ошибку. проблема.

1.3 Результат: быстрое позиционирование

А если мы добавим分布式链路追踪, чтобы отслеживать, какие службы участвуют в запросе, и каков порядок участия, чтобы мы знали подробный процесс каждого запроса и могли быстро найти, даже если есть проблема.

2. Суть отслеживания ссылок

Компонент отслеживания ссылок имеет визуальный компонент отслеживания ссылок Twitter.Zipkin, GoogleDapper, АлиEagleeyeд., а Sleuth является компонентом Spring Cloud. Spring Cloud Sleuth заимствует терминологию у Dapper.

В этой статье в основном объясняется комбинация Sleuth + Zipkin для лучшего отслеживания ссылок.

Почему можно отследить всю ссылку? По сути, это идентификатор трассы, который соединяет серию информации о диапазоне. Информация о всей ссылке может быть получена путем интеграции информации, записанной Span. под

2.1 Размах

  • Народный язык: удаленные вызовы и интервалы一对一.

  • Базовая единица работы Span генерируется каждый раз при вызове удаленной службы.

  • Span — это 64-битный уникальный идентификатор.

  • Рассчитав время начала и окончания интервала, можно подсчитать время, затраченное на каждый вызов службы.

2.2 Трассировка

  • Родной язык: Трассировка, соответствующая множеству Span,一对多.

  • Он состоит из серии пролетов в древовидной структуре.

  • 64-битный уникальный идентификатор.

  • Каждый раз, когда клиент получает доступ к API-интерфейсу системы микросервисов, в середине может вызываться несколько микросервисов, и каждый вызов будет генерировать новый диапазон, а несколько интервалов образуют трассировку.

2.3 Аннотация

Система отслеживания ссылок определяет некоторые основные аннотации для определения начала и окончания запроса. Обратите внимание, что это запрос между микросервисами, а не такими устройствами, как браузеры или мобильные телефоны. Аннотации включают:

  • cs- Client Sent: клиент отправляет запрос с описаниемSpanвремя начала. Примечание. Клиент здесь относится к вызывающей стороне микрослужбы, а не к клиенту, такому как браузер или мобильный телефон, как мы его понимаем.
  • sr- Получено сервером: сервер получает запрос и готов начать его обработку, если онsrминусcsОтметка времени, вы можете получить время передачи по сети.
  • ss- Сервер отправлен: когда сервер отправляет ответ, он записывает время завершения обработки запроса.ssОтметка времени минусsrОтметка времени, вы можете получить время запроса сервера.
  • cr- Client Received: клиент получил ответ, время окончания Span, еслиcrвременная метка минусcsВременная метка, вы можете получить время, затраченное на вызов микросервиса, т.Spanобщее потраченное время.

2.4 Принцип отслеживания ссылок

Предположим, что ссылки трех вызовов микросервиса показаны на следующем рисунке:Service 1передачаService 2,Service 2передачаService 3и услуга 4.

微服务调用链路图

Затем трассировка ссылок добавит Trace ID и Span ID к каждому сервисному вызову. Как показано ниже:

链路追踪原理图

Отличное народное объяснение:

  • Обратите внимание на приведенные выше цвета. Тот же цвет соответствует одному и тому же Span ID, что указывает на то, что это узел в отслеживании ссылок.

  • Шаг 1: Звонок клиентуService 1, генерируетRequest,Trace IDа такжеSpan IDПусто, запрос не поступил в это времяService 1.

  • Шаг 2: Приходит запросService 1, который записывает, что идентификатор трассы = X, а идентификатор диапазона равен A.

  • третий шаг:Service 1отправить запрос наService 2, Span ID равен B, что называется Client Sent, то есть клиент отправляет запрос.

  • Шаг 4: Приходит запросService 2, Span ID равен B, Trace ID не изменится, он называется Server Received, то есть сервер получает запрос и готов начать его обработку.

  • пятый шаг:Service 2Начать обработку этого запроса.После обработки Trace ID остается без изменений, а Span ID = C.

  • Шаг 6:Service 2начать отправлять этот запрос наService 3, Trace ID остается без изменений, Span ID = D, называется Client Sent, то есть клиент отправляет запрос.

  • Шаг 7:Service 3Получение этого запроса, Span ID = D, называется полученным сервером.

  • Шаг 8:Service 3Начать обработку этого запроса, и после обработки Span ID = E.

  • Шаг 9:Service 3Начать отправлять ответы наService 2, Span ID = D, называется Server Sent, то есть сервер отправляет ответ.

  • Шаг 10:Service 3получатьService 2Ответ Span ID = D называется Client Received, то есть клиент получает ответ.

  • Шаг 11:Service 2начать возвращать ответ наService 1, Span ID = B, который совпадает с Span ID на третьем шаге, который называется Client Received, то есть клиент получает ответ.

  • Шаг 12:Service 1После обработки ответа Span ID = A, что совпадает с Span ID на втором шаге.

  • Шаг тринадцатый:Service 1Начать возвращать ответ клиенту, Span ID = A,

  • Service 3Отправьте запрос в Службу 4 иService 3Точно так же соответствующие идентификаторы Span — F и G. Вы можете обратиться к шагам с 6 по 10 выше.

Упростите шаги, отмеченные выше, на следующей схеме трассировки ссылок:

链路追踪父子节点图

  • Первый узел: Span ID = A, Parent ID = null,Service 1Запрос принят.
  • Второй узел: Span ID = B, Parent ID = A,Service 1отправить запрос наService 2вернуть ответ наService 1процесс.
  • Третий узел: промежуток ID = C, родитель ID = B,Service 2промежуточная обработка.
  • Четвертый узел: Span ID = D, Parent ID = C,Service 2отправить запрос наService 3вернуть ответ наService 2процесс.
  • Пятый узел: Span ID = E, Parent ID = D,Service 3промежуточная обработка.
  • Шестой узел: Span ID = F, Parent ID = C,Service 3Отправьте запрос в службу 4 и верните ответ наService 3процесс.
  • Седьмой узел: Span ID = G, Parent ID = F, промежуточная обработка Сервиса 4.

Родительский узел можно найти по Parent ID, и можно отследить всю связь.

3. Spring Cloud Integration Sleu

Вы можете обратиться к моему проекту с открытым исходным кодом GitHub PassJava.

3.1 Знакомство с зависимостями Spring Cloud

Ввести зависимости Spring Cloud в passjava-common

Поскольку компонент отслеживания ссылок Sleuth, который мы используем, является компонентом Spring Cloud, нам необходимо представить зависимости Spring Cloud.

<dependencyManagement>
    <dependencies>
        <!--  Spring Cloud 依赖  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3.2 Знакомство с зависимостями Sleuth

Внедрить компонент отслеживания ссылок Sleuth очень просто: достаточно импортировать зависимость Sleuth в файл pom.xml.

Введите зависимость Sleuth в passjava-common:

<!-- 链路追踪组件 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

3.3 Наблюдение за трассировкой ссылок через журналы

Мы не будем интегрировать компонент визуализации отслеживания ссылок zipkin, а будем просматривать информацию об отслеживании ссылок через логи.

文件路径:\PassJava-Platform\passjava-question\src\main\resources\application.properties
添加配置:
logging.level.org.springframework.cloud.openfeign=debug
logging.level.org.springframework.cloud.sleuth=debug

3.4 Запуск микросервисов

Запустите следующие микросервисы:

  • служба passjava-шлюза (шлюз)

  • сервис passjava-question (тематический микросервис)

  • служба renren (служба управления фоном администратора)

    После успешного запуска отображается следующий рисунок:

启动微服务

3.5 Запрос тестовой трассировки

Откройте фон администратора, посетите центр тем -> страница конфигурации темы, вы увидите, что был отправлен следующий запрос:

http://localhost:8060/api/question/v1/admin/question/list?t=1605170539929&page=1&limit=10&key=

佳必过项目的后台界面

Откройте консоль, и вы увидите, что журнал трассировки распечатан.

链路追踪日志

проиллюстрировать:

  • Если отслеживание ссылок Sleuth не настроено, сообщение INFO представляет собой [passjava-question,], за которым следуют три пустые строки.
  • Когда трассировка ссылок Sleuth настроена, отслеживаемая информация — [passjava-question,504a5360ca906016,e55ff064b3941956,false] , первая — это идентификатор трассировки, а вторая — идентификатор диапазона.

В-четвертых, принцип отслеживания ссылок Zipkin

Выше мы можем получить ссылку на звонок, просто внедрив компонент Sleuth, но посмотреть его можно только через вывод информации в консоль, что не очень удобно.

Zipkin родился из ниоткуда, графический инструмент. Zipkin — это распределенная система отслеживания Twitter с открытым исходным кодом, которая в основном используется для сбора данных временных рядов системы, а затем отслеживания проблем с вызовами в системе.

А после введения компонента Zipkin нет необходимости вводить компонент Sleuth, потому что компонент Zipkin уже внедрен за нас.

Официальный текст Зипкина:zipkin.io

4.1 Инфраструктура Zipkin

Zipkin 基础架构

Zipkin состоит из четырех основных компонентов:

  • Коллекция (компонент-сборщик), который в основном отвечает за сбор информации о трассировке внешней системы.
  • Хранилище (компонент хранилища) в основном отвечает за хранение собранной информации об отслеживании, которая по умолчанию хранится в памяти и поддерживает хранение в MySQL и ElasticSearch.
  • API (компонент запроса), который предоставляет информацию об отслеживании запросов интерфейса для компонентов пользовательского интерфейса.
  • Пользовательский интерфейс (визуальный веб-компонент пользовательского интерфейса) для визуализации информации о трассировке на основе службы, времени и аннотаций. Примечание. Веб-интерфейс не требует аутентификации.

4.2 Процесс отслеживания Zipkin

 Zipkin 跟踪流程

Объяснение процесса:

  • Шаг 1: Пользовательский код инициирует HTTP-запрос Get, путь запроса: /foo.
  • Шаг 2: После того, как запрос достигает инструмента отслеживания, запрос перехватывается, и записываются две части информации: метка и отметка времени. И заголовки HTTP добавят информацию заголовка отслеживания.
  • Шаг 3: Отправьте инкапсулированный запрос HTTP-клиенту.Запрос содержит информацию заголовка запроса X-B3-TraceID и X-B3-SpanId.
  • Шаг 4: Запрос отправляется HTTP-клиентом.
  • Шаг 5: После того, как клиент Http вернет ответ 200 OK, инструмент отслеживания записывает прошедшее время.
  • Шаг 6: Инструмент отслеживания отправляет клиенту 200 OK.
  • Шаг 7: Асинхронно передайте информацию о диапазоне сборщику Zipkin.

5. Интегрируйте компоненты визуализации Zipkin

5.1 Запустите виртуальную машину и подключитесь

vagrant up

启动虚拟机

Используйте инструмент Xshell для подключения к виртуальной машине.

5.2 докер устанавливает службу zipkin

  • Используйте следующие команды, чтобы начать извлечение образа zipkin и запуск контейнера zipkin.
docker run -d -p 9411:9411 openzipkin/zipkin
  • После выполнения команды выполняются операция загрузки и операция запуска.

docker 安装 zipkin 服务

  • Используйте команду docker ps, чтобы убедиться, что контейнер zipkin успешно запущен. Как показано ниже:

zipkin 容器启动成功

  • Откройте пользовательский интерфейс zipkin в окне браузера.

Адрес службы доступа:http://192.168.56.10:9411/zip кин.

5.3 Знакомство с зависимостями Zipkin

Внедрить зависимости zipkin в публичные модули

<!-- 链路追踪组件 Zipkin -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

Поскольку компонент сыщика был введен в пакет zipkin, ранее добавленный компонент сыщика можно удалить.

5.4 Добавить конфигурацию Zipkin

Добавьте конфигурацию zipkin в модуль микросервиса, который необходимо отслеживать.

# zipkin 的服务器地址
spring.zipkin.base-url=http://192.168.56.10:9411/
# 关闭服务发现,否则 Spring Cloud 会把 zipkin 的 URL 当作服务名称。
spring.zipkin.discovery-client-enabled=false
# 设置使用 http 的方式传输数据,也可以用 RabbitMQ 或 Kafka。
spring.zipkin.sender.type=web
# 设置采样率为 100 %,默认为 0.1(10%)
spring.sleuth.sampler.probability=1

5.5 Проверьте, работает ли Zipkin

Здесь я написал API в микросервисе passjava-member:

API сервиса passjava-member: getMemberStudyTimeListTest, путь доступа — /studytime/list/test/{id}.

Служба passjava-member удаленно вызывает API службы passjava-study: getMemberStudyTimeListTest.

Я использую инструмент postman для тестирования API службы участников:

测试 Passjava-member 服务的 API

Откройте инструмент Zipkin, выполните поиск в журнале отслеживания ссылок passjava-member, вы увидите, что есть запись, соответствующее описание выглядит следующим образом:

zipkin 示例

Как видно из рисунка, микросервис passjava-member вызывает микросервис passjava-study, как показано в левой половине рисунка.

А подробное время вызова микросервиса passjava-study записывается очень четко, как показано в правой половине рисунка.

Расчет времени:

  • Время передачи запроса: Запуск сервера - Запуск клиента = 2,577-2,339 с = 0,238 с
  • Время обработки сервера: окончание сервера — запуск сервера = 2,863 с — 2,577 с = 0,286 с
  • Общее время запроса: завершение клиента - запуск клиента = 2,861 с - 2,339 с = 0,522 с
  • Общее время обслуживания Passjava-member: 3,156 с.
  • Общее время службы Passjava-study: 0,521 с.
  • Видно, что служба passjava-member занимает много времени, а производительность низкая.

Вы также можете просмотреть его в виде значка:

图标的方式查看

6. Сохранение данных Zipkin

6.1 Базы данных, поддерживаемые Zipkin

По умолчанию Zipkin хранит данные в памяти, при перезапуске Zipkin данные мониторинга также будут потеряны. Если это производственная среда, потеря данных вызовет большие проблемы, поэтому необходимо сохранять данные мониторинга Zipkin. А Zipkin поддерживает хранение данных в следующих базах данных:

  • память (по умолчанию, не рекомендуется)
  • MySQL (если объем данных большой, запрос относительно медленный, и использовать его не рекомендуется)
  • Эластичный поиск (рекомендуется)
  • Cassandra (в Китае меньше компаний, использующих Cassandra, и не так много связанных документов)

6.2 Использование Elasticsearch в качестве носителя данных

  • Настройте elasticsearch как носитель данных zipkin через докер.
docker run --env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.56.10:9200 openzipkin/zipkin-dependencies
  • Конфигурационные параметры ЭП как носителя информации:

ES 作为存储介质的配置参数

7. Резюме

В этой статье объясняются основные принципы отслеживания ссылок, а также принципы работы компонентов Sleuth + Zipkin, и эти два компонента добавлены в мой проект с открытым исходным кодом «Jia Bi Guo».

Адрес открытого проекта:GitHub.com/Jackson0714…

напиши в конце

За эту неделю я была очень истощена физически и морально, и малыш тоже мучился.После выписки из роддома малыш был не так активен, как раньше в еде.Я боялась увидеть одежду врача, и даже увидеть фотопринтер. Из-за боязни делать ему уколы, лекарства и небулайзеры. Те, кто не женат и у кого есть дети, поторопитесь учиться, давай, парень~

Я Гоку, постарайся стать сильнее и стань Супер Сайяном! Написанный от руки набор расширенных руководств по Spring Cloud и апплет для чистки PMP.

Добро пожаловать в публичный аккаунт:悟空聊架构