分布式调用链客户端--nisbos-common-trace
<h2>1、nisbos-common-trace简介</h2>
<p>nisbos-common-trace是基于cat-client 3.0基础上封装的调用链工具,旨在帮助业务开发人员能快速上手调用链埋点。目前nisbos-common-trace已经集成分布式调用链、mybatis、druid埋点、自定义业务埋点等</p>
<h2>2、快速入门</h2>
<blockquote>
<p>2.1 在业务服务中,引入jar</p>
</blockquote>
<pre><code class="language-java"> <dependency>
<groupId>com.nisbos</groupId>
<artifactId>nisbos-common-trace</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency></code></pre>
<blockquote>
<p>2.2 在业务服务的resources新增META-INF/services/com.ctrip.framework.apollo.tracer.spi.MessageProducerManager文件,该文件内容为</p>
</blockquote>
<pre><code class="language-java">com.ctrip.framework.apollo.tracer.internals.NullMessageProducerManager</code></pre>
<blockquote>
<p>2.3 配置cat服务端地址</p>
</blockquote>
<p><strong>注</strong> cat服务端地址提供两种配置方式,一种是和配置apollo绑定,一种是在application.yml中配置,看个人喜好配置</p>
<p>a、与apollo集成,则在application.yml配置如下内容</p>
<pre><code class="language-yaml">trace:
cat:
fetch-config-from-apollo: true</code></pre>
<p>在apollo portal配置业务服务的面板上,配置如下内容</p>
<pre><code class="language-java"># cat服务端要采集的appId
app.id = nisbos-feign-provider
# cat服务端地址端口
cat.server.http.port = 8082
# cat 服务端IP
cat.server.servers = 10.1.4.70,10.1.4.71,10.1.4.72
</code></pre>
<p>b、不和apollo集成,则在application.yml配置如下内容</p>
<pre><code class="language-java">trace:
cat:
# 是否开启分布式调用链
enabled: true
# cat服务端地址
ips:
- 10.1.4.70:8082
- 10.1.4.71:8082
- 10.1.4.72:8082</code></pre>
<p>同时在resources文件夹下新增app.properties,该文件内容为</p>
<pre><code class="language-java">app.name=业务服务的applicationName</code></pre>
<blockquote>
<p>2.4 分布式调用链埋点</p>
</blockquote>
<p>在feign service接口中,@FeignClient注解添加此类的configuration配置,形如下</p>
<pre><code class="language-java">@FeignClient(name="nisbos-feign-provider", configuration = CatFeignConfiguration.class)</code></pre>
<p>下图为调用链示例图
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/580f228ff27256027b51e1a7c5e7713b?showdoc=.jpg" alt="" /></p>
<blockquote>
<p>2.5 druid数据库连接池埋点</p>
</blockquote>
<p>如果业务服务有使用druid连接池,则可以在业务服务的resources文件下新增
META-INF/services/com.alibaba.druid.filter.Filter,该文件内容如下</p>
<pre><code class="language-java">com.nisbos.trace.cat.filter.CatTraceDruidFilter</code></pre>
<p>即可进行埋点</p>
<p>下图为druid埋点示例图
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/b41b5d560274820d735def335ea312ff?showdoc=.jpg" alt="" /></p>
<blockquote>
<p>2.6 mybatis埋点</p>
</blockquote>
<p>如果业务服务有使用mybatis框架,则在application.yml文件配置如下内容</p>
<pre><code class="language-yaml">trace:
cat:
mybatis-report-enabled: true</code></pre>
<p>即可进行mybatis埋点</p>
<p>下图为mybatis埋点示例图
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/c88e5ab9c2b8d6a7ebd81e6a3d374faa?showdoc=.jpg" alt="" /></p>
<blockquote>
<p>2.7 自定义业务埋点</p>
</blockquote>
<p><strong>注</strong>:埋点的时间粒度为按一分钟进行业务埋点</p>
<p>a、通过注解@CatTraceMetric进行埋点,形如</p>
<pre><code class="language-java"> @CatTraceMetric(name="登录计数",type = CatTraceMetricEnum.COUNT)
@CatTraceMetric(name="登录统计",type = CatTraceMetricEnum.SUM)
public RPCResult login(UserVO userVO){
if("张三".equals(userVO.getUserName()) && "123456".equals(userVO.getPassword())){
String token = JwtUtils.generateToken("login","张三",jwtProperty.getJwtEffectiveTime());
return RPCResult.ok(token);
}
</code></pre>
<p>@CatTraceMetric当type = CatTraceMetricEnum.COUNT代表使用计数器埋点、每次累加1;当type = CatTraceMetricEnum.SUM,代表统计计数,默认每次按1计数</p>
<p>下图为自定义业务埋点示例图<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/f267cc6b6b06da9f0ef18215aa9cc469?showdoc=.jpg" alt="" /></p>
<p>b、通过com.nisbos.trace.util.CatTraceUtils工具类进行埋点,比如计数埋点</p>
<pre><code class="language-java">CatTraceUtils.logMetricForCount("登录计数",1);</code></pre>
<p>该代码段的意思是登录计数,每次累加1。CatTraceUtils这个工具提供了CAT大部分埋点需要的方法</p>
<h2>3.Q&A</h2>
<blockquote>
<p>3.1 Could not initialize class com.dianping.cat.message.internal.DefaultMessageProducer</p>
</blockquote>
<p>出现该问题的原因是当项目初始化创建client.xml时,会调用MessageProducer进行创建client.xml,而当项目中有引用apollo配置中心时,apollo客户端也扩展了cat的MessageProducer的实现,与cat扩展的MessageProducer产生冲突,解决的方法有两种,一种是在业务服务的服务器中手动创建client.xml。另一种就是在业务服务的resources新增META-INF/services/com.ctrip.framework.apollo.tracer.spi.MessageProducerManager文件,该文件内容为</p>
<pre><code class="language-java">com.ctrip.framework.apollo.tracer.internals.NullMessageProducerManager</code></pre>
<blockquote>
<p>3.2 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.</p>
</blockquote>
<p>由于nisbos-common-trace引入mybatis的包,mybatis会根据DataSourceAutoConfiguration加载类,当业务服务没有使用数据源时,mybatis没有找到合适的加载类,而报错。解决的方法如下,在业务启动类上加如下配置即可</p>
<pre><code class="language-java">@SpringBootApplication(scanBasePackages = "com.nisbos",exclude= {DataSourceAutoConfiguration.class})</code></pre>
<blockquote>
<p>3.3 如何制定业务异常埋点</p>
</blockquote>
<p>正常cat会自动帮你做异常埋点,如果一些业务异常埋点可以使用</p>
<pre><code class="language-java"> CatTraceUtils.logError(String message, Throwable cause);</code></pre>
<p>进行埋点</p>