分布式系统架构设计核心原则:从CAP理论到微服务拆分策略的实战应用指南

Nina190
Nina190 2026-01-20T09:07:30+08:00
0 0 1

引言

在当今数字化时代,分布式系统已成为现代应用架构的核心组成部分。无论是大型互联网平台还是企业级应用系统,都需要面对分布式环境下的复杂性挑战。从单体应用向分布式架构演进的过程中,开发者和架构师需要深入理解分布式系统的本质特性,并掌握相应的设计原则和实践方法。

本文将深入探讨分布式系统架构设计的核心理论和实践方法,重点解析CAP理论、BASE理论在实际项目中的应用,提供微服务拆分、数据一致性保障、容错机制设计等关键架构决策指导。通过理论结合实践的方式,帮助读者构建完整的分布式系统架构设计知识体系。

一、分布式系统的本质与挑战

1.1 分布式系统的定义与特征

分布式系统是由多个相互连接的计算节点组成的系统,这些节点通过网络进行通信和协调,共同完成特定的任务。分布式系统的核心特征包括:

  • 透明性:用户感知不到系统的分布特性
  • 可扩展性:能够通过增加节点来提升系统性能
  • 容错性:单个节点故障不影响整体系统运行
  • 并发性:多个操作可以同时进行

1.2 分布式系统面临的主要挑战

分布式系统设计面临的核心挑战包括:

  1. 网络通信复杂性:节点间通信可能失败、延迟不确定
  2. 数据一致性:如何在分布式环境下保证数据的一致性
  3. 容错与可靠性:处理节点故障和网络分区问题
  4. 性能与可扩展性:在并发访问下保持系统响应能力
  5. 系统复杂性管理:随着规模增长,系统维护难度急剧增加

二、CAP理论深度解析

2.1 CAP理论的基本概念

CAP理论是分布式系统设计的基础理论,由计算机科学家Eric Brewer在2000年提出。该理论指出,在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)这三个特性最多只能同时满足其中两个。

graph TD
    A[一致性] --> B[可用性]
    A --> C[分区容错性]
    B --> C

2.2 三者关系的详细分析

一致性(Consistency)

一致性要求所有节点在同一时间看到相同的数据。在分布式系统中,这意味着当一个写操作完成时,所有后续读操作都应该返回最新的值。

// 一致性保证示例
public class ConsistentStorage {
    private Map<String, String> dataStore = new ConcurrentHashMap<>();
    
    // 强一致性写操作
    public void write(String key, String value) {
        // 写入主节点
        dataStore.put(key, value);
        // 同步复制到所有副本节点
        replicateToAllReplicas(key, value);
    }
    
    public String read(String key) {
        // 从主节点读取最新数据
        return dataStore.get(key);
    }
}

可用性(Availability)

可用性指系统在面对故障时仍能正常响应用户请求。即使部分节点失效,系统仍应能够处理用户的操作。

// 可用性保证示例
public class AvailableStorage {
    private Map<String, String> primaryStore = new ConcurrentHashMap<>();
    private Map<String, String> backupStore = new ConcurrentHashMap<>();
    
    public String read(String key) {
        // 优先从主节点读取,如果失败则从备份读取
        String value = primaryStore.get(key);
        if (value == null) {
            value = backupStore.get(key);
        }
        return value;
    }
    
    public void write(String key, String value) {
        // 写入主节点和备份节点
        primaryStore.put(key, value);
        backupStore.put(key, value);
    }
}

分区容错性(Partition Tolerance)

分区容错性是指当网络出现故障时,系统仍能继续运行。在分布式系统中,网络分区是不可避免的,因此必须保证系统的分区容错能力。

2.3 CAP理论的实际应用策略

在实际项目中,我们需要根据业务需求选择合适的CAP组合:

// CAP组合选择示例
public enum CAPChoice {
    CP, // 一致性 + 分区容错性(牺牲可用性)
    AP, // 可用性 + 分区容错性(牺牲一致性)
    CA  // 一致性 + 可用性(不支持分布式)
}

public class CAPStrategy {
    private CAPChoice strategy;
    
    public CAPStrategy(CAPChoice choice) {
        this.strategy = choice;
    }
    
    public void handleWrite(String key, String value) {
        switch (strategy) {
            case CP:
                // 强一致性写入,需要等待所有节点确认
                strongConsistencyWrite(key, value);
                break;
            case AP:
                // 最终一致性写入,立即返回
                eventualConsistencyWrite(key, value);
                break;
        }
    }
}

三、BASE理论与最终一致性

3.1 BASE理论的核心概念

BASE(Basically Available, Soft state, Eventually consistent)理论是对CAP理论的补充和扩展。它提出在分布式系统中,可以接受一定程度的不一致,但需要保证系统的可用性和最终一致性。

3.2 BASE理论的三个要素

基本可用(Basically Available)

系统在面对故障时能够继续提供服务,即使不是完全的、完美的服务。

软状态(Soft state)

系统中的数据状态可以随时间变化,不需要保持绝对的一致性。

最终一致性(Eventually consistent)

经过一段时间后,所有节点的数据最终会达到一致状态。

3.3 实际应用案例

// 最终一致性实现示例
public class EventuallyConsistentStore {
    private Map<String, String> localCache = new ConcurrentHashMap<>();
    private Queue<WriteOperation> pendingOperations = new ConcurrentLinkedQueue<>();
    
    // 异步写入操作
    public void asyncWrite(String key, String value) {
        localCache.put(key, value);
        
        // 将写操作加入队列,异步处理
        WriteOperation operation = new WriteOperation(key, value);
        pendingOperations.offer(operation);
        
        // 启动异步处理线程
        CompletableFuture.runAsync(() -> processPendingOperations());
    }
    
    private void processPendingOperations() {
        while (!pendingOperations.isEmpty()) {
            WriteOperation operation = pendingOperations.poll();
            if (operation != null) {
                // 实际写入到分布式存储
                writeToDistributedStore(operation.key, operation.value);
                // 更新本地缓存
                localCache.put(operation.key, operation.value);
            }
        }
    }
    
    private static class WriteOperation {
        String key;
        String value;
        
        WriteOperation(String key, String value) {
            this.key = key;
            this.value = value;
        }
    }
}

四、微服务拆分策略与架构设计

4.1 微服务拆分原则

业务边界清晰

微服务应该按照业务领域进行拆分,每个服务负责特定的业务功能。

// 微服务拆分示例
@Service
public class UserService {
    // 用户管理相关功能
    public User createUser(User user) {
        // 用户创建逻辑
        return userRepository.save(user);
    }
    
    public User getUserById(Long id) {
        // 用户查询逻辑
        return userRepository.findById(id);
    }
}

@Service
public class OrderService {
    // 订单管理相关功能
    public Order createOrder(Order order) {
        // 订单创建逻辑
        return orderRepository.save(order);
    }
    
    public List<Order> getOrdersByUserId(Long userId) {
        // 订单查询逻辑
        return orderRepository.findByUserId(userId);
    }
}

单一职责原则

每个微服务应该只有一个改变的理由,专注于特定的业务功能。

数据隔离

每个服务拥有独立的数据存储,避免直接访问其他服务的数据。

4.2 微服务拆分策略

基于领域驱动设计(DDD)

// DDD风格的微服务拆分
public class ECommerceDomain {
    // 订单服务
    @Service
    public class OrderService {
        private OrderRepository orderRepository;
        private PaymentService paymentService;
        
        public Order createOrder(OrderRequest request) {
            // 创建订单逻辑
            Order order = new Order();
            order.setUserId(request.getUserId());
            order.setProducts(request.getProducts());
            order.setTotalAmount(calculateTotal(request.getProducts()));
            
            Order savedOrder = orderRepository.save(order);
            
            // 调用支付服务处理支付
            paymentService.processPayment(savedOrder.getId(), savedOrder.getTotalAmount());
            
            return savedOrder;
        }
    }
    
    // 支付服务
    @Service
    public class PaymentService {
        private PaymentRepository paymentRepository;
        private NotificationService notificationService;
        
        public void processPayment(Long orderId, BigDecimal amount) {
            // 处理支付逻辑
            Payment payment = new Payment();
            payment.setOrderId(orderId);
            payment.setAmount(amount);
            payment.setStatus(PaymentStatus.PENDING);
            
            Payment savedPayment = paymentRepository.save(payment);
            
            // 异步处理支付结果
            CompletableFuture.runAsync(() -> {
                boolean success = executePaymentGateway(payment);
                if (success) {
                    updatePaymentStatus(savedPayment.getId(), PaymentStatus.SUCCESS);
                    notificationService.sendSuccessNotification(orderId);
                } else {
                    updatePaymentStatus(savedPayment.getId(), PaymentStatus.FAILED);
                    notificationService.sendFailureNotification(orderId);
                }
            });
        }
    }
}

基于业务流程拆分

// 业务流程视角的微服务拆分
public class BusinessProcessArchitecture {
    // 用户注册流程
    @Service
    public class RegistrationService {
        private UserRepository userRepository;
        private EmailService emailService;
        private NotificationService notificationService;
        
        public User registerUser(UserRegistrationRequest request) {
            // 1. 验证用户信息
            validateUser(request);
            
            // 2. 创建用户账户
            User user = createUser(request);
            
            // 3. 发送验证邮件
            emailService.sendVerificationEmail(user.getEmail());
            
            // 4. 发送欢迎通知
            notificationService.sendWelcomeNotification(user.getId());
            
            return user;
        }
    }
    
    // 订单处理流程
    @Service
    public class OrderProcessingService {
        private OrderRepository orderRepository;
        private InventoryService inventoryService;
        private ShippingService shippingService;
        
        public void processOrder(Long orderId) {
            // 1. 获取订单信息
            Order order = orderRepository.findById(orderId);
            
            // 2. 检查库存
            if (!inventoryService.checkInventory(order.getProducts())) {
                throw new InsufficientStockException("库存不足");
            }
            
            // 3. 扣减库存
            inventoryService.deductInventory(order.getProducts());
            
            // 4. 创建发货单
            ShippingInfo shipping = shippingService.createShipping(order);
            
            // 5. 更新订单状态
            order.setStatus(OrderStatus.PROCESSING);
            order.setShippingInfo(shipping);
            orderRepository.save(order);
        }
    }
}

五、数据一致性保障机制

5.1 分布式事务处理

两阶段提交(2PC)

// 两阶段提交实现示例
public class TwoPhaseCommit {
    private List<Participant> participants;
    
    public void commitTransaction(List<TransactionRequest> requests) {
        try {
            // 第一阶段:准备阶段
            boolean allPrepared = preparePhase(requests);
            if (!allPrepared) {
                rollbackPhase();
                throw new TransactionException("事务准备失败");
            }
            
            // 第二阶段:提交阶段
            commitPhase(requests);
            
        } catch (Exception e) {
            rollbackPhase();
            throw new TransactionException("事务提交失败", e);
        }
    }
    
    private boolean preparePhase(List<TransactionRequest> requests) {
        List<CompletableFuture<Boolean>> futures = new ArrayList<>();
        
        for (TransactionRequest request : requests) {
            CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(() -> {
                try {
                    return prepare(request);
                } catch (Exception e) {
                    return false;
                }
            });
            futures.add(future);
        }
        
        // 等待所有参与者准备完成
        return futures.stream()
                     .map(CompletableFuture::join)
                     .allMatch(Boolean.TRUE::equals);
    }
    
    private void commitPhase(List<TransactionRequest> requests) {
        List<CompletableFuture<Void>> futures = new ArrayList<>();
        
        for (TransactionRequest request : requests) {
            CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
                try {
                    commit(request);
                } catch (Exception e) {
                    throw new RuntimeException("提交失败", e);
                }
            });
            futures.add(future);
        }
        
        // 等待所有参与者提交完成
        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
    }
    
    private void rollbackPhase() {
        // 回滚操作实现
        System.out.println("执行事务回滚");
    }
}

三阶段提交(3PC)

// 三阶段提交实现示例
public class ThreePhaseCommit {
    private List<Participant> participants;
    
    public void commitTransaction(List<TransactionRequest> requests) {
        try {
            // 第一阶段:预提交阶段
            boolean allPrepared = preparePhase(requests);
            if (!allPrepared) {
                rollbackPhase();
                throw new TransactionException("事务准备失败");
            }
            
            // 第二阶段:预提交确认阶段
            boolean allCommitted = commitConfirmPhase(requests);
            if (!allCommitted) {
                rollbackPhase();
                throw new TransactionException("事务确认失败");
            }
            
            // 第三阶段:提交阶段
            commitPhase(requests);
            
        } catch (Exception e) {
            rollbackPhase();
            throw new TransactionException("事务提交失败", e);
        }
    }
    
    private boolean preparePhase(List<TransactionRequest> requests) {
        // 预提交逻辑实现
        return true;
    }
    
    private boolean commitConfirmPhase(List<TransactionRequest> requests) {
        // 提交确认逻辑实现
        return true;
    }
    
    private void commitPhase(List<TransactionRequest> requests) {
        // 最终提交逻辑实现
    }
    
    private void rollbackPhase() {
        // 回滚操作实现
        System.out.println("执行事务回滚");
    }
}

5.2 最终一致性方案

消息队列保证最终一致性

// 基于消息队列的最终一致性实现
@Component
public class EventDrivenConsistency {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    @Autowired
    private OrderRepository orderRepository;
    
    @Autowired
    private InventoryRepository inventoryRepository;
    
    // 订单创建事件
    public void createOrder(Order order) {
        try {
            // 1. 创建订单
            Order savedOrder = orderRepository.save(order);
            
            // 2. 发送订单创建事件到消息队列
            OrderCreatedEvent event = new OrderCreatedEvent();
            event.setOrderId(savedOrder.getId());
            event.setUserId(savedOrder.getUserId());
            event.setProducts(savedOrder.getProducts());
            event.setTotalAmount(savedOrder.getTotalAmount());
            
            rabbitTemplate.convertAndSend("order.created", event);
            
        } catch (Exception e) {
            // 记录日志并重试
            log.error("订单创建失败", e);
            throw new OrderCreationException("订单创建失败", e);
        }
    }
    
    // 订单创建事件处理
    @RabbitListener(queues = "order.created")
    public void handleOrderCreated(OrderCreatedEvent event) {
        try {
            // 1. 更新库存
            updateInventory(event.getProducts());
            
            // 2. 发送支付通知
            PaymentNotification notification = new PaymentNotification();
            notification.setOrderId(event.getOrderId());
            notification.setAmount(event.getTotalAmount());
            
            rabbitTemplate.convertAndSend("payment.notification", notification);
            
        } catch (Exception e) {
            // 重试机制或死信队列处理
            log.error("订单创建事件处理失败", e);
            throw new EventProcessingException("事件处理失败", e);
        }
    }
    
    private void updateInventory(List<Product> products) {
        for (Product product : products) {
            Inventory inventory = inventoryRepository.findByProductId(product.getId());
            if (inventory.getStock() >= product.getQuantity()) {
                inventory.setStock(inventory.getStock() - product.getQuantity());
                inventoryRepository.save(inventory);
            } else {
                throw new InsufficientStockException("库存不足");
            }
        }
    }
}

事件溯源与CQRS模式

// 事件溯源实现示例
public class EventSourcingExample {
    // 事件存储
    private List<Event> eventStore = new ArrayList<>();
    
    // 聚合根
    public class OrderAggregate {
        private Long orderId;
        private OrderStatus status;
        private List<OrderItem> items;
        
        public void applyEvent(Event event) {
            switch (event.getType()) {
                case ORDER_CREATED:
                    OrderCreatedEvent createdEvent = (OrderCreatedEvent) event;
                    this.orderId = createdEvent.getOrderId();
                    this.status = OrderStatus.CREATED;
                    this.items = createdEvent.getItems();
                    break;
                    
                case ORDER_PAID:
                    OrderPaidEvent paidEvent = (OrderPaidEvent) event;
                    this.status = OrderStatus.PAID;
                    break;
                    
                case ORDER_SHIPPED:
                    OrderShippedEvent shippedEvent = (OrderShippedEvent) event;
                    this.status = OrderStatus.SHIPPED;
                    break;
            }
        }
        
        public void loadFromEvents(List<Event> events) {
            for (Event event : events) {
                applyEvent(event);
            }
        }
    }
    
    // 事件存储服务
    @Service
    public class EventStoreService {
        private Map<Long, List<Event>> eventBuckets = new ConcurrentHashMap<>();
        
        public void saveEvents(Long aggregateId, List<Event> events) {
            eventBuckets.computeIfAbsent(aggregateId, k -> new ArrayList<>())
                       .addAll(events);
            
            // 持久化到数据库
            eventRepository.saveAll(events);
        }
        
        public List<Event> getEvents(Long aggregateId) {
            return eventBuckets.getOrDefault(aggregateId, new ArrayList<>());
        }
    }
}

六、容错机制设计与高可用保障

6.1 熔断器模式

// 熔断器实现示例
public class CircuitBreaker {
    private enum State {
        CLOSED, // 关闭状态 - 正常运行
        OPEN,   // 开启状态 - 熔断,拒绝所有请求
        HALF_OPEN // 半开启状态 - 允许部分请求测试恢复
    }
    
    private volatile State state = State.CLOSED;
    private int failureCount = 0;
    private long lastFailureTime = 0;
    private final int failureThreshold;
    private final long timeout;
    private final long resetTimeout;
    
    public CircuitBreaker(int failureThreshold, long timeout, long resetTimeout) {
        this.failureThreshold = failureThreshold;
        this.timeout = timeout;
        this.resetTimeout = resetTimeout;
    }
    
    public <T> T execute(Supplier<T> command) throws Exception {
        switch (state) {
            case CLOSED:
                return executeWithCircuitOpen(command);
                
            case OPEN:
                if (shouldReset()) {
                    state = State.HALF_OPEN;
                    return executeWithCircuitHalfOpen(command);
                } else {
                    throw new CircuitBreakerOpenException("熔断器开启,拒绝请求");
                }
                
            case HALF_OPEN:
                return executeWithCircuitHalfOpen(command);
                
            default:
                throw new IllegalStateException("未知状态");
        }
    }
    
    private <T> T executeWithCircuitOpen(Supplier<T> command) throws Exception {
        try {
            T result = command.get();
            onSuccessfulCall();
            return result;
        } catch (Exception e) {
            onFailure();
            throw e;
        }
    }
    
    private <T> T executeWithCircuitHalfOpen(Supplier<T> command) throws Exception {
        try {
            T result = command.get();
            onSuccessfulCall();
            state = State.CLOSED; // 恢复到关闭状态
            return result;
        } catch (Exception e) {
            onFailure();
            state = State.OPEN; // 重新开启熔断器
            throw e;
        }
    }
    
    private void onSuccessfulCall() {
        failureCount = 0;
        lastFailureTime = 0;
    }
    
    private void onFailure() {
        failureCount++;
        lastFailureTime = System.currentTimeMillis();
        
        if (failureCount >= failureThreshold) {
            state = State.OPEN;
        }
    }
    
    private boolean shouldReset() {
        return System.currentTimeMillis() - lastFailureTime > resetTimeout;
    }
}

// 使用示例
@Service
public class OrderService {
    private CircuitBreaker circuitBreaker = new CircuitBreaker(5, 10000, 30000);
    
    public Order createOrder(OrderRequest request) throws Exception {
        return circuitBreaker.execute(() -> {
            // 实际的订单创建逻辑
            return orderRepository.save(request.toOrder());
        });
    }
}

6.2 降级策略

// 服务降级实现示例
@Component
public class ServiceFallback {
    
    @Autowired
    private InventoryService inventoryService;
    
    @Autowired
    private NotificationService notificationService;
    
    // 降级方法 - 当库存服务不可用时使用
    public List<Product> getProductsFallback() {
        // 返回默认产品列表或缓存数据
        return getDefaultProducts();
    }
    
    // 降级方法 - 当通知服务不可用时使用
    public void sendNotificationFallback(String userId, String message) {
        // 记录日志,不抛出异常
        log.warn("通知服务降级,用户 {} 的消息 {} 未发送", userId, message);
    }
    
    // 使用Hystrix注解进行降级处理
    @HystrixCommand(
        fallbackMethod = "getProductsFallback",
        commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")
        }
    )
    public List<Product> getProducts() {
        return inventoryService.getAvailableProducts();
    }
    
    // 优雅降级策略
    @Async
    public void processOrderWithFallback(Order order) {
        try {
            // 尝试正常处理订单
            orderProcessor.process(order);
        } catch (Exception e) {
            log.warn("订单处理失败,执行降级策略", e);
            
            // 降级处理:记录日志并发送通知
            logOrderFailure(order, e);
            sendFallbackNotification(order.getUserId(), "订单处理失败,请稍后重试");
            
            // 将订单放入重试队列
            retryQueue.add(order);
        }
    }
}

6.3 负载均衡与容错

// 负载均衡器实现示例
@Component
public class LoadBalancer {
    
    private final List<Server> servers;
    private final AtomicInteger counter = new AtomicInteger(0);
    
    public LoadBalancer(List<Server> servers) {
        this.servers = servers;
    }
    
    // 轮询负载均衡算法
    public Server getNextServer() {
        int index = counter.getAndIncrement() % servers.size();
        return servers.get(index);
    }
    
    // 基于权重的负载均衡
    public Server getWeightedNextServer() {
        // 计算所有服务器的权重总和
        int totalWeight = servers.stream()
                                .mapToInt(Server::getWeight)
                                .sum();
        
        // 生成随机数
        int randomWeight = new Random().nextInt(totalWeight);
        
        // 找到对应的服务器
        int currentWeight = 0;
        for (Server server : servers) {
            currentWeight += server.getWeight();
            if (randomWeight < currentWeight) {
                return server;
            }
        }
        
        return servers.get(0); // 默认返回第一个服务器
    }
    
    // 健康检查机制
    @Scheduled(fixedRate = 30000) // 每30秒检查一次
    public void healthCheck() {
        servers.forEach(server -> {
            try {
                boolean healthy = checkServerHealth(server);
                server.setHealthy(healthy);
                
                if (!healthy) {
                    log.warn("服务器 {} 不可用", server.getAddress());
                }
            } catch (Exception e) {
                server.setHealthy(false);
                log.error("健康检查失败: {}", server.getAddress(), e);
            }
        });
    }
    
    private boolean checkServerHealth(Server server) {
        // 实现具体的健康检查逻辑
        return true;
    }
}

// 服务发现与注册
@Service
public class ServiceDiscovery {
    
    private final Map<String, List<Server>> serviceRegistry = new ConcurrentHashMap<>();
    
    public void registerService(String serviceName, Server server) {
        serviceRegistry.computeIfAbsent(serviceName, k -> new ArrayList<>())
                      .add(server);
        
        log.info("服务注册: {} -> {}", serviceName, server.getAddress());
    }
    
    public List<Server> getAvailableServers(String serviceName) {
        List<Server> servers = serviceRegistry.get(serviceName);
        if (servers == null) {
            return Collections.emptyList();
        }
        
        // 过滤出健康的服务器
        return servers.stream()
                     .filter(Server::isHealthy)
                     .collect(Collectors.toList());
    }
    
    public Server selectServer(String serviceName) {
        List<Server> availableServers = getAvailableServers(serviceName);
        if (availableServers.isEmpty()) {
            throw new ServiceUnavailableException("没有可用的服务实例");
        }
        
        // 使用负载均衡算法选择服务器
        LoadBalancer loadBalancer = new LoadBalancer(availableServers);
        return loadBalancer.getNextServer();
    }
}

七、监控与运维最佳实践

7.1 分布式追踪

// 分布式追踪实现示例
@Component
public class DistributedTracing {
    
    private final Tracer tracer;
    private final Sampler sampler;
    
    public DistributedTracing(Tracer tracer, Sampler sampler) {
        this.tracer = tracer;
        this.sampler = sampler;
    }
    
    public <T> T trace(String operationName, Supplier<T> operation) {
        Span span = tracer.buildSpan(operationName)
                         .withTag("component", "distributed-system")
                         .start();
        
        try {
            T result = operation.get();
            span.setTag("status", "success");
            return result;
        } catch (Exception e) {
            span.setTag("status", "error");
            span.setTag("error", e.getMessage());
            throw e;
        } finally {
            span.finish();
        }
    }
    
    public void traceAsync(String operationName, Runnable operation) {
        Span span = tracer.buildSpan(operationName)
                         .withTag("component", "distributed-system")
                         .start();
        
        try {
            operation.run();
            span.setTag("status", "success");
        } catch (Exception e) {
            span.setTag("status", "error");
            span.setTag("error", e.getMessage());
            throw e;
        } finally {
            span.finish();
        }
    }
}

// 使用示例
@Service
public class OrderService {
    
   
相关推荐
广告位招租

相似文章

    评论 (0)

    0/2000