1. Обзор
В этой статье мы собираемся добавить Zipkin
в наш весенний облачный проект . Zipkin
— это проект с открытым исходным кодом, предоставляющий механизмы для отправки, получения, хранения и визуализации трассировок. Это позволяет нам сопоставлять активность между серверами и получать более четкое представление о том, что именно происходит в наших службах.
Эта статья не является вводной статьей по распределенной трассировке или весеннему облаку. Если вам нужна дополнительная информация о распределенной трассировке, прочитайте наше введение в spring sleuth .
2. Зипкин Сервис
Наш сервис Zipkin
будет служить хранилищем для всех наших пролетов. Каждый диапазон отправляется в эту службу и собирается в трассировки для будущей идентификации.
2.1. Настраивать
Создайте новый проект Spring Boot и добавьте следующие зависимости в pom.xml:
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<scope>runtime</scope>
</dependency>
Для справки: последнюю версию можно найти на Maven Central
( zipkin-server , zipkin-autoconfigure-ui ). Версии зависимостей наследуются от spring-boot-starter-parent .
2.2. Включение сервера Zipkin
Чтобы включить сервер Zipkin
, мы должны добавить некоторые аннотации к основному классу приложения:
@SpringBootApplication
@EnableZipkinServer
public class ZipkinApplication {...}
Новая аннотация @EnableZipkinServer
настроит этот сервер для прослушивания входящих диапазонов и будет действовать как наш пользовательский интерфейс для запросов.
2.3. Конфигурация
Во-первых, давайте создадим файл с именем bootstrap.properties
в src/main/resources
. Помните, что этот файл необходим для получения нашей конфигурации с нашего сервера конфигурации.
Добавим к нему эти свойства:
spring.cloud.config.name=zipkin
spring.cloud.config.discovery.service-id=config
spring.cloud.config.discovery.enabled=true
spring.cloud.config.username=configUser
spring.cloud.config.password=configPassword
eureka.client.serviceUrl.defaultZone=
http://discUser:discPassword@localhost:8082/eureka/
Теперь давайте добавим файл конфигурации в наш репозиторий конфигурации, расположенный по адресу c:\Users\{username}\
в Windows или /home/{username}/
в *nix.
В этот каталог давайте добавим файл с именем zipkin.properties
и добавим следующее содержимое:
spring.application.name=zipkin
server.port=9411
eureka.client.region=default
eureka.client.registryFetchIntervalSeconds=5
logging.level.org.springframework.web=debug
Не забудьте зафиксировать изменения в этом каталоге, чтобы служба конфигурации обнаружила изменения и загрузила файл.
2.4. Бежать
Теперь давайте запустим наше приложение и перейдем по адресу http://localhost:9411. Нас должна приветствовать домашняя страница Zipkin
:
Большой! Теперь мы готовы добавить некоторые зависимости и настройки к нашим сервисам, которые мы хотим отслеживать.
3. Конфигурация службы
Настройка серверов ресурсов почти такая же. В следующих разделах мы подробно расскажем, как настроить книжный сервис.
Мы продолжим это, объяснив изменения, необходимые для применения этих обновлений к rating-service
и gateway-service .
3.1. Настраивать
Чтобы начать отправку диапазонов на наш сервер Zipkin
, мы добавим эту зависимость в наш файл pom.xml
:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
Для справки: последнюю версию можно найти на Maven Central
( spring-cloud-starter-zipkin ).
3.2. Весенняя конфигурация
Нам нужно добавить некоторую конфигурацию, чтобы book-service использовал Eureka
для поиска нашего Zipkin-
сервиса. Откройте BookServiceApplication.java
и добавьте в файл этот код:
@Autowired
private EurekaClient eurekaClient;
@Autowired
private SpanMetricReporter spanMetricReporter;
@Autowired
private ZipkinProperties zipkinProperties;
@Value("${spring.sleuth.web.skipPattern}")
private String skipPattern;
// ... the main method goes here
@Bean
public ZipkinSpanReporter makeZipkinSpanReporter() {
return new ZipkinSpanReporter() {
private HttpZipkinSpanReporter delegate;
private String baseUrl;
@Override
public void report(Span span) {
InstanceInfo instance = eurekaClient
.getNextServerFromEureka("zipkin", false);
if (!(baseUrl != null &&
instance.getHomePageUrl().equals(baseUrl))) {
baseUrl = instance.getHomePageUrl();
delegate = new HttpZipkinSpanReporter(new RestTemplate(),
baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter);
if (!span.name.matches(skipPattern)) delegate.report(span);
}
}
};
}
Приведенная выше конфигурация регистрирует пользовательский ZipkinSpanReporter
, который получает свой URL-адрес от eureka. Этот код также отслеживает существующий URL-адрес и обновляет HttpZipkinSpanReporter
только при изменении URL-адреса. Таким образом, независимо от того, где мы развернем наш сервер Zipkin, мы всегда сможем найти его без перезапуска службы.
Мы также импортируем свойства Zipkin по умолчанию, которые загружаются при весенней загрузке, и используем их для управления нашим настраиваемым репортером.
3.3. Конфигурация
Теперь давайте добавим некоторую конфигурацию в наш файл book-service.properties
в репозитории конфигурации:
spring.sleuth.sampler.percentage=1.0
spring.sleuth.web.skipPattern=(^cleanup.*)
Zipkin
работает путем выборки действий на сервере. Установив для spring.sleuth.sampler.percentage
значение 1,0, мы устанавливаем частоту дискретизации на 100%. Шаблон пропуска — это просто регулярное выражение, используемое для исключения диапазонов, чьи имена совпадают.
Шаблон пропуска блокирует отчеты обо всех диапазонах, начинающихся со слова «очистка». Это сделано для того, чтобы остановить промежутки, исходящие из базы кода весеннего сеанса.
3.4. Служба рейтинга
Выполните те же шаги , что и в разделе Book-Service
выше, применив изменения к эквивалентным файлам для rating-service.
3.5. Служба шлюза
Выполните те же действия book-service . Но при добавлении конфигурации в .properties
шлюза вместо этого добавьте следующее:
spring.sleuth.sampler.percentage=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
Это настроит службу шлюза так, чтобы она не отправляла промежутки о фавиконе или весеннем сеансе.
3.6. Бежать
Если вы еще этого не сделали, запустите службы конфигурации , обнаружения , шлюза , книги , рейтинга и zipkin .
Перейдите по адресу http://localhost:8080/book-service/books.
Откройте новую вкладку и перейдите по адресу http://localhost:9411. Выберите книжный сервис и нажмите кнопку «Найти следы». Вы должны увидеть трассировку в результатах поиска. Нажмите на этот след открытия:
На странице трассировки мы видим запрос с разбивкой по службам. Первые два спана создаются шлюзом
, а последний — книгосервисом.
Это показывает нам, сколько времени запрос потратил на обработку в книге-сервисе,
18,379 мс, и на шлюзе,
87,961 мс.
4. Вывод
Мы увидели, как легко интегрировать Zipkin
в наше облачное приложение.
Это дает нам столь необходимое понимание того, как общение проходит через наше приложение. По мере усложнения нашего приложения Zipkin может предоставить нам столь необходимую информацию о том, где запросы тратят свое время. Это может помочь нам определить, где что-то замедляется, и указать, какие области нашего приложения нуждаются в улучшении.
Как всегда, вы можете найти исходный код на Github .