一物一码防伪溯源系统开发全栈源码串联一次扫码的完整链路追踪代码走读

一、把前面所有模块串起来

前面讲了赋码、验真、Redis 码池、区块链、风控、前端。这一篇走读一次扫码的完整链路,看前端到后端到链上如何协作。

二、链路全景

[前端小程序] 扫码 → /verify?code=X
   ↓
[网关] JWT 鉴权 + 限流
   ↓
[验真服务] 查 Redis → 回源 DB(分片)→ 写缓存 → 发 Kafka 事件
   ↓                              ↓
[风控服务] 消费事件 → 规则引擎 → 异地高频? → 封禁
[追溯服务] 消费事件 → 追加履历
[分析服务] 消费事件 → 用户画像
[会员服务] 消费事件 → 积分/留资
   ↓
[区块链] 关键节点哈希上链(出厂/抽检)
   ↓
[前端] 返回验真结果 + 钩子(红包/留资)

三、关键代码走读

前端(Day 47):扫码 → wx.request(/verify) → 成功弹钩子。

验真服务(Day 35)

public VerifyResult verify(String code) {
    String cached = redis.get("verify:" + code);     // 1. 查缓存
    if (cached != null) return parse(cached);
    CodeEntity e = mapper.selectByCode(code);        // 2. 回源分片
    if (e == null) return unknown();
    redis.set("verify:" + code, serialize(e), 10, MIN); // 3. 回填
    kafka.send("scan-event", buildEvent(code, e));    // 4. 异步事件
    return build(e);
}

事件消费(追溯域)

@KafkaListener(topics = "scan-event")
public void onScan(ScanEvent e) {
    traceService.append(e.getCode(),            // 追加履历
        new TraceEvent(e.getCode(), "SCAN", e.getScanGeo(), now()));
    riskService.check(e);                        // 风控检查
    memberService.accrue(e.getMemberId());       // 积分
}

区块链(Day 41):仅关键节点(出厂/抽检)调用 contract.anchor(hash)

四、全链路追踪(排查问题)

// 每个请求带 traceId,跨服务传递
String traceId = MDC.get("traceId");
// SkyWalking 自动串联:前端 → 网关 → 验真 → Kafka → 各域

解读:用 SkyWalking + traceId,一次扫码的全链路耗时、各域状态一目了然,是 Day 7 故障排查的利器。

五、小结

一次扫码,背后是6 个域通过 Kafka 协作。解耦带来可扩展,事件驱动带来实时性。这就是 Day 6 领域驱动设计的威力。

posted on 2026-08-25 16:46  程序员李铁牛  阅读(20)  评论(0)    收藏  举报