news 2026/8/14 15:07:13

Springboot实现微服务监控

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Springboot实现微服务监控
  1. org.apache.skywalking:apm-toolkit-trace:

    • 用途: 这是 Apache SkyWalking 的一个工具包,用于追踪和监控微服务架构的应用。它提供了一种简单的方式来为 Java 应用程序插入追踪逻辑,帮助开发者收集应用执行的性能数据。
    • 功能: 包括分布式追踪、性能分析、错误监控等。开发者可以通过这个工具包将追踪数据发送到 SkyWalking 的后端服务,后端服务会对这些数据进行处理和可视化。
  2. com.alibaba.arms.apm:arms-sdk:

    • 用途: 这是阿里巴巴的 APM SDK,目的是为了监控和分析应用的性能,尤其是在分布式应用和微服务架构中。它提供了一套完整的 API,用于记录性能数据和上下文信息。
    • 功能: 包括事务追踪、业务监控、错误日志收集等,可以帮助开发者理解业务请求的流转情况和性能瓶颈。

总的来说,这两个依赖库都是为了帮助开发者监控和优化应用程序的性能,不同的是它们分别来源于不同的开源项目。使用这些工具可以使开发者更准确地了解和提高应用的运行效率。

1. 引入依赖

<dependency><groupId>com.alibaba.arms.apm</groupId><artifactId>arms-sdk</artifactId><version>1.7.5</version></dependency><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.7.0</version><scope>provided</scope></dependency>

2 .TraceCtx抽象类

主要用于实现分布式追踪(Tracing)的上下文管理。分布式追踪是一种记录请求在微服务或不同系统之间流动的方式,用来分析和监控系统的性能和行为。

  • 该类采用了工厂模式(Factory Pattern),根据环境动态选择合适的追踪上下文实现。
publicabstractclassTraceCtx{privatestaticTraceCtxtraceCtx;static{if(ClassUtils.isPresent("com.alibaba.arms.tracing.Tracer",null)){traceCtx=newArmsTraceCtx();}elseif(ClassUtils.isPresent("org.apache.skywalking.apm.toolkit.trace.TraceContext",null)){traceCtx=newSkywalkingTraceCtx();}else{traceCtx=newPseudoTraceCtx();}}publicstaticTraceCtxget(){returntraceCtx;}publicabstractStringtraceId();publicabstractStringspanId();publicabstractStringsegmentId();publicabstractvoidtag(Stringkey,Stringvalue);publicabstractvoidputCorrelation(Stringkey,Stringvalue);publicabstractRunnabletraceRunnable(Runnabler);publicabstract<V>Callable<V>traceCallable(Callable<V>c);}
2.1. ArmsTraceCtx实现类

用于与阿里巴巴的 ARMS(应用性能管理与服务监控)工具集成,提供分布式追踪的上下文管理功能。

importcom.alibaba.arms.sdk.v1.async.TraceCallable;importcom.alibaba.arms.sdk.v1.async.TraceRunnable;importcom.alibaba.arms.tracing.Span;importcom.alibaba.arms.tracing.Tracer;importjava.util.concurrent.Callable;publicclassArmsTraceCtxextendsTraceCtx{@OverridepublicStringtraceId(){Spanspan=Tracer.builder().getSpan();returnspan.getTraceId();}@OverridepublicStringspanId(){return"Arms-1";}@OverridepublicStringsegmentId(){Spanspan=Tracer.builder().getSpan();returnspan.getRpcId();}@Overridepublicvoidtag(Stringkey,Stringvalue){Spanspan=Tracer.builder().getSpan();span.setTag(key,value);}@OverridepublicvoidputCorrelation(Stringkey,Stringvalue){}@OverridepublicRunnabletraceRunnable(Runnabler){returnTraceRunnable.asyncEntry(r);}@Overridepublic<V>Callable<V>traceCallable(Callable<V>c){returnTraceCallable.asyncEntry(c);}}
2.2. SkywalkingTraceCtx实现类

用于与 Apache SkyWalking 进行集成的类,它用于处理和管理分布式追踪上下文(Trace Context)。

importorg.apache.skywalking.apm.toolkit.trace.ActiveSpan;importorg.apache.skywalking.apm.toolkit.trace.CallableWrapper;importorg.apache.skywalking.apm.toolkit.trace.RunnableWrapper;importorg.apache.skywalking.apm.toolkit.trace.TraceContext;importjava.util.concurrent.Callable;publicclassSkywalkingTraceCtxextendsTraceCtx{@OverridepublicStringtraceId(){returnTraceContext.traceId();}@OverridepublicStringspanId(){returnTraceContext.spanId()+"";}@OverridepublicStringsegmentId(){returnTraceContext.segmentId();}@Overridepublicvoidtag(Stringkey,Stringvalue){ActiveSpan.tag(key,value);}@OverridepublicvoidputCorrelation(Stringkey,Stringvalue){TraceContext.putCorrelation(key,value);}@OverridepublicRunnabletraceRunnable(Runnabler){returnRunnableWrapper.of(r);}@Overridepublic<V>Callable<V>traceCallable(Callable<V>c){returnCallableWrapper.of(c);}}
2.3. PseudoTraceCtx实现类

用于模拟或占位的追踪上下文实现,可以用于测试或验证代码逻辑而不依赖于实际的追踪系统。

importjava.util.concurrent.Callable;publicclassPseudoTraceCtxextendsTraceCtx{@OverridepublicStringtraceId(){return"Pseudo-1";}@OverridepublicStringspanId(){return"Pseudo-1";}@OverridepublicStringsegmentId(){return"Pseudo-1";}@Overridepublicvoidtag(Stringkey,Stringvalue){}@OverridepublicvoidputCorrelation(Stringkey,Stringvalue){}@OverridepublicRunnabletraceRunnable(Runnabler){returnr;}@Overridepublic<V>Callable<V>traceCallable(Callable<V>c){returnc;}}

3. 线程工厂

publicclassNamedThreadFactoryimplementsThreadFactory{protectedstaticfinalAtomicIntegerPOOL_SEQ=newAtomicInteger(1);protectedfinalAtomicIntegermThreadNum;protectedfinalStringmPrefix;protectedfinalbooleanmDaemon;publicNamedThreadFactory(){this("pool-"+POOL_SEQ.getAndIncrement(),false);}publicNamedThreadFactory(Stringprefix){this(prefix,false);}publicNamedThreadFactory(Stringprefix,booleandaemon){this.mThreadNum=newAtomicInteger(1);this.mPrefix=prefix+"-thread-";this.mDaemon=daemon;}publicThreadnewThread(Runnablerunnable){Stringname=this.mPrefix+this.mThreadNum.getAndIncrement();Threadret=newThread(runnable,name);ret.setDaemon(this.mDaemon);returnret;}}

4. 线程池参数

@Data@Configuration@ConfigurationProperties(prefix="thread.pool")publicclassThreadPoolProperties{privatePoolVopoolVo=newPoolVo();@Data@ConfigurationpublicclassPoolVo{privatebooleanenabled=true;privateStringnamePrefix="ol-threadPool";privateintcoreSize=200;privateintmaxSize=200;privatelongkeepAliveSeconds=600;privateintqueueSize=100;}}

5. 线程池配置类

@Slf4j@ConfigurationpublicclassThreadPoolConfig{@AutowiredprivateThreadPoolPropertiesthreadPoolProperties;@ConditionalOnProperty(value="thread.pool.poolVo.enabled",havingValue="true")@Bean(name="oldThreadPoolExecutor")publicThreadPoolExecutorolRvdcThreadPoolExecutor(){ThreadPoolProperties.PoolVopoolVo=threadPoolProperties.getPoolVo();ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor(poolVo.getCoreSize(),poolVo.getMaxSize(),poolVo.getKeepAliveSeconds(),TimeUnit.SECONDS,newLinkedBlockingQueue<Runnable>(),newNamedThreadFactory(poolVo.getNamePrefix()),newThreadPoolExecutor.AbortPolicy());log.info("======================= ThreadPool initialize success. =======================");returnthreadPoolExecutor;}}

6. 使用示例

@RestControllerpublicclassDemoController{@AutowiredprivateThreadPoolExecutorthreadPoolExecutor;@GetMapping("/test")publicvoidtest(){Runnablerunnable=TraceCtx.get().traceRunnable(()->{for(inti=0;i<10;i++){System.out.println("i = "+i);}});System.out.println(runnable);threadPoolExecutor.execute(runnable);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 15:05:08

Image-to-Video图像转视频生成器:基于I2VGen-XL,效果真实流畅

Image-to-Video图像转视频生成器&#xff1a;基于I2VGen-XL&#xff0c;效果真实流畅 1. 技术背景与核心价值 1.1 静态图像到动态视频的技术突破 在数字内容创作领域&#xff0c;将静态图像转化为动态视频一直是一项具有挑战性的任务。传统方法需要专业的动画制作技能和复杂…

作者头像 李华
网站建设 2026/8/14 15:07:08

SenseVoice-Small ONNX模型部署:Ubuntu 20.04服务器环境保姆级教程

SenseVoice-Small ONNX模型部署&#xff1a;Ubuntu 20.04服务器环境保姆级教程 最近在折腾语音相关的AI应用&#xff0c;发现了一个挺有意思的模型叫SenseVoice-Small。它是个轻量级的语音识别模型&#xff0c;支持多种语言&#xff0c;而且推理速度挺快。最关键的是&#xff…

作者头像 李华
网站建设 2026/7/14 15:57:08

PyTorch学习率调度实战:LambdaLR与OneCycleLR对比及适用场景解析

PyTorch学习率调度实战&#xff1a;LambdaLR与OneCycleLR对比及适用场景解析 在深度学习模型训练过程中&#xff0c;学习率的选择和调整往往决定了模型能否收敛到最优解。PyTorch提供了多种学习率调度器&#xff08;Learning Rate Scheduler&#xff09;&#xff0c;其中Lambda…

作者头像 李华
网站建设 2026/7/14 15:57:07

实测对比!LM25116与LM2843在DCM模式下的电压振荡问题排查实录

LM25116与LM2843在DCM模式下的电压振荡问题排查实录 当Buck电源从CCM模式切换到DCM模式时&#xff0c;开关节点&#xff08;SW&#xff09;的波形往往会出现令人头疼的振荡现象。这种现象不仅影响电源效率&#xff0c;还可能引发EMI问题。本文将基于TI的LM25116和LM2843两款Buc…

作者头像 李华
网站建设 2026/7/14 15:56:54

通达信筹码分布主图指标优化实战:如何自定义参数提升分析精准度

通达信筹码分布主图指标深度优化指南&#xff1a;参数调校与实战应用 1. 筹码分布指标的核心价值与优化意义 筹码分布分析作为技术分析领域的重要工具&#xff0c;能够直观展示不同价位区间持仓成本的集中程度&#xff0c;帮助交易者识别主力资金动向和市场情绪变化。通达信软件…

作者头像 李华
网站建设 2026/7/14 15:57:11

【Unity动画】从零到一:动画过渡面板参数实战解析与避坑指南

1. 动画过渡基础&#xff1a;从待机到行走的第一次尝试 第一次打开Unity的Animator窗口时&#xff0c;那个布满方框和箭头的界面确实让人有点懵。不过别担心&#xff0c;我们先从最简单的两个状态开始——让角色从待机(Idle)自然过渡到行走(Walk)。在Project窗口选中角色的Anim…

作者头像 李华