内容简介:随着微服务架构的流行,一次请求往往需要涉及到多个服务,因此服务性能监控和排查就变得更复杂。APM因此而生。目前,市面上的APM服务端已经有了非常多的实现。比如Zipkin、Jaeger、SkyWalking、Elastic APM等(Pinpoint并不支持OpenTracing,所以我们不介绍)。本教程仅提供一些开发思路,对技术要求较高,因为大部分需要涉及到对相应组件源码的理解。全部源码都可以在github上找到。
随着微服务架构的流行,一次请求往往需要涉及到多个服务,因此服务性能监控和排查就变得更复杂。APM因此而生。
目前,市面上的APM服务端已经有了非常多的实现。比如Zipkin、Jaeger、SkyWalking、Elastic APM等(Pinpoint并不支持OpenTracing,所以我们不介绍)。
本教程仅提供一些开发思路,对技术要求较高,因为大部分需要涉及到对相应组件源码的理解。全部源码都可以在github上找到。
本次选择Jaeger作为服务端示例。主要内容如下。
第一部分
在第一部分,我们来看一下apm的关键信息和一些概念性的东西,为后面的示例做准备。在这里,我们简单的描述了jaeger是如何安装的,也是一些准备工作。
第二部分
使用一个简单的 java 程序,来说明如何使用OpenTracing api进行trace的生成,并演示一个带有二个节点的调用链生成。
第三部分
使用OkHttp3和SpringBoot,来演示如何实现一个分布式调用。本文依然是使用底层的api进行构建,对开发感觉好的到此应该能够应对各种场景。
第四部分
以SpringCloud为例,说明微服务的调用链生成逻辑。由于各种调用内容较多,我们仅以比较流行的Feign调用来说明其原理。 SpringCloud的实现已经有了比较好的轮子,考虑的也比较全面,可以参考其源码进行分析。
如果你在开发自己的中间件,或者做一些集成性的工作,本教程能够让你快速给自己的组件加入apm功能。前提是,你的api兼容OpenTracing协议。
整体介绍
对于监控体系和apm链路,小姐姐味道公众号有更加详细的描述,建议先读一下。
以下仅简要说明一下调用链的主要因素。
调用链主要因素
数据收集部分
主要用于多样化的数据收集,为数据分析做准备。要求易用好用侵入尽量小(开发工作量),并且在极端情况下(如收集组件不可用)不能对业务有任何影响。可以看到此部分的开发量是巨大的,尤其是需要集成Nginx上下游、基础组件多样、技术栈多样的情况下。
数据分析部分
主要有实时分析与线下分析。一般,实时分析的价值更大一些,主要产出如秒级别的调用量、平均响应时间、TP值等。另外,调用链(Trace)需要存储全量数据,一些高并发大埋点的请求,会有性能问题。
监控报警
此部分利用数据分析的产出,通过短信邮件等形式,通知订阅人关注。监控报警平台应尽量向devops平台靠拢,包括自主化服务平台。
为什么选用jaeger
jaeger的开发较为活跃,而且它的模块划分是比较灵活的。在数据量非常大的情况下,数据是可以先用kafka缓冲一下的(同时为接入各种流分析平台做足了准备)。这些内容,我们在jaeger安装的部分顺便说明。
扩展方式
如果你的项目使用了SpringBoot,是非常方便进行扩展的。以下内容不止一次提起,读过的请忽略。
我们接下来实现的功能是:任何加了 @OwlTrace
注解的方法,都将产生一条调用链信息。
首先,我们要定义一个注解:
import java.lang.annotation.*;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @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
@Slf4j
public 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<String, Object> 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
# AOP spring.aop.auto=true spring.aop.proxy-target-class=true opentracing.jaeger.log-spans=true opentracing.jaeger.udp-sender.host=192.168.3.237 opentracing.jaeger.udp-sender.port=5775 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 番外篇2-基本规范、注释、static关键字、import关键字
- 说说iOS中的常用的关键字static ,class(仅限Swift关键字)
- Golang 关键字
- 2019 关键字
- golang关键字
- final关键字深入解析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
About Face 3
Alan Cooper、Robert Reimann、David Cronin / John Wiley & Sons / 2007-5-15 / GBP 28.99
* The return of the authoritative bestseller includes all new content relevant to the popularization of how About Face maintains its relevance to new Web technologies such as AJAX and mobile platforms......一起来看看 《About Face 3》 这本书的介绍吧!