自己写dubbo链路追踪工具包-实现dubbo调用中传递打印TraceId[实战整合篇]
在上文 文章链接 中,我从原理及代码实现的角度,完整的呈现了如何基于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传递
- 首先启动服务提供方
- 启动服务消费方,main方法中发起对提供方的调用
- 观察提供方及消费方的控制台打印情况。
服务消费方日志打印
[服务消费方]执行业务逻辑开始,traceId=ac1e535620190221091119953783494f
服务提供方日志打印
[服务提供方]测试服务提供方,traceId=ac1e535620190221091119953783494f
可以看到,traceId已经从消费方传递至提供方,并能够灵活的取出做日志打印。
dubbo服务之间通过RpcContext隐式传参,在服务线程内通过TraceUtil上下文直接获取。
总结
到这里,我们就完成了集成TraceId工具包shield-dubbo-tracer的整合及测试工作,可以看到,整合过程是蛮简洁的,调用过程也是比较直观的,希望该工具包能够对大家做TraceId日志监控、链路追踪等工作有所帮助吧。