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.