1. 微服务通信的基本逻辑

微服务架构的核心特征之一是服务之间的解耦与独立部署,但实际业务场景中服务仍需要通过通信实现协作。通信方式的选择直接影响到系统的性能可靠性开发复杂度。本文将围绕同步通信(以HTTP协议为例)和异步通信(以消息队列MQ为例)展开分析,并通过实际代码示例说明技术选型的关键逻辑。


2. 同步通信:HTTP协议详解

技术栈:Java + Spring Boot + Spring WebClient

2.1 应用场景
  • 实时性要求高:如订单支付成功后立即查询结果。
  • 轻量级调用:服务之间依赖关系简单、调用频率较低。
  • 需要强一致性:例如金融交易需确保调用方立即获取响应。
2.2 代码示例:基于HTTP的订单查询服务
// 服务提供方(订单服务)
@RestController
@RequestMapping("/orders")
public class OrderController {

    // 通过订单ID查询订单详情(同步接口)
    @GetMapping("/{orderId}")
    public ResponseEntity<Order> getOrder(@PathVariable String orderId) {
        // 实际场景中会查询数据库或缓存
        Order order = new Order(orderId, "已支付", 158.00, "2023-10-01");
        return ResponseEntity.ok(order);
    }
}

// 服务消费方(用户服务)
@Service
public class UserService {

    private final WebClient webClient;

    public UserService(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl("http://order-service").build();
    }

    // 调用订单服务的HTTP接口
    public Order getOrderDetails(String orderId) {
        return webClient.get()
                .uri("/orders/{orderId}", orderId)
                .retrieve()
                .bodyToMono(Order.class)
                .block(); // 同步阻塞等待响应
    }
}

// Order实体类(DTO)
public class Order {
    private String orderId;
    private String status;
    private double amount;
    private String createTime;
    // 构造方法、Getter/Setter省略
}
2.3 技术优缺点
  • 优点
    • 简单直接:技术实现标准化,开发调试方便。
    • 实时反馈:调用方立即得知结果。
  • 缺点
    • 性能瓶颈:高并发下线程阻塞可能拖垮系统。
    • 耦合性高:服务故障可能导致链式雪崩。

3. 异步通信:消息队列MQ实战

技术栈:Java + Spring Boot + RabbitMQ

3.1 应用场景
  • 削峰填谷:大促期间订单量激增,消息队列缓冲请求。
  • 解耦系统:物流服务无须实时响应支付结果。
  • 最终一致性:如库存扣减和订单状态更新异步完成。
3.2 代码示例:基于RabbitMQ的库存扣减通知
// 消息生产者(订单服务)
@Service
public class OrderProducer {

    private final RabbitTemplate rabbitTemplate;

    public OrderProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    // 下单成功后发送消息到MQ
    public void notifyInventoryService(String orderId) {
        Map<String, Object> message = new HashMap<>();
        message.put("orderId", orderId);
        message.put("action", "deduct");
        rabbitTemplate.convertAndSend(
                "inventory-exchange",  // 交换机名称
                "inventory.deduct",    // 路由键
                message
        );
    }
}

// 消息消费者(库存服务)
@Component
public class InventoryConsumer {

    @RabbitListener(queues = "inventory-queue")
    public void handleMessage(Map<String, Object> message) {
        // 异步处理库存扣减逻辑
        String orderId = (String) message.get("orderId");
        System.out.println("处理订单 " + orderId + " 的库存扣减");
        // 实际业务中应操作数据库并记录日志
    }
}

// RabbitMQ配置类
@Configuration
public class RabbitMQConfig {

    @Bean
    public TopicExchange inventoryExchange() {
        return new TopicExchange("inventory-exchange");
    }

    @Bean
    public Queue inventoryQueue() {
        return new Queue("inventory-queue");
    }

    @Bean
    public Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue)
                .to(exchange)
                .with("inventory.deduct");
    }
}
3.3 技术优缺点
  • 优点
    • 高吞吐量:消息堆积能力支撑突发流量。
    • 系统解耦:服务故障不影响整体流程。
  • 缺点
    • 数据一致性风险:需额外处理消息丢失或重复消费问题。
    • 运维复杂度:需监控队列积压、消费者状态等。

4. 混合通信:HTTP与MQ的协同模式

4.1 典型场景:电商下单流程
  1. 用户支付(HTTP):立即返回支付结果。
  2. 生成订单(HTTP → MQ):支付成功后触发异步发货通知。
  3. 物流调度(MQ):第三方物流系统处理运单。
// 用户点击支付按钮(HTTP同步)
@PostMapping("/pay")
public ResponseEntity<String> payOrder(@RequestBody PaymentRequest request) {
    boolean success = paymentService.process(request);
    if (success) {
        // 支付成功后,异步通知物流服务
        logisticsProducer.notifyShipment(request.getOrderId());
        return ResponseEntity.ok("支付成功");
    }
    return ResponseEntity.status(500).body("支付失败");
}

5. 技术选型注意事项

  1. 超时与重试

    • HTTP:设置合理超时时间(如2秒),避免线程池耗尽。
    spring:
      webclient:
        timeout:
          connect: 1000
          response: 5000
    
    • MQ:通过ACK机制确保消息可靠投递。
  2. 幂等性设计

    • HTTP:通过唯一ID防止重复提交。
    • MQ:使用数据库唯一约束或Redis原子操作防重。
  3. 监控告警

    • HTTP:跟踪接口响应时间、错误率(如Prometheus + Grafana)。
    • MQ:监控队列长度、消费者处理延迟(如RabbitMQ Management插件)。

6. 总结与未来趋势

  • **同步通信(HTTP)**适用于实时性高、逻辑简单的场景,但需警惕性能瓶颈。
  • **异步通信(MQ)**在解耦系统、处理高并发时更优,但要解决消息一致性问题。
  • 混合方案逐渐成为主流,例如:前端请求通过HTTP响应快速反馈,后台任务通过MQ异步完成。

未来Service Mesh等技术的普及(如Istio)将简化通信治理,但核心技术选型逻辑依然万变不离其宗。