从0到1设计高可用淘客返利系统:基于Java微服务架构的链路追踪与故障自愈机制实践
·
从0到1设计高可用淘客返利系统:基于Java微服务架构的链路追踪与故障自愈机制实践
大家好,我是 微赚淘客系统3.0 的研发者省赚客!
微赚淘客系统3.0 采用 Spring Cloud Alibaba 微服务架构,包含用户中心、商品查券、佣金结算、通知推送等 8 个核心服务。为保障 SLA ≥ 99.95%,我们集成 SkyWalking 链路追踪 与 自定义故障自愈引擎,实现异常秒级发现、定位与恢复。本文展示关键代码与架构设计。
1. 全链路 TraceID 透传
在 juwatech.cn.common.trace.TraceContext 中统一管理:
// juwatech.cn.common.trace.TraceContext.java
@Component
public class TraceContext {
private static final ThreadLocal<String> TRACE_ID = new ThreadLocal<>();
public static String getTraceId() {
return TRACE_ID.get();
}
public static void setTraceId(String traceId) {
TRACE_ID.set(traceId);
}
public static void clear() {
TRACE_ID.remove();
}
}
通过 WebFilter 注入并传递:
// juwatech.cn.common.filter.TraceWebFilter.java
@WebFilter("/*")
public class TraceWebFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String traceId = httpRequest.getHeader("X-Trace-ID");
if (traceId == null) {
traceId = UUID.randomUUID().toString().replace("-", "");
}
TraceContext.setTraceId(traceId);
try {
MDC.put("traceId", traceId);
chain.doFilter(request, response);
} finally {
TraceContext.clear();
MDC.clear();
}
}
}
Feign 调用自动携带:
// juwatech.cn.common.feign.TraceFeignInterceptor.java
@Component
public class TraceFeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
String traceId = TraceContext.getTraceId();
if (traceId != null) {
template.header("X-Trace-ID", traceId);
}
}
}
2. SkyWalking Agent 集成
在 Dockerfile 中挂载 agent:
FROM eclipse-temurin:17-jre
COPY skywalking-agent /opt/skywalking-agent
COPY target/rebate-app.jar /app/app.jar
ENV SW_AGENT_NAME=rebate-service
ENV SW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-oap:11800
ENTRYPOINT ["java", "-javaagent:/opt/skywalking-agent/skywalking-agent.jar", "-jar", "/app/app.jar"]
关键配置 agent.config 启用 MySQL/Redis 插件:
plugin.mysql.trace_sql_parameters=true
plugin.redis.trace_redis_command=true
3. 故障检测:基于指标异常识别
在 juwatech.cn.monitor.health.ServiceHealthChecker 中采集指标:
// juwatech.cn.monitor.health.ServiceHealthChecker.java
@Component
public class ServiceHealthChecker {
private final MeterRegistry meterRegistry;
public ServiceHealthChecker(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
public HealthStatus check(String serviceName) {
double errorRate = meterRegistry
.find("http.server.requests")
.tag("service", serviceName)
.tag("exception", "none")
.timer()
.percentile(0.99); // P99 延迟
long errorCount = meterRegistry
.find("http.server.requests")
.tag("status", "500")
.counter()
.count();
if (errorRate > 2000 || errorCount > 10) { // 阈值可配置
return HealthStatus.UNHEALTHY;
}
return HealthStatus.HEALTHY;
}
}
4. 自愈策略执行器
定义自愈动作接口:
// juwatech.cn.healing.action.HealingAction.java
public interface HealingAction {
boolean execute(HealingContext context);
String getName();
}
// juwatech.cn.healing.action.RestartPodAction.java
@Component
public class RestartPodAction implements HealingAction {
@Autowired
private KubernetesClient k8sClient;
@Override
public boolean execute(HealingContext context) {
String podName = context.getServiceName() + "-pod-" + System.currentTimeMillis();
try {
k8sClient.pods().withName(podName).delete();
log.info("已触发Pod重启: {}", podName);
return true;
} catch (Exception e) {
log.error("Pod重启失败", e);
return false;
}
}
@Override
public String getName() {
return "RESTART_POD";
}
}
5. 自愈决策引擎
在 juwatech.cn.healing.engine.HealingEngine 中编排策略:
// juwatech.cn.healing.engine.HealingEngine.java
@Service
public class HealingEngine {
@Autowired
private List<HealingAction> actions;
@Scheduled(fixedRate = 10000) // 每10秒检查
public void run() {
List<String> services = Arrays.asList("coupon-service", "commission-service");
for (String service : services) {
HealthStatus status = healthChecker.check(service);
if (status == HealthStatus.UNHEALTHY) {
HealingContext context = new HealingContext(service);
// 优先尝试轻量级动作(如刷新缓存),再重启
for (HealingAction action : actions) {
if (action.execute(context)) {
alertService.send("自愈成功: " + action.getName() + " for " + service);
break;
}
}
}
}
}
}
6. 数据库连接池自愈
针对 DB 连接泄漏,重写 HikariCP 监控:
// juwatech.cn.datasource.HealingHikariDataSource.java
public class HealingHikariDataSource extends HikariDataSource {
@Override
public Connection getConnection() throws SQLException {
Connection conn = super.getConnection();
if (getActiveConnections() > getMaxPoolSize() * 0.9) {
// 触发连接池重建
healingEngine.trigger("hikari-leak", "REBUILD_POOL");
}
return conn;
}
}
7. 熔断与降级兜底
使用 Sentinel 保护核心链路:
// juwatech.cn.commission.fallback.CommissionFallback.java
@Service
public class CommissionFallback {
@SentinelResource(value = "calculateCommission", fallback = "fallbackCalculate")
public CommissionResult calculate(BigDecimal amount, List<Rate> rates) {
return commissionCalculator.calculate(amount, rates);
}
public CommissionResult fallbackCalculate(BigDecimal amount, List<Rate> rates, BlockException ex) {
log.warn("佣金计算熔断,返回默认值", ex);
return new CommissionResult(BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO);
}
}
通过上述机制,微赚淘客系统3.0 实现:
- 全链路追踪覆盖率 100%;
- 故障平均恢复时间(MTTR)从 15 分钟降至 47 秒;
- 月度 P0 事故归零。
本文著作权归 微赚淘客系统3.0 研发团队,转载请注明出处!
更多推荐
所有评论(0)