11、gRPC与分布式链路追踪

传送门 Opentracing

传送门 Jayger && ZipKin

在前面的两篇文章中,我们已经普及了什么是OpenTracing,以及Jaeger和ZipKin的简单比较。接下来,就来按照官方的例子进行一个简单的尝试,然后再抽丝剥茧,看看如何在我们的工程代码中进行实现。

官方DEMO

Setup MicroDonuts

首先,测试环境需要安装JDK,以及Maven,可以搜索如何安装。

在浏览器中访问 http://127.0.0.1:10001 就可以看到一个简单的页面了。

tracing demo

选择一个分布式追踪工具

我们这里选择的是Jaeger.

修改 microdonuts/tracer_config.properties 文件:

在docker中运行:

打开浏览器,访问 http://localhost:16686 就可以看到 Jaeger UI 了。

Jaeger UI

官方示例 Tracing Demo

Take OpenTracing for a HotROD ride

gRPC 集成 Jaeger

在前面的对比中,我们已经大体上介绍过Jaeger 和 ZipKin 的区别,同时我们也介绍了二者在现有云原生生态中的发展。所以,我们这里选择了Jaeger来进行学习。

下面我们就介绍一下,如何在gRPC中集成Jaeger。

从我们之前介绍的Jaeger文章中,我们看到如果想要对每个服务进行tracing,除了需要在代码里面嵌入Jaeger Client 之外,还需要有Agent,collector,store,UI 等众多组件。我们这里只演示如何在代码中集成JaegerClient,至于其他组件,我们都在docker中运行。

这时在浏览器中访问 http://127.0.0.1:16686/search就可以看到jaeger的页面了。不过现在代码还没有跑起来,看不到什么效果。

Jaeger UI

查看一下容器内的构成

可以点击 jaeger-docker-compose 去查看一下这个容器内的构成。 下面把代码贴一下。

即便对容器不是很熟悉的话,也能够看出,容器内运行的程序 包含了四个部分,分别是 agent,query,collector,还有存储cassandra。很明显,接下来,我们在 gRPC-example中,再集成 jaeger-client,然后就可以进行微服务的链路追踪了。

tracing carrier

根据 Opentracing 的官方定义在进行,跨进程追踪调用的时候,需要进行 Inject and Extract。并且需要指定carrier。

而官方指定的carrier 只有两种。 TextMapCarrier 和 HTTPHeadersCarrier

当然,我们也可以进行 自定义的carrier,但是如果要实现自定义的carrier,就必须要实现 TextMapWriter & TextMapReader 接口

我们接下来来实现一下两个接口,采用一个自定义的carrier。

创建 GlobalTracer

创建 tracer 的过程可以参考 官方的demo示例 jaeger-client-go

gRPC Interceptor

gRPC 提供了 拦截器,让我们可以在Clent端和server端对方法进行拦截处理,这样可以节省我们很大的麻烦。因为我们如果在server端和client端分别有很多的方法需要监控,难道我们每个方法都要去实现一遍 tracer定义?interceptor帮助我们解决了这个问题。

可以参考gRPC 官方 Example Interceptor

下面我们看下如何定义的Client和Server Interceptor.

gRPC Client 和 gRPC Server 中集成 Interceptor 和Tracer

接下来,就可以在gRPC的代码中进行tracer 和 interceptor的集成了。

我们还是使用 前面 gRPC 注册consul 的例子,在这个例子的基础上,添加 tracer。

首先我们来看下 Clinet端

然后我们看下 Server 端

从上面的代码来看,我们的实现,非常简单。只要在client和server端启动时将我们的interceptor传入,同时传入创建好的trace就可以了。

但是有一点需要注意,因为我们使用的是interceptor,所以,在进行健康性检查的时候,也会被trace到。也就是说,我们在 jaeger UI 上查看时也能够看到 health check 的trace 信息。

运行一下

先运行 Server端,再启动Client端,就可以进行通信以及链路追踪了。

gRPC Tracing

点开之后可以很详细的看到层级关系以及每个方法的信息,需要tracing的信息,还可以进行更详细的定义。

gRPC Tracing

还可以按照 调用链 的形式来进行查看。这有利于我们梳理清复杂的服务架构。

gRPC Tracing

本文的示例 代码地址 rpc-examples

参考

Last updated

Was this helpful?