Springmvc 使用Zipkin 和 Brave 实现http服务调用链路日志跟踪

Zipkin 是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper 的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据,用来追踪微服务架构下的系统延时问题。

Brave 是用来装备 Java 程序的类库,提供了面向 Standard Servlet、Spring MVC、Http Client、JAX RS、Jersey、Resteasy 和 MySQL 等接口的装备能力,可以通过编写简单的配置和代码,让基于这些框架构建的应用可以向 Zipkin 报告数据。同时 Brave 也提供了非常简单且标准化的接口,在以上封装无法满足要求的时候可以方便扩展与定制(下篇会讲)。

有关zipkin与Brave的详细介绍:http://www.tuicool.com/articles/f2qAZnZ

客户端发起请求到接收到服务端回应,先后经过四个阶段:客户端/消费者发起请求(cs)、服务端/生产者接收到请求(sr)、服务端/生产者发送应答(ss)和客户端/消费者接收到应答(cr)。Brave为Spring提供的Servlet拦截器(ServletHandlerInterceptor)及Rest(BraveClientHttpRequestInterceptor)模板的拦截器,向zipkin报告监控数据,其中,BraveClientHttpRequestInterceptor负责cs与cr的处理,ServletHandlerInterceptor负责sr与ss的处理。

git项目地址:https://github.com/blacklau/brave-webmvc-example   (forked from openzipkin/brave-webmvc-example ,请忽略README.md说明)、

  • 在项目的pom.xml中增加zipkin依赖的jar包:


	io.zipkin.brave
	brave
	5.0.0



	io.zipkin.brave
	brave-spring-beans
	5.0.0



	io.zipkin.brave
	brave-context-log4j12
	5.0.0



	io.zipkin.brave
	brave-context-slf4j
	5.0.0



	io.zipkin.brave
	brave-instrumentation-spring-web
	5.0.0



  io.zipkin.brave
  brave-instrumentation-httpclient
  5.0.0



	io.zipkin.brave
	brave-instrumentation-spring-webmvc
	5.0.0



	io.zipkin.reporter2
	zipkin-sender-okhttp3
	2.7.6



	io.zipkin.reporter2
	zipkin-sender-amqp-client
	2.7.6
  • 增加zipkin brave配置


	
	
	
	




	



	
	
		
			
			
			
		
	
	
		
			
				
			
			
				
					user-name
				
			
		
	
	
		
		
		
	



	




	
		
			
		
	





	


  • 修改日志打印配置

log4j.properties修改日志输出格式:

log4j.appender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%X{traceId},%X{spanId}] [%t] %c.%M:%L - %m%n

logback.xml修改日志输出格式:

%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%X{traceId},%X{spanId}] [%thread] [%c.%M:%L] - %message%n
  • 请求方修改调用方式

作为请求方系统,需要使用注入的SpringMVC的restTemplate发送http post请求:

@Autowired
private static RestTemplate restTemplate;

.......
HttpEntity formEntity = new HttpEntity(jsonObj.toString(), headers);
String result = restTemplate.postForObject(url, formEntity, String.class);
.......

或者使用注入的HttpClient发送http post请求:

public static HttpClient httpClient;
	
	@Autowired
	public void setHttpClient(HttpClient httpClient) {
		HttpUtil.httpClient = httpClient;
	}
.......
        httpClient.executeMethod(post);
.......
  • web.xml增加拦截器配置
filter>
	tracingFilter
	brave.spring.webmvc.DelegatingTracingFilter


	tracingFilter
	/*

 

你可能感兴趣的:(java)