Spring Cloud - Serviços de rastreamento com Zipkin

Spring Cloud - Serviços de rastreamento com Zipkin

*1. Visão geral *

Neste artigo, adicionaremos Zipkin ao nosso link:/spring-cloud-securing-services [projeto de nuvem da primavera]. Zipkin é um projeto de código aberto que fornece mecanismos para enviar, receber, armazenar e visualizar rastreamentos. Isso nos permite correlacionar a atividade entre os servidores e obter uma imagem muito mais clara do que está acontecendo em nossos serviços.

Este artigo não é um artigo introdutório para rastreamento distribuído ou nuvem de primavera. Se você quiser obter mais informações sobre rastreamento distribuído, leia nossa introdução ao link:/spring-cloud-sleuth-single-application [spring sleuth].

===* 2. Serviço Zipkin *

Nosso serviço Zipkin servirá como loja para todos os nossos períodos. Cada extensão é enviada para este serviço e coletada em rastreios para identificação futura.

====* 2.1 Configuração *

Crie um novo projeto Spring Boot e adicione essas dependências ao _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>

Para referência: você pode encontrar a versão mais recente em Maven Central (https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22io.zipkin.java%22%20AND%20a%3A% 22zipkin-server% 22 [zipkin-server], https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22io.zipkin.java%22%20AND%20a%3A%22zipkin- autoconfigure-ui% 22 [zipkin-autoconfigure-ui]). As versões das dependências são herdadas de spring-boot-starter-parent.

====* 2.2 Ativando o Servidor Zipkin *

Para habilitar o servidor Zipkin, precisamos adicionar algumas anotações à classe principal do aplicativo:

@SpringBootApplication
@EnableZipkinServer
public class ZipkinApplication {...}

A nova anotação _ @ EnableZipkinServer_ configurará esse servidor para escutar os intervalos de entrada e atuar como nossa interface do usuário para consultas.

====* 2.3 Configuração *

Primeiro, vamos criar um arquivo chamado bootstrap.properties em src/main/resources. Lembre-se de que este arquivo é necessário para buscar nossa configuração do servidor de configuração.

Vamos adicionar essas propriedades a ele:

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/

Agora vamos adicionar um arquivo de configuração ao nosso repositório de configuração, localizado em c: \ Users \\ {nome do usuário} \ _ no Windows ou _/home/\ {nome do usuário}/ no* nix.

Neste diretório, vamos adicionar um arquivo chamado zipkin.properties e adicionar este conteúdo:

spring.application.name=zipkin
server.port=9411
eureka.client.region=default
eureka.client.registryFetchIntervalSeconds=5
logging.level.org.springframework.web=debug

Lembre-se de confirmar as alterações neste diretório para que o serviço de configuração detecte as alterações e carregue o arquivo.

* 2.4. Run *

Agora vamos executar nosso aplicativo e navegar para http://localhost: 9411. Deveríamos ser recebidos com a página inicial do _Zipkin’s:

link:/wp-content/uploads/2017/03/zipkinhomepage-1-1.png [imagem:/wp-content/uploads/2017/03/zipkinhomepage-1-1-300x92.png [imagem, largura = 796, altura = 244]]

Ótimo! Agora estamos prontos para adicionar algumas dependências e configurações aos nossos serviços que queremos rastrear.

===* 3. Configuração de Serviço *

A configuração dos servidores de recursos é praticamente a mesma. Nas seções a seguir, detalharemos como configurar o book-service. Seguiremos explicando as modificações necessárias para aplicar essas atualizações ao rating-service e gateway-service* *. * *

====* 3.1 Configuração *

Para começar a enviar extensões ao nosso servidor Zipkin, adicionaremos essa dependência ao nosso arquivo pom.xml:

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

Para referência: você pode encontrar a versão mais recente em Maven Central (https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework.cloud%22%20AND%20a%3A% 22spring-cloud-starter-zipkin% 22 [primavera-nuvem-starter-zipkin]).

====* 3.2 Configuração da Primavera *

Precisamos adicionar algumas configurações para que o* book-service *use Eureka para encontrar nosso serviço Zipkin. Abra BookServiceApplication.java e adicione este código ao arquivo:

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

A configuração acima registra um ZipkinSpanReporter personalizado que obtém seu URL do eureka. Esse código também controla o URL existente e atualiza apenas o HttpZipkinSpanReporter se o URL for alterado. Dessa forma, não importa onde implantamos nosso servidor Zipkin, sempre poderemos localizá-lo sem reiniciar o serviço.

Também importamos as propriedades padrão do Zipkin que são carregadas pela inicialização por mola e as usamos para gerenciar nosso repórter personalizado.

====* 3.3 Configuração*

Agora vamos adicionar algumas configurações ao nosso arquivo book-service.properties no repositório de configuração:

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

Zipkin funciona amostrando ações em um servidor. Ao definir o spring.sleuth.sampler.percentage como 1.0, estamos definindo a taxa de amostragem para 100%. O padrão de ignorar é simplesmente uma regex usada para excluir extensões cujo nome corresponde.

O padrão de ignorar impedirá que todos os períodos sejam relatados, iniciados com a palavra 'limpeza'. Isso é para parar os intervalos originados na base de código da sessão da primavera.

3.4 Serviço de classificação

Siga as mesmas etapas na seção book-service acima, aplicando as alterações nos arquivos equivalentes para rating-service.

3.5 Serviço de gateway

Siga os mesmos passos serviço de livros . Mas ao adicionar a configuração ao gateway . Properties, adicione-os:

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

Isso configurará o serviço de gateway para não enviar extensões sobre o favicon ou a sessão de primavera.

* 3.6 Run *

Se você ainda não o fez, inicie os serviços* config , *discovery , gateway , book , rating e zipkin .

Navegue para http://localhost: 8080/book-service/books.

Abra uma nova guia e navegue para http://localhost: 9411. Selecione serviço de livro e pressione o botão ‘Encontrar traços '. Você deve ver um rastreamento nos resultados da pesquisa. Clique no traço de abri-lo:

link:/wp-content/uploads/2017/03/zipkintrace-1-1.png [imagem:/wp-content/uploads/2017/03/zipkintrace-1-1-300x32.png [imagem, largura = 797, altura = 85]]

Na página de rastreamento, podemos ver a solicitação dividida por serviço. Os dois primeiros intervalos são criados pelo gateway e o último pelo book-service. Isso mostra quanto tempo a solicitação passou processando no _book-service, _ 18.379 ms, e no _gateway, _ 87.961 ms .

4. Conclusão

Vimos como é fácil integrar o Zipkin em nosso aplicativo em nuvem.

Isso nos fornece algumas informações muito necessárias sobre como a comunicação viaja através de nosso aplicativo. À medida que nosso aplicativo cresce em complexidade, a Zipkin pode nos fornecer informações muito necessárias sobre onde as solicitações estão gastando seu tempo. Isso pode nos ajudar a determinar onde as coisas estão desacelerando e indicar quais áreas de nosso aplicativo precisam ser aprimoradas.

Como sempre, você encontra o código-fonte over no Github.