文档章节

[学习微服务-第5天] ServiceComb+Zipkin源码解读

字数 1467
阅读 28
收藏 0

SeviceComb + Zipkin 简介

ServiceComb 是Apache的微服务顶级项目,在微服务框架中,微服务之间通过网络进行通信,我们必须处理所有与网络相关的问题,例如延迟,超时和分区。随着部署的微服务越来越多,我们需要系统监控微服务网络延迟和请求流。

上篇文章我们介绍了如何使用ServiceComb与Zipkin进行协同定位微服务应用的异常的微服务和具体异常函数。

 

本篇将介绍ServiceComb如何通过自身handler处理链机制支持Zipkin 微服务级别和函数级别的调用链追踪的。

▼▼▼

ServiceComb 如何支持zipkin

ServiceComb 提供了处理链机制,消费端和服务端的调用链请求都会经过该处理链,通过扩展handler处理链接口,可以实现负载均衡、熔断容错、流量控制等能力。同样,调用链追踪能力也是通过扩展该接口实现的。

 

关于ServiceComb处理链参考 ↓↓↓

https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/intruduction.html

 

ServiceComb 扩展handler处理链接口,编写了handler-tracing-zipkin 模块。Handler-tracing-zipkin 模块在java-chassis/handler处理链下,模块内容如下。

handler-tracing-zipkin模块实现追踪调用链记录数据和上传追踪数据到zipkin服务,即可支持Zipkin。

 

如果读者对于使用ServiceComb对于Zipkin支持的能力还不熟悉,可参考ServiceComb官网相关文档↓↓↓

1.http://servicecomb.apache.org/docs/tracing-with-servicecomb/ 

2.https://servicecomb.apache.org/cn/docs/customized-tracing-with-servicecomb/ 

 

handler-tracing-zipkin模块源码解读

每一次接口调用请求都会触发handler链的处理,而在这个handler链当中,ServiceComb专门为Zipkin编写了handler类ZipkinConsumerTracingHandler

和ZipkinProviderTracingHandle进行适配。下面我们来看下这两个类。

 

ZipkinConsumerTracingHandler 和ZipkinProviderTracingHandler

查看这两个类源码可知,都继承自ZipkinTracingHandler
,都只有两个构造器。

区别在于分别向父类构造器传递了不同的ZipkinTracingDelegate实现。

ZipkinTracingDelegate实现分别为ZipkinConsumerDelegate和ZipkinProviderDelegate。

这两个代理类分别封装了对应的Zipkin请求消费和请求生产操作。下面重点看下ZipkinTracingHandler的源码实现。

 

ZipkinTracingHandler

handler类最重要的方法是handler方法,该方法接收一个Invocation对象和AsyncResponse对象(全是ServiceComb内置对象)。Invocation对象包含当前调用相关信息(包括HttpServletRequest对象)。下面我们看下这个方法做了什么事情。

handler方法执行步骤:

调用了tracingDelegate.createSpan(invocation)方法创建了一个span。tracingDelegate是一个ZipkinTracingDelegate对象。

调用当前对象的onResponse方法封装成一个AsyncResponse对象。该对象是是一个函数式对象,在如下图的函数体中可看到最终调用了tracingDelegate.onResponse(span, response, error)上传span到Zipkin服务器。

调用invocation.next()方法将生成的AsyncResponse对象传递给下一个handler处理。

如果在以上操作中发生异常,将调用tracingDelegate.onResponse(span, null, e)方法发送带有异常信息的span到Zipkin服务器。

 

从以上分析我们可以看到tracingDelegate十分重要,下面我们接着看这个ZipkinTracingDelegate接口到底做了什么。

 

 

ZipkinTracingDelegate接口

如下图,该接口定义了4个方法。

1.tracer() ,获取对应的追踪器

2.createSpan(), 根据Invocation对象携带的信息创建对应的span

3.onResponse(),将span对象和对应的响应信息和异常信息上传到Zipkin服务器

4.name() , 区分消费操作和生产操作

该接口有两个实现类ZipkinConsumerDelegate
和ZipkinProviderDelegate,分别对应请求消费操作和请求生产操作。

下面我们可以看到两个实现的区别。

 

ZipkinConsumerDelegate和ZipkinProviderDelegate

下面我们先上两张图片仔细对比一下,第一张是ZipkinConsumerDelegate类,第二张是ZipkinProviderDelegate类。

我们会发现它们都是用handler变量来进行相应的操作,注意这里的handler变量在两个类分别是不一样的类型,ZipkinConsumerDelegate的handler变量是HttpClientHandler对象,而ZipkinProviderDelegate的hanler变量是HttpServerHandler对象。HttpClientHandler和HttpServerHandler类都是final修饰的类,不可继承。前面我们看到创建span和发送span都是由这两个类来负责,那么我们来看下这两个对象怎么生成的。

 

仔细观察可发现↓↓↓

ZipkinConsumerDelegate构造器部分代码:

this.handler = HttpClientHandler.create(httpTracing, new ConsumerInvocationAdapter());

ZipkinProviderDelegate构造器部分代码 : 

this.handler = HttpServerHandler.create(httpTracing, new ProviderInvocationAdapter());

从上面两段构造器代码中可发现HttpClientHandler和HttpServerHandler在创建对象时都分别传入ConsumerInvocationAdapter对象和ProviderInvocationAdapter对象,这两个对象分别继承了Zipkin的HttpClientAdapter和HttpServerAdapter抽象类,提供了属于ServiceComb本身的客户端信息和服务端信息。而Zipkin可以在不改动代码的情况下获取到这些定制信息并用于调用链追踪。

至此,ServiceComb如何一步一步去实现zipkin分布式调用链追踪,已经解读完毕。

链接参考

1.zipkin https://zipkin.io/

2.Distributed Tracing with ServiceComb and Zipkin 

http://servicecomb.apache.org/docs/tracing-with-servicecomb/

3.处理链参考

https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/intruduction.html

4.java-chassiss使用手册——调用参考

https://docs.servicecomb.io/java-chassis/zh_CN/

 

文末小结

本文向社区读者从源码角度阐述了ServiceComb是如何支持Zipkin的。

我们也非常欢迎爱好者们向社区提问和贡献代码。

下章我们将介绍ServiceComb+SpringCloud Ribbon使用篇

如果在阅读代码时有任何疑问想交流,欢迎扫码加入进微信群。

期待志同道合的朋友们加入

ServiceComb的大门为你们敞开~

用心做开源,不忘初衷

© 著作权归作者所有

业界首个Apache微服务顶级项目
粉丝 67
博文 25
码字总数 49663
作品 1
深圳
运营/编辑
私信 提问
[学习微服务-第6天] 负载均衡之ServiceComb + SpringCloud Ribbon

在微服务架构中,客户端负载均衡是指负载均衡器作为客户端软件的一部分,客户端得到可用的服务实例列表然后按照特定的负载均衡策略,分发请求到不同的服务。 ServiceComb内置了客户端负载均衡组...

业界首个Apache微服务顶级项目
02/12
10
0
[学习微服务-第7天] ServiceComb+SpringCloud Ribbon源码解读

在上一篇 《ServiceComb + SpringCloud Ribbon使用篇》中介绍了负载均衡的概念和ServiceComb协同SpringCloud Ribbon的使用, 本篇将从源码角度介绍ServiceComb是如何实现与SpringCloud Ribbo...

业界首个Apache微服务顶级项目
02/12
58
0
[学习微服务-第4天]ServiceComb+Zipkin使用篇

分布式调用链追踪能有效地监控服务间的网络延时并可视化微服务中的数据流转。ServiceComb扩展了zipkin的接口提供了服务内部的链路调用信息,能提供更完整的调用链路信息,更容易定位问题和潜...

业界首个Apache微服务顶级项目
02/12
21
0
[学习微服务-第3天] ServiceComb内置高性能网关服务

Edge Service是ServiceComb提供的JAVA网关服务。Edge Service作为整个微服务系统对外的接口,向最终用户提供服务,接入RESTful请求,转发给内部微服务。Edge Service以开发框架的形式提供,开...

业界首个Apache微服务顶级项目
02/12
40
0
阿里巴巴40万年薪Java开发是什么水平?

好多人对阿里巴巴的薪资体系结构及级别设置不太清楚,想去面试也不知道面试什么级别的岗位,那么,年薪 40 万在阿里内部又是什么水平呢? 先来看看阿里巴巴的级别设置: 再来看看阿里巴巴的对...

02/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

堆”和“栈

C++作为一款C语言的升级版本,具有非常强大的功能。它不但能够支持各种程序设计风格,而且还具有C语言的所有功能。我们在这里为大家介绍的是其中一个比较重要的内容,C++内存区域的基本介绍。...

SibylY
10分钟前
1
0
总结:Https

一、介绍 简单理解,https即在http协议的基础上,增加了SSL协议,保障数据传输的安全性。 它由以前的http—–>tcp,改为http——>SSL—–>tcp;https采用了共享密钥加密+公开密钥加密的方式 ...

浮躁的码农
13分钟前
1
0
数据库表与表之间的一对一、一对多、多对多关系

表1 foreign key 表2 多对一:表 1 的多条记录对应表 2 的一条记录 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 表2的多条记...

Garphy
44分钟前
6
0
MySQL 表崩溃修复

MySQL日志报错 2019-10-19 13:41:51 19916 [ERROR] /usr/local/mysql/bin/mysqld: Table './initread_hss/user_info' is marked as crashed and should be repaired2019-10-19 13:41:51 1......

雁南飞丶
53分钟前
6
0
Error和Exception

1.Error类和Exception类都是继承Throwable类 2.Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问...

大瑞清_liurq
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部