springboot 调用python_2w字长文,让你瞬间拥有「调用链」开发经验

5bd48c6bee846ae0d87cca43d67c9d43.gif

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

很多同学表示,对于微服务中常用的调用链功能的原理,感觉很模糊。本文将真正的从零开始,介绍调用链客户端开发的一些要点。让你瞬间拥有APM开发经验。文章很长很长,照例看一下相关目录。

7f642d0fdf0a8095590e983102e931df.png

随着微服务架构的流行,一次请求往往需要涉及到多个服务,因此服务性能监控和排查就变得非常复杂。为了发现和治理这种依赖关系,APM因此而生。

目前,市面上的APM服务端已经有了非常多的实现。比如Zipkin、Jaeger、SkyWalking、Elastic APM等(Pinpoint并不支持OpenTracing,所以我们不介绍)。

本教程会提供一些开发思路,从源码层面,解析开发成本。本次选择Jaeger作为服务端示例(选其他没什么区别),涉及的知识比较多,所以首先介绍一下其中的内容。

温馨提示。本文的代码仓库,参见:

https://github.com/xjjdog/example-jaeger-tracing

主要内容

首先,我们来看一下apm的关键信息和一些概念性的东西,为后面的示例做准备。在这里,我们简单的描述了jaeger是如何安装的,并做一些准备工作。

接下来,使用一个简单的java程序,来说明如何使用OpenTracing api进行trace的生成,并演示一个带有二个节点的调用链生成。同时,介绍一下大流量下的trace采样策略。

然后,使用OkHttp3和SpringBoot,来演示如何实现一个分布式调用。本文依然是使用底层的api进行构建,有良好素养的开发,应该能够触类旁通,应用于任何场景。

最后,以SpringCloud为例,说明微服务的调用链生成逻辑。由于各种调用内容较多,我们仅以比较流行的Feign调用来说明其原理。

如果你在开发自己的中间件,或者做一些集成性的工作,本教程能够让你快速给自己的组件加入apm功能。前提是,你的api需要兼容OpenTracing协议。

1、整体介绍

对于整个监控体系,xjjdog有一篇比较全面的介绍,包括监控,日志和apm各自的定位。详见:

《这么多监控组件,总有一款适合你》

。对于其他的APM,也介绍过一篇《这一轮,skywalking胜出》。那么到底APM在企业服务中处于什么位置呢?可参见

《微服务不是全部,只是特定领域的子集》

一文。1.1、主要开发内容

一个APM的开发工作会有很多,大体可以分为以下三部分。

数据收集部分

主要用于多样化的数据收集,为数据分析做准备。要求易用好用侵入尽量小(开发工作量),并且在极端情况下(如收集组件不可用)不能对业务有任何影响。可以看到此部分的开发量是巨大的,尤其是需要集成Nginx上下游、基础组件多样、技术栈多样的情况下。

数据分析部分

主要有实时分析与线下分析。一般,实时分析的价值更大一些,主要产出如秒级别的调用量、平均响应时间、TP值等。另外,调用链(Trace)需要存储全量数据,一些高并发大埋点的请求,会有性能问题。

监控报警

此部分利用数据分析的产出,通过短信邮件等形式,通知订阅人关注。监控报警平台应尽量向devops平台靠拢,包括自主化服务平台。

1.2、为什么选用jaeger

jaeger的开发较为活跃,而且它的模块划分是比较灵活的。在数据量非常大的情况下,数据是可以先用kafka缓冲一下的(同时为接入各种流分析平台做足了准备)。这些内容,我们在jaeger安装的部分顺便说明。

1.3、如何使用SpringBoot扩展功能

如果你的项目使用了SpringBoot,是非常方便进行扩展的。

我们接下来实现的功能是:任何加了 @OwlTrace注解的方法,都将产生一条调用链信息。

首先,我们要定义一个注解:

import java.lang.annotation.*;@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface OwlTrace {}

然后,实现其处理类。代码通过AOP对Spring管理的Bean进行拦截,非常简单的实现了Trace信息的构造。代码如下:

import io.opentracing.Span;import io.opentracing.Tracer;import io.opentracing.tag.Tags;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Lazy;import java.util.LinkedHashMap;import java.util.Map;@Configuration@Slf4jpublic class OwlTraceAutoConfiguration { static final String TAG_COMPONENT = "java"; @Autowired @Lazy Tracer tracer; @Bean public TracingAspect pxTracingAspect() { return new TracingAspect(); } @Aspect class TracingAspect { @Around("@annotation(com.sayhiai.arch.trace.annotation.OwlTrace)") public Object pxTraceProcess(ProceedingJoinPoint pjp) throws Throwable { Span span = null; if (tracer != null) { final String cls = pjp.getTarget().getClass().getName(); final String mName = pjp.getSignature().getName(); span = tracer.buildSpan(cls + "." + mName) .withTag(Tags.COMPONENT.getKey(), TAG_COMPONENT) .withTag("class", cls) .withTag("method", mName) .startActive(false) .span(); } try { return pjp.proceed(); } catch (Throwable t) { Map exceptionLogs = new LinkedHashMap<>(2); exceptionLogs.put("event", Tags.ERROR.getKey()); exceptionLogs.put("error.object", t); span.log(exceptionLogs); Tags.ERROR.set(span, true); throw t; } finally { if (tracer != null && span != null) { span.finish(); } } } }}

最后,根据Spring的加载方式,将路径添加到src/main/resources/META-INF/spring.factories中:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=arch.trace.core.owl.OwlTraceAutoConfiguration,arch.trace.core.log.LoggingAutoConfiguration

将组件打成jar包,一个spring boot starter就实现了。

使用

在application.properties文件中,确保打开了AOP

# AOPspring.aop.auto=truespring.aop.proxy-target-class=trueopentracing.jaeger.log-spans=trueopentracing.jaeger.udp-sender.host=192.168.3.237opentracing.jaeger.udp-sender.port=5775

接下来,我们将逐步进入客户端api的开发之中。

2、安装jaeger

支持OpenTracing的server端有很多,我们总要选一个。在

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值