«1. Обзор

В этой статье мы собираемся добавить Zipkin в наш весенний облачный проект. Zipkin — это проект с открытым исходным кодом, предоставляющий механизмы для отправки, получения, хранения и визуализации трассировок. Это позволяет нам сопоставлять активность между серверами и получать более четкое представление о том, что именно происходит в наших службах.

Эта статья не является вводной по распределенной трассировке или весеннему облаку. Если вам нужна дополнительная информация о распределенной трассировке, прочитайте наше введение в spring sleuth.

2. Сервис Zipkin

Наш сервис 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 {...}

2.3. Конфигурация

Во-первых, давайте создадим файл с именем bootstrap.properties в src/main/resources. Помните, что этот файл необходим для получения нашей конфигурации с нашего сервера конфигурации.

Давайте добавим к нему следующие свойства:

Теперь давайте добавим файл конфигурации в наш репозиторий конфигурации, расположенный в c:\\Users\\{username}\\ в Windows или /home/{username}/ в * никс.

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:[email protected]:8082/eureka/

В этот каталог добавим файл с именем 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. Нас должна приветствовать домашняя страница Зипкина:

Отлично! Теперь мы готовы добавить некоторые зависимости и настройки к нашим сервисам, которые мы хотим отслеживать.

3. Конфигурация службы

Настройка серверов ресурсов почти такая же. В следующих разделах мы подробно расскажем, как настроить книжный сервис. Мы продолжим это, объяснив изменения, необходимые для применения этих обновлений к службе рейтинга и службе шлюза.

3.1. Настройка

Чтобы начать отправку спанов на наш сервер Zipkin, мы добавим эту зависимость в наш файл pom.xml:

Для справки: последнюю версию можно найти на Maven Central (spring-cloud-starter- зипкин).

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

3.2. Spring Config

Нам нужно добавить некоторую конфигурацию, чтобы book-service использовал Eureka для поиска нашего Zipkin-сервиса. Откройте BookServiceApplication.java и добавьте в файл следующий код:

Приведенная выше конфигурация регистрирует пользовательский ZipkinSpanReporter, который получает свой URL-адрес от eureka. Этот код также отслеживает существующий URL-адрес и обновляет HttpZipkinSpanReporter только при изменении URL-адреса. Таким образом, независимо от того, где мы развернем наш сервер Zipkin, мы всегда сможем найти его без перезапуска службы.

@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);
            }
        }
    };
}

Мы также импортируем свойства Zipkin по умолчанию, которые загружаются при весенней загрузке, и используем их для управления нашим настраиваемым репортером.

3.3. Конфигурация

Теперь давайте добавим некоторую конфигурацию в наш файл book-service.properties в репозитории конфигурации:

Zipkin работает путем выборки действий на сервере. Установив для spring.sleuth.sampler.percentage значение 1,0, мы устанавливаем частоту дискретизации на 100%. Шаблон пропуска — это просто регулярное выражение, используемое для исключения диапазонов, чьи имена совпадают.

spring.sleuth.sampler.percentage=1.0
spring.sleuth.web.skipPattern=(^cleanup.*)

Шаблон пропуска блокирует сообщения обо всех диапазонах, начинающихся со слова «очистка». Это сделано для того, чтобы остановить промежутки, исходящие из базы кода весеннего сеанса.

3.4. Служба оценки

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

3.5. Служба шлюза

«Проделайте те же действия с книгой-сервисом. Но при добавлении конфигурации в gateway.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.

«