随着业务越来越复杂,系统也随之进行各种拆分,特别是随着微服务架构和容器技术的兴起,看似简单的一个应用,后台可能有几十个甚至几百个服务在支撑;一个前端的请求可能需要多次的服务调用最后才能完成;当请求变慢或者不可用时,我们无法得知是哪个后台服务引起的,这时就需要解决如何快速定位服务故障点,今天介绍的分布式服务链路追踪就能很好的解决这样的问题。
它可以做什么呢?
- 用户行为链路:如浏览页面,观看视频,购买商品,收藏,评论等等行为。
- 服务链路追踪:快速定位异常
- 大数据AI画像:一个链路非业务的动态行为数据,才是最贴近用户的素材
服务链路追踪的基本出发点——记录足迹
- (1)入口处生成链路标识traceId
- (2)传递traceId参数给下层业务方法
- (3)各方法内部记录访问的信息
但是这种方式,违背了我们面向对象原则:高内聚、低耦合。严重的和业务代码耦合在一起。链路追踪不能成为我们的主流业务方法,增值性的服务不能影响我们的主流业务(异常、耗时)
单系统链路追踪-优化方案
我们可以采用ThreadLocal变量来存储traceId(关于threadLocal使用自行百度),traceId就可以在当前线程的范围内访问。
/**
* @desc
* @author lizehao
* @company 连连支付
* @date 2018年12月30日上午10:40:49
*/
public class TraceDataHolder {
private static ThreadLocal<String> instanceHolder = new ThreadLocal<String>();
public static void setTraceId() {
String traceId = instanceHolder.get();
if (StringUtils.isEmpty(traceId)) {
traceId = UUID.randomUUID().toString();
instanceHolder.set(traceId