分布式链路追踪 —— 基于Dubbo的traceId追踪传递

dubbo项目traceId链路传递(MDC方案及重复traceId处理) dubbo项目,traceId链路传递,MDC方案,重复traceId处理 阅读详情

原文链接,点击跳转

RpcContext 上下文对象

在实现 Dubbo 调用之间的链路跟踪之前,先简单了解 RpcContext 上下文对象和 Filter 过滤器对象,Dubbo 分布式链路追踪是基于这两个对象实现。

概要

  • RpcContext 是 Dubbo 框架提供的一个类,它的设计目标是提供一个 dubbo 调用的上下文对象,用于在远程过程调用(RPC)期间传递、共享请求和响应的相关信息。它可以用于存储、访问与当前 RPC 调用相关的数据,如调用方的 IP 地址、附加参数、上下文变量等。它提供了一些静态方法和属性,可以方便地获取和设置与当前线程相关的 RPC 上下文。

    public class RpcContext {
    
        private static final InternalThreadLocal<RpcContext> LOCAL = new InternalThreadLocal<RpcContext>() {
            protected RpcContext initialValue() {
                return new RpcContext();
            }
        };
        private static final InternalThreadLocal<RpcContext> SERVER_LOCAL = new InternalThreadLocal<RpcContext>() {
            protected RpcContext initialValue() {
                return new RpcContext();
            }
        };
        private final Map<String, String> attachments = new HashMap();
        private final Map<String, Object> values = new HashMap();
        // ......
    }
    

原理

  • RpcContext 是基于 ThreadLocal 实现的,做到了线程隔离。RpcContext是与线程绑定的,每个线程都有自己的一个 RpcContext 实例并使用 ThreadLocal 变量来存储,避免并发访问问题。当客户端发起一个 RPC 请求时,Dubbo 框架会创建一个新的线程来处理该请求,并且会将 RpcContext 与该线程进行绑定,这样看,对于每次 RPC 请求,RpcContext 也是唯一的。但对于同一个线程内的多个 RPC 请求,它们共享同一个 RpcContext 实例。

  • RpcContext 实例会在请求处理期间一直存在,并在请求处理完成后需要清理当前线程上的 RpcContext 实例中的数据,以确保下次使用该线程处理新的请求时,RpcContext 是一个干净的状态。

    对于服务消费方,Dubbo 框架在请求发送、响应后没有清除 RpcContext 实例中的数据;

    对于服务提供方,Dubbo 框架在收到请求并处理后,会去清除 RpcContext 实例中的数据,这个在 ContextFilter 服务提供方过滤器中可以看到。

使用场景

  • 可以在 dubbo 的拦截器、过滤器或服务提供者/消费者的代码中使用 RpcContext 来获取和设置上下文信息,以满足特定的业务需求,如日志跟踪、传递身份验证信息等。

下面是一些常用的 RpcContext 方法和属性:

  • RpcContext.getContext(): 获取当前线程的 RpcContext 实例。
  • RpcContext.isConsumerSide(): 判断当前线程是否处于消费者端。
  • RpcContext.isProviderSide(): 判断当前线程是否处于提供者端。
  • RpcContext.getRemoteAddress(): 获取远程调用的地址。
  • RpcContext.getLocalAddress(): 获取本地调用的地址。
  • RpcContext.setAttachment(String key, String value): 设置附加参数。
  • RpcContext.getAttachment(String key): 获取指定键的附件信息。
  • RpcContext.getAttachments(): 获取所有的附件信息。

Dubbo 过滤器(Filter)对象

Dubbo Filter 介绍

dubbo 的 Filter 是 dubbo 框架提供的一个功能扩展点,用于对服务提供者和消费者之间的请求和响应进行拦截过滤处理,比如认证和授权、日志跟踪、传递一些公共信息等。

如 dubbo 原生 Filter 实现类,如:ConsumerContextFilter 和 ContextFilter

  • ConsumerContextFilter 是一个服务消费方的过滤器,用于在服务消费者发起 RPC 调用之前或之后,对上下文信息进行处理和传递,用于收集和发送调用方的上下文信息到服务提供者端。

    ConsumerContextFilter 源码:通过这个过滤器可以看到在 RPC 调用之前会获取 RpcContext 对象并设置相关参数,Dubbo 框架会借助 RpcContext 对象将相关数据透传到服务提供方。

    @Activate(
        group = {"consumer"},
        order = -10000
    )
    public class ConsumerContextFilter implements Filter {
        public ConsumerContextFilter() {
        }
    
        public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
            RpcContext.getContext().setInvoker(invoker).setInvocation(invocation).setLocalAddress(NetUtils.getLocalHost(), 0).setRemoteAddress(invoker.getUrl().getHost(), invoker.getUrl().getPort()).setRemoteApplicationName(invoker.getUrl().getParameter("remote.application")).setAttachment("remote.application", invoker.getUrl().getParameter("application"));
            if (invocation instanceof RpcInvocation) {
                ((RpcInvocation)invocation).setInvoker(invoker);
            }
    
            return invoker.invoke(invocation);
        }
    }
    

    @Activate 注解是 Dubbo 框架提供的一个扩展点激活注解,用于指定在特定条件下激活扩展点。

    在上述过滤器中,@Activate(group = Constants.CONSUMER, order = -10000) 是对一个扩展点的激活配置。具体解释如下:

    • group = {"consumer"}: 在指定的分组激活,如 consumer,表示该扩展点在消费者端被激活。
    • order = -10000: 指定激活的顺序为 -10000。在 Dubbo 框架中,扩展点的激活顺序可以通过 order 值来进行控制,值越小表示优先级越高。
  • ContextFilter 是一个服务提供方的过滤器,用于在服务提供者收到 RPC 调用请求之前或之后,对上下文信息进行处理和传递,如清除 RpcContext 实例中的数据,以确保下次使用该线程处理新的请求时,RpcContext 是一个干净的状态。

    ContextFilter 源码:在处理请求后去清除 RpcContext 中相关数据。

    @Activate(
        group = {"provider"},
        order = -10000
    )
    public class ContextFilter implements Filter, Filter.Listener {
        private static final String TAG_KEY = "dubbo.tag";
        public ContextFilter() {
        }
        
        public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
            // ......
            Result var6;
            try {
                // 禁止清除RpcContext的功能。这意味着在调用invoker.invoke(invocation)之后,RpcContext中的上下文信息不能被清除。
                RpcContext.getContext().clearAfterEachInvoke(false);
                var6 = invoker.invoke(invocation);
            } finally {
                // 开启允许清除RpcContext的功能。
                RpcContext.getContext().clearAfterEachInvoke(true);
                // 显式清除RpcContext中的上下文信息。
                RpcContext.removeContext();
                RpcContext.removeServerContext();
            }
    
            return var6;
        }
        // ......
    }
    

自定义 Dubbo Filter

  1. 实现 org.apache.dubbo.rpc.Filter接口:

    import org.apache.dubbo.rpc.*;
    
    public class CustomFilter implements Filter {
        @Override
        public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
            // 自定义过滤逻辑
            return invoker.invoke(invocation);
        }
    }
    
  2. 创建 Dubbo 的 SPI 扩展文件(META-INF/dubbo/org.apache.dubbo.rpc.Filter)中,将自定义过滤器的实现类指定为对应的扩展点:

    customFilter=com.example.CustomFilter
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  3. 使过滤器生效:

    方式一:在自定义过滤器上使用注解:

    @Activate(group = {"consumer"})
    

    方式二:在配置文件(这里使用application.properties)中配置:

    dubbo.consumer.filter=customFilter
    

    通过以上步骤,在服务消费方指定了一个自定义过滤器,该过滤器将在服务消费者发起远程调用前后执行自定义的逻辑。

基于Dubbo的traceId追踪传递实现

要实现在 Dubbo 接口之间传递 TraceID,可以使用 Dubbo 的拦截器(Filter)机制来实现。下面是一个示例代码,演示了如何在 Dubbo 接口调用中传递 TraceID 进行追踪,其中具体 Filter 实现过程前面已讲述,这里只展示实现类代码。需要 demo 示例代码,请关注【Qin的学习营地】,回复【基于Dubbo的traceId追踪传递】。

这里使用 spring boot 整合 dubbo,详细搭建过程请参考:Dubbo 快速入门使用教程

这里通过打印日志来可视化结果,使用了 Slf4J 的 MDC,通过设置 MDC.put(key, value),并在日志配置文件中配置 key,日志打印时会将配置 key 的地方转换为 value 打印出来。

  1. 创建 Dubbo 的服务提供方拦截器类,从 RpcContext 中获取 traceid 参数,并设置到 MDC 中,请求处理完后清除 MDC 中的 traceid 参数:

    @Slf4j
    @Activate(group = {"provider"})
    public class TraceIdProviderFilter implements Filter {
        @Override
        public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
            String traceId = RpcContext.getContext().getAttachment("traceId");
            if (traceId != null) {
                MDC.put("traceId", traceId);
            }
            try {
                return invoker.invoke(invocation);
            } finally {
                MDC.remove("traceId");
            }
        }
    }
    
  2. 创建 Dubbo 的服务消费方拦截器类,向 RpcContext 中写入 traceid 参数:

    @Slf4j
    @Activate(group = {"consumer"})
    public class TraceIdConsumerFilter implements Filter {
        @Override
        public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
            String traceId = MDC.get("traceId");
            if (traceId == null) {
                traceId = UUID.randomUUID().toString().replace("-", "");
            }
            RpcContext.getContext().setAttachment("traceId", traceId);
            MDC.put("traceId", traceId);
            log.info("consumer ——> provider");
            return invoker.invoke(invocation);
        }
    }
    
  3. 服务消费方调用逻辑:

    @Slf4j
    @Component
    public class ProducerService {
    
        @Reference(retries = -1, version="1.0.0", timeout = 15000)
        private HelloService helloService;
    
        public String consumerSayHello(String name){
            String traceId = UUID.randomUUID().toString().replace("-", "");
            MDC.put("traceId", traceId);
            String hello = helloService.sayHello(name);
            log.info("consumer receive response : "+ hello);
            return hello;
        }
    }
    
  4. 运行后看日志打印结果,可以看到服务提供方的 traceId 和服务消费方的 traceId 两者一致,服务消费方的 traceId 透传到服务提供方。

    消费方:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    提供方:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

​ 分布式链路追踪
基于Dubbo的traceId追踪传递

本文首先介绍 Dubbo 的 RpcContext 上下文和 Filter 过滤器,然后再介绍基于Dubbo的traceId追踪传递的实现。

分布式链路追踪之SkyWalking 在微服务架构中,一次请求往往涉及到多个模块,多个中间件,多台机器的相互协作才能完成。这一系列调用请求中,有些是串行的,有些是并行的,那么如何确定这个请求背后调用了哪些应用,哪些模块,哪些节点及调用的先后顺序?如何定位每个模块的性能问题?本文将为你揭晓答案。衡量一个接口的性能好坏,一般我们至少会关注以下三个指标。 阅读详情

相关推荐

神领物流-day12-分布式日志与链路追踪

GrayLog是一个轻量型的分布式日志管理平台,一个开源的日志聚合、分析、审计、展示和预警工具。在功能上来说,和 ELK类似,但又比 ELK要简单轻量许多。依靠着更加简洁,高效,部署使用简单的优势很快受到许多公司的青睐。其基本框架如图:微服务中的GrayLog客户端发送日志到GrayLog服务端GrayLog把日志信息格式化,存储到Elasticsearch客户端通过浏览器访问GrayLog,GrayLog访问Elasticsearch。

心飞为你飞 912

Dubbo链路追踪——生成全局ID(traceId)

我们一般的做法是在系统调用开始时生成一个traceId , 并且它伴随着一次调用的整个生命周期。我们通过分析源码可以知道客户端在调用服务段进行服务消费时,实际上发送的是封装过的Request实体 ,Data为Invocation实体对象(接口签名,参数类型,参数值,及attachment附件)所以我们需要在调用的起始位置添加traceId信息。关于链路追踪,在微服务的趋势下,一次调用的日志信息分布在不同的机器上或目录下,当需要看一条链路调用所有的日志信息时,这是个比较困难的地方,我们虽然有。...

web15085599741的博客 2776

Java分布式链路追踪实战:原理与Spring Boot集成

分布式系统调试中,链路追踪技术通过构建请求调用图谱解决跨服务问题定位难题。其核心原理基于TraceID全局标识和SpanID节点关系树,通过上下文传递实现调用链可视化。该技术能显著提升运维效率,在电商秒杀、金融交易等场景中,可将故障排查时间从小时级缩短至分钟级。主流的Java实现方案包括Sleuth+Zipkin和SkyWalking,其中Spring Boot项目通过添加sleuth-zipkin依赖即可快速集成。实践中需注意异步调用上下文传递、采样率优化等关键点,结合ELK日志系统还能实现更强大的监控分

weixin_33226548的博客 25

dubbo分布式服务实现日志链路追踪traceid

dubbo服务日志链路追踪

weixin_43965937的博客 2139

分布式链路追踪原理详解及SkyWalking、Zipkin介绍

背景:追踪调用链路,监控链路性能,排查链路故障 随着微服务架构的流行,一次请求往往需要涉及到多个服务,需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。 单体架构中可以使用 AOP 在调用具体的业务逻辑前后分别打印一下时间即可计算出整体的调用时间,使用 AOP 来 catch 住异常也可知道是哪里的调用导致的异常。 基本实现原理 一个完整请求链路的追踪ID(traceid)用于查出本次请求调用的所有服务,每一次服务调用的跨度ID(spanid.

Hello World 1万+

揭秘个人开发者接支付宝的‘野路子’:不用企业资质,用Python模拟扫码转账与回调监听

本文探讨了个人开发者如何通过Python模拟支付宝扫码转账与回调监听的技术实现,解析了支付宝URL协议格式,并设计了本地化的支付状态监听方案。文章强调该方法仅用于技术研究,实际应用需遵守支付宝官方接口和金融合规要求。

weixin_30736301的博客 408

Dubbo如何传递链路追踪id?

分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。链路跟踪主要功能:故障快速定位:可以通过调用链结合业务日志快速定位错误信息。链路性能可视化:各个阶段链路耗时、服务依赖关系可以通过可视化界面展现出来。链路分析:通过分析链路耗时、服务依赖关系可以得到用户的行为路径,汇总分析应用在很多业务场景。dubbo通过spi和Adaptive注解来实现链路追踪id传递。

HBLOG 2384

NVIDIA Jetson AGX Xavier设置风扇转速、工作模式及性能监控

Xavier的风扇在开机之后是默认关闭的,每次重启都需要手动打开风扇,后续可能考虑修改bashrc文件进行自动开启 这个是显示当前风扇的转速,默认应该是0,表示关闭,最大是250 cat /sys/devices/pwm-fan/target_pwm 可以通过修改该文件的值来修改风扇转速 vim /sys/devices/pwm-fan/target_pwm 我一般使用的是100这个值 作者:ryan_ren 链接:https://www.jianshu.com/p/d3c2041f7f7d 来源:简书 著

weixin_43877080的博客 1万+

链路日志traceId

  项目查日志太麻烦,多台机器之间查来查去,还不知道是不是同一个请求的。打印日志时使用 MDC 在日志上添加一个 traceId,使用 traceId 跨系统传递   1 背景 同样是新项目开发的笔记,因为使用的是分布式架构,涉及到各个系统之间的交互       这时候就会遇到一个很常见的问题:   单个系统是集群部署,日志分...

t194978的博客 6438

大模型时代必备技能:3种向量量化技术对比(PQ/AQ/RVQ)与选型指南

本文深入解析了大模型时代处理海量向量数据的关键技术——向量量化。通过对比Product Quantization (PQ)、Additive Quantization (AQ)和Residual Vector Quantization (RVQ)三种主流技术的核心原理、性能表现与适用场景,为工程师提供了从理论到实践的选型指南,旨在解决向量存储与检索的效率瓶颈,助力RAG等大模型应用高效落地。

silver的专栏 798

【STC32G12K128开发板】——搭建开发环境

Keil C251是美国Keil公司(该公司2005年被ARM公司收购)出品的针对251微控制器系列兼容单片机C语言软件开发系统。

qq_36139768的博客 1万+

终极解决:Apache Dubbo分布式链路追踪TraceID缺失问题全解析

Apache Dubbo作为一款高性能、轻量级的分布式服务框架,在微服务架构中被广泛应用。然而在实际开发中,分布式链路追踪的TraceID缺失问题常常困扰开发者,导致问题排查困难。本文将全面解析Dubbo中TraceID缺失的根本原因,并提供一套完整的解决方案,帮助你快速定位和解决分布式调用中的追踪问题。 ## 为什么TraceID对Dubbo分布式调用至关重要? 在分布式系统中,一个用户请求

gitblog_00634的博客 541

FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译

FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译 什么是Firmament? Firmament (FMT) 是一款基于模型设计 (Model-Based-Design, MBD) 的开源自驾仪,可被用来快速构建无人机,无人车,无人船,机器人等平台的控制系统。 系统主要由两部分构成. FMT-Firmware: 一个基于C/C++开发的稳定、高性能的嵌入式系统. FMT-Model: 一个基于MATLAB/Simulink开发的仿真框架以及算法库. 昨天得知FMT开源飞控项目已经开

weixin_45786595的博客 2873

几行代码轻松搞定跨系统传递 traceId

同样是新项目开发的笔记,因为使用的是分布式架构,涉及到各个系统之间的交互 这时候就会遇到一个很常见的问题: 单个系统是集群部署,日志分布在多台服务器上; 多个系统的日志在多台机器,但是一次请求,查日志更是难上加难。 解决方案 使用 SkyWalking traceid 进行链路追踪; 使用 Elastic APM 的 trace.id 进行链路追踪; 自己生成 traceId并put 到 MDC 里面。 2 MDC MDC(Mapp...

地推 1860

gesp c++ 五级知识点

gesp c++ 五级知识点

MMD.然大大 2009

DeepSeek+Dify之一安装部署

DeepSeek添加知识库

yilvyangguang520的博客 1544

SkyWalking:开源分布式链路追踪神器,一文学透

SkyWalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。在 Spring Boot 项目中排查问题时,我们通常需要查看日志。但当请求量较大或者接口调用链路较长时,很难区分日志属于哪一次请求。MDC 是SLF4J提供的 线程级日志上下文存储。它内部通过保存上下文信息。当在某个线程里执行时,traceId 会存入当前线程的 ThreadLocal 中。

秃了也弱了 2138

YOLO26涨点改进 | 全网首发Conv独家改进篇 | CVPR 2025 | YOLO26引入FDConv频率动态卷积改进,含FDC3k2二次创新,小目标检测,能够捕捉更加丰富和复杂的特征信息

本文提出了一种频率动态卷积(FDConv)模块,用于改进YOLO26目标检测模型的性能。FDConv通过在傅里叶域内划分参数预算,构建具有频率多样性的权重,有效提升了模型对低频和高频信息的处理能力。该模块包含内核空间调制(KSM)和频率带调制(FBM)两个关键组件,分别实现空间级和频域级的动态调节。实验表明,FDConv仅增加3.6M参数就能超越其他需要大幅增加参数的方法,并在目标检测、实例分割等任务中表现优异。文章详细介绍了FDConv的原理、实现方法及在YOLO26中的集成方式,提供了完整的代码实现。

Ai缝合怪、助力小伙伴高效发论文 250

apache怎么传递header_几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!...

前言 新项目查日志太麻烦,多台机器之间查来查去,还不知道是不是同一个请求的。打印日志时使用 MDC 在日志上添加一个 traceId,那这个 traceId 如何跨系统传递呢?公众号:liuzhihangs,记录工作学习中的技术、开发及源码笔记;时不时分享一些生活中的见闻感悟。欢迎大佬来指导!背景同样是新项目开发的笔记,因为使用的是分布式架构,涉及到各个系统之间的交互这时候就会遇到一个很常见的问题...

weixin_29418485的博客 778

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

日志链路追踪

在我们的系统中需要记录日志,包括接口、方法的调用用户信息、用时、参数等。分布式环境中通过dubbo调用rpc服务,需要提供全局traceId追踪完整调用链路。

一张小羊毛的博客 4835

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

MateCloud链路追踪:分布式系统调用链追踪实现

MateCloud是一款基于Spring Cloud Alibaba的微服务架构,支持多租户的低代码平台,Saas平台开发套件。在分布式系统中,链路追踪是解决服务间调用问题、排查故障的关键技术。本文将详细介绍MateCloud如何实现分布式系统调用链追踪,帮助开发者快速定位和解决微服务架构中的性能瓶颈和异常问题。 ## 为什么需要链路追踪? 在微服务架构中,一个请求往往需要经过多个服务的协同处

gitblog_00805的博客 322

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SpringBoot自定义链路追踪

SpringBoot自定义链路追踪

今天又是充满希望的一天 463

SkyWalking与Dubbo集成实现分布式链路追踪实战

分布式追踪技术是微服务架构中实现应用性能管理(APM)的核心手段,其核心原理是通过TraceID实现跨进程调用链路的关联。在Java技术栈中,Dubbo作为高性能RPC框架与SkyWalking的深度集成,能够有效解决分布式系统中的调用链监控难题。通过OpenTelemetry规范的Trace模型,结合Dubbo的Attachment机制传递上下文信息,实现了低于37%性能损耗的高效监控方案。该技术特别适用于金融支付、电商等高并发场景,能将平均故障排查时间从小时级缩短至分钟级。关键技术点包括上下文传播(Co

weixin_30889885的博客 386

Dubbo- 微服务全链路追踪:SkyWalking / Pinpoint 与 Dubbo 集成

Dubbo 微服务全链路追踪实践指南 🚀 摘要 本文深入探讨 Dubbo 微服务全链路追踪的完整解决方案,聚焦 SkyWalking 和 Pinpoint 两大主流 APM 工具与 Dubbo 的深度集成。通过剖析 Dubbo 调用链路的核心原理,揭示分布式系统面临的四大观测挑战:调用关系黑盒化、耗时归因失焦、异常传播断裂和 SLA 保障失效。文章提供从零构建追踪系统的完整实践路径,包括: Dubbo 协议栈中 TraceID 的传递机制 SkyWalking/Pinpoint 与 Dubbo Filte

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Spring Cloud Sleuth 分布式链路追踪

Spring Cloud Sleuth 分布式链路追踪

weixin_46619605的博客 2061
上一篇: Dubbo 快速入门使用教程
下一篇: 自定义 springboot 启动器 starter 与自动装配原理
ShareBeHappy_Qin
博客等级 码龄9年 2321粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值