Spring Cloud - Услуги за проследяване с Zipkin

1. Общ преглед

В тази статия ще добавим Zipkin към нашия пролетен облачен проект. Zipkin е проект с отворен код, който предоставя механизми за изпращане, получаване, съхранение и визуализиране на следи. Това ни позволява да съпоставим активността между сървърите и да получим много по-ясна представа за точно какво се случва в нашите услуги.

Тази статия не е уводна статия за разпределено проследяване или пролетен облак. Ако искате повече информация за разпределеното проследяване, прочетете нашето въведение към пролетта.

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 Server

За да активираме сървъра 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= //discUser:[email protected]:8082/eureka/

Сега нека добавим конфигурационен файл към нашето конфигурационно репо, намиращо се на c: \ Users \ {потребителско име} \ на Windows или / home / {потребителско име} / на * 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. Бягай

Сега нека стартираме нашето приложение и отидем до // localhost: 9411. Трябва да бъдем посрещнати със началната страница на Zipkin :

Страхотен! Сега сме готови да добавим някои зависимости и конфигурация към нашите услуги, които искаме да проследим.

3. Конфигурация на услугата

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

3.1. Настройвам

За да започнете да изпращате педи да ни Zipkin сървъра, ще добавим тази зависимост в нашия pom.xml файл:

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

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

3.2. Spring Config

We need to add some configuration so that book-service will use Eureka to find our Zipkin service. Open BookServiceApplication.java and add this code to the file:

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

The above configuration registers a custom ZipkinSpanReporter that gets its URL from eureka. This code also keeps track of the existing URL and only updates the HttpZipkinSpanReporter if the URL changes. This way no matter where we deploy our Zipkin server to we will always be able to locate it without restarting the service.

We also import the default Zipkin properties that are loaded by spring boot and use them to manage our custom reporter.

3.3. Configuration

Now let's add some configuration to our book-service.properties file in the config repository:

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

Zipkin works by sampling actions on a server. By setting the spring.sleuth.sampler.percentage to 1.0, we are setting the sampling rate to 100%. The skip pattern is simply a regex used for excluding spans whose name matches.

The skip pattern will block all spans from being reported that start with the word ‘cleanup'. This is to stop spans originating from the spring session code base.

3.4. Rating Service

Follow the same steps from the book-service section above, applying the changes to the equivalent files for rating-service.

3.5. Gateway Service

Follow the same steps book-service. But when adding the configuration to the gateway.properties add these instead:

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

This will configure the gateway service not to send spans about the favicon or spring session.

3.6. Run

If you haven't done so already, start the config, discovery, gateway, book, rating, and zipkin services.

Navigate to //localhost:8080/book-service/books.

Open a new tab and navigate to //localhost:9411. Select book-service and press the ‘Find Traces' button. You should see a trace appear in the search results. Click that trace of opening it:

On the trace page, we can see the request broken down by service. The first two spans are created by the gateway, and the last is created by the book-service. This shows us how much time the request spent processing on the book-service, 18.379 ms, and on the gateway, 87.961 ms.

4. Conclusion

We have seen how easy it is to integrate Zipkin into our cloud application.

This gives us some much-needed insight into how communication travels through our application. As our application grows in complexity, Zipkin can provide us with much-needed information on where requests are spending their time. This can help us determine where things are slowing down and indicate what areas of our application need improvement.

Както винаги можете да намерите изходния код на Github.