Изображение на обложке — рабочий стол 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 состоит из четырех основных компонентов:
- Коллекция (компонент-сборщик), который в основном отвечает за сбор информации о трассировке внешней системы.
- Хранилище (компонент хранилища) в основном отвечает за хранение собранной информации об отслеживании, которая по умолчанию хранится в памяти и поддерживает хранение в MySQL и ElasticSearch.
- API (компонент запроса), который предоставляет информацию об отслеживании запросов интерфейса для компонентов пользовательского интерфейса.
- Пользовательский интерфейс (визуальный веб-компонент пользовательского интерфейса) для визуализации информации о трассировке на основе службы, времени и аннотаций. Примечание. Веб-интерфейс не требует аутентификации.
4.2 Процесс отслеживания 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 ps, чтобы убедиться, что контейнер 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 службы участников:
Откройте инструмент Zipkin, выполните поиск в журнале отслеживания ссылок passjava-member, вы увидите, что есть запись, соответствующее описание выглядит следующим образом:
Как видно из рисунка, микросервис 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
- Конфигурационные параметры ЭП как носителя информации:
7. Резюме
В этой статье объясняются основные принципы отслеживания ссылок, а также принципы работы компонентов Sleuth + Zipkin, и эти два компонента добавлены в мой проект с открытым исходным кодом «Jia Bi Guo».
Адрес открытого проекта:GitHub.com/Jackson0714…
напиши в конце
За эту неделю я была очень истощена физически и морально, и малыш тоже мучился.После выписки из роддома малыш был не так активен, как раньше в еде.Я боялась увидеть одежду врача, и даже увидеть фотопринтер. Из-за боязни делать ему уколы, лекарства и небулайзеры. Те, кто не женат и у кого есть дети, поторопитесь учиться, давай, парень~
Я Гоку, постарайся стать сильнее и стань Супер Сайяном! Написанный от руки набор расширенных руководств по Spring Cloud и апплет для чистки PMP.
Добро пожаловать в публичный аккаунт:
悟空聊架构