1、什么是调用链?
一个业务功能可能需要多个服务协作才能实现,一个请求到达服务A,服务A需要依赖服务B, 服务B又依赖服务C、D等进而形成的一个调用链系统、 即调用链
2、为什么要监控调用链?
调用链错综复杂,需要清晰的链路图反应服务之间的依赖、调用关系
出现问题后 很难定位,需要对整个调用链路有个完整的监控
整体系统性能以及运行情况,需要明确的提现,才能根据实际情况调整资源
zipkin:Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单
追溯数据模型图:

各业务系统在彼此调用时,将特定的跟踪消息传递至zipkin,zipkin在收集到跟踪信息后将其聚合处理、存储、展示等,用户可通过web UI方便获得网络延迟、调用链路、系统依赖等等
zipkin主要涉及四个组件 (collector、storage、search、webUI)
Collector:接收各service传输的数据
storage:列如mysql等,默认存储在内存中
Query:负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给使用Web
webUI: 提供简单的web界面
linux 安装zipkin.
1、wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'
2、其为一个spring boot 工程,直接运行jar nohup java -jar zipkin.jar &
3、访问 http://ip:9411
springBoot项目
1、添加依赖 pom.xml:
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-core</artifactId>
<version>3.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.zipkin.brave/brave-http -->
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-http</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-spancollector-http</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-web-servlet-filter</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-okhttp</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-mysql</artifactId>
<version>3.9.0</version>
</dependency>
2、application.properties配置
com.zipkin.serviceName=declareserv
com.zipkin.url=http://192.168.1.61:9411
com.zipkin.connectTimeout=6000
com.zipkin.readTimeout=6000
com.zipkin.flushInterval=1
com.zipkin.compressionEnabled=true
server.port=8080
3、新建ZipkinProperties类
@Configuration
@ConfigurationProperties(prefix = "com.zipkin")
public class ZipkinProperties {
private String serviceName;
private String url;
private int connectTimeout;
private int readTimeout;
private int flushInterval;
private boolean compressionEnabled;
}
get、set省略
4、新建ZipkinConfig类
@Configuration
public class ZipkinConfig {
@Autowired
private ZipkinProperties properties;
@Bean
public SpanCollector spanCollector() {
HttpSpanCollector.Config config = HttpSpanCollector.Config.builder().connectTimeout(properties.getConnectTimeout()).readTimeout(properties.getReadTimeout())
.compressionEnabled(properties.isCompressionEnabled()).flushInterval(properties.getFlushInterval()).build();
return HttpSpanCollector.create(properties.getUrl(), config, new EmptySpanCollectorMetricsHandler());
}
@Bean
public Brave brave(SpanCollector spanCollector){
Brave.Builder builder = new Brave.Builder(properties.getServiceName()); //指定state
builder.spanCollector(spanCollector);
builder.traceSampler(Sampler.ALWAYS_SAMPLE);
Brave brave = builder.build();
return brave;
}
@Bean
public BraveServletFilter braveServletFilter(Brave brave){
BraveServletFilter filter = new BraveServletFilter(brave.serverRequestInterceptor(),brave.serverResponseInterceptor(),new DefaultSpanNameProvider());
return filter;
}
@Bean
public OkHttpClient okHttpClient(Brave brave){
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new BraveOkHttpRequestResponseInterceptor(brave.clientRequestInterceptor(), brave.clientResponseInterceptor(), new DefaultSpanNameProvider()))
.build();
return client;
}
@Bean
public MySQLStatementInterceptorManagementBean mySQLStatementInterceptorManagementBean(Brave brave) {
return new MySQLStatementInterceptorManagementBean(brave.clientTracer());
}
}
5、访问 http://ip:9411,访问被监控的任意服务,就能在zipkin监控端看到请求的信息了


第一次写 博客、有误的地方请各位大神指出、希望能在监控页面显示具体调用的sql 具体怎么实现还不可知 望大神们指教指教! 小生在此先谢过!
浙公网安备 33010602011771号