文章目录
  1. 1. 引入依赖
  2. 2. 服务消费者逻辑
    1. 2.1. 消费者业务逻辑
    2. 2.2. 消费者调用服务代码
  3. 3. 服务提供方逻辑
    1. 3.1. 服务提供方代码逻辑
  4. 4. 测试TraceId传递
    1. 4.1. 服务消费方日志打印
    2. 4.2. 服务提供方日志打印
  5. 5. 总结

在上文 文章链接 中,我从原理及代码实现的角度,完整的呈现了如何基于Dubbo的Filter及SPI机制开发TraceId的开发包。

本文中,我将着重从实战角度展现如何在项目中使用该工具包,实现TraceId的传递及日志打印。

引入依赖

将开发好的工具包(名为shield-dubbo-tracer,代码地址)打包并上传至私服,添加坐标到我们的dubbo项目的pom.xml中。注意,由于工具包依赖dubbo,因此同时要添加dubbo的依赖,完整的依赖如下:(服务提供方和服务消费方中都需要添加)

<!--dubbo traceId工具-->
<dependency>
    <groupId>com.snowalker.shield.dubbo.tracer</groupId>
    <artifactId>shield-dubbo-tracer</artifactId>
    <version>0.1.0</version>
</dependency>
<!-- dubbo依赖开始 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.5</version>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>${zookeeper.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>${curator-framework.version}</version>
</dependency>
<!-- dubbo依赖结束 -->

引入依赖即可,不需要额外的多余配置。

接下来就是在服务提供方和消费方之间进行服务调用,验证功能。

dubbo相关的配置请参考如下文章,本文不再赘述

[dubbo]springboot2.x整合dubbo之使用dubbo-spring-boot-starter

[dubbo]springboot2.x整合dubbo之基于xml整合dubbo2.6.5

服务消费者逻辑

消费者业务逻辑

@Service
public class ChargeWalletConsumerService {

    /**dubbo服务接口*/
    @Autowired
    ChargeWalletFacade chargeWalletFacade;

    public void chargeWallet(ChargeWalletRequestData requestData) {
        TraceIdGenerator.createTraceId();
        String traceId = TraceIdUtil.getTraceId();
        System.out.println("[服务消费方]执行业务逻辑开始,traceId=" + traceId);
        chargeWalletFacade.chargeWallet(requestData);
    }

}

逻辑很简单,在服务消费者侧,更准确的说是服务调用发起侧,需要显式调用TraceId的生成方法,

TraceIdGenerator.createTraceId();

如果不调用,工具包会默认分配一个,但是在调用开始时候就获取不到了,因此从开发方便的角度,建议还是要显式的调用一次。

消费者调用服务代码

ApplicationContext context = SpringApplication.run(OrderApplication.class, args);
ChargeWalletConsumerService chargeWalletConsumerService =
        context.getBean("chargeWalletConsumerService", ChargeWalletConsumerService.class);
chargeWalletConsumerService.chargeWallet(new ChargeWalletRequestData());

逻辑很简单,从上下文中取到ChargeWalletConsumerService对应的bean,并调用业务方法,从而发起对远程服务的调用。

服务提供方逻辑

接着是服务提供方,引入配置后也不需要额外的配置。

服务提供方代码逻辑

public class ChargeWalletFacadeImpl implements ChargeWalletFacade {

    @Resource(name = "walletService")
    WalletService walletService;

    @Override
    public ResponseData<ChargeWalletRepsonseData> chargeWallet(ChargeWalletRequestData requestData) {
        String traceId = TraceIdUtil.getTraceId();
        System.out.println("[服务提供方]测试服务提供方,traceId=" + traceId);
        return null;
    }
}

读者这里可能会有疑问,这个服务实现类没有添加任何注解啊?

不要紧张,我这里用的是xml的配置方式,该服务实现类已经在applicationContext-dubbo-service.xml中配置好了,核心配置如下:

<dubbo:service interface="com.gaoyang.marketing.dev.prototype.dubbo.api.ChargeWalletFacade"
               ref="chargeWalletFacadeImpl"
               version="1.0" group="wallet"
               timeout="3000" owner="snowalker" />

在20880端口暴露该服务。

到这里我们的测试代码就开发完成。

测试TraceId传递

  1. 首先启动服务提供方
  2. 启动服务消费方,main方法中发起对提供方的调用
  3. 观察提供方及消费方的控制台打印情况。

服务消费方日志打印

[服务消费方]执行业务逻辑开始,traceId=ac1e535620190221091119953783494f

服务提供方日志打印

[服务提供方]测试服务提供方,traceId=ac1e535620190221091119953783494f

可以看到,traceId已经从消费方传递至提供方,并能够灵活的取出做日志打印。

dubbo服务之间通过RpcContext隐式传参,在服务线程内通过TraceUtil上下文直接获取。

总结

到这里,我们就完成了集成TraceId工具包shield-dubbo-tracer的整合及测试工作,可以看到,整合过程是蛮简洁的,调用过程也是比较直观的,希望该工具包能够对大家做TraceId日志监控、链路追踪等工作有所帮助吧。

文章目录
  1. 1. 引入依赖
  2. 2. 服务消费者逻辑
    1. 2.1. 消费者业务逻辑
    2. 2.2. 消费者调用服务代码
  3. 3. 服务提供方逻辑
    1. 3.1. 服务提供方代码逻辑
  4. 4. 测试TraceId传递
    1. 4.1. 服务消费方日志打印
    2. 4.2. 服务提供方日志打印
  5. 5. 总结
Fork me on GitHub