Рубрики
Без рубрики

Весенние облачные сервисы трассировки с помощью Zipkin

Узнайте, как можно агрегировать трассировки из распределенных служб с помощью Zipkin.

Автор оригинала: Tim Schimandle.

1. Обзор

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

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

2. Сервис Zipkin

Наш сервис Zipkin будет служить хранилищем для всех наших пролетов. Каждый пролет отправляется в эту службу и собирается в трассировки для дальнейшей идентификации.

2.1. Настройка

Создайте новый проект Spring Boot и добавьте эти зависимости в pom.xml:


    io.zipkin.java
    zipkin-server


    io.zipkin.java
    zipkin-autoconfigure-ui
    runtime

Для справки: вы можете найти последнюю версию на 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:di[email protected]:8082/eureka/

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

В этот каталог давайте добавим файл с именем 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. Конфигурация службы

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

3.1. Настройка

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


    org.springframework.cloud
    spring-cloud-starter-zipkin

Для справки: вы можете найти последнюю версию на 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);
            }
        }
    };
}

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

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

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. Запуск

Если вы еще этого не сделали, запустите службы config , discovery , gateway , book , rating и zipkin .

Перейдите к http://localhost:8080/book-service/books.

Откройте новую вкладку и перейдите на http://localhost:9411. Выберите сервис бронирования и нажмите кнопку “Найти следы”. Вы должны увидеть, как в результатах поиска появится трассировка. Нажмите на этот след, чтобы открыть его:

На странице трассировки мы видим запрос в разбивке по службам. Первые два пролета создаются gateway , а последний – book-service. Это показывает нам, сколько времени запрос потратил на обработку в книжном сервисе, 18.379 мс, и на шлюзе, 87.961 мс.

4. Заключение

Мы видели, как легко интегрировать Zipkin в наше облачное приложение.

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

Как всегда, вы можете найти исходный код на Github .