微服务高并发设计的核心矛盾
微服务架构解决的是系统复杂度问题,但同时引入了分布式系统固有的挑战:网络不可靠、时钟不同步、部分失败不可避免。高并发设计要解决的核心矛盾是:在有限资源下,如何保证请求的吞吐量和延迟同时满足SLA。Spring Boot生态提供了成熟的工具链,但工具本身不等于架构能力。
Spring Boot高并发编程模型
线程池隔离——不同业务使用独立线程池,避免慢调用拖垮整个应用:
@Configuration
public class ThreadPoolConfig {
@Bean("orderExecutor")
public ThreadPoolExecutor orderExecutor() {
return new ThreadPoolExecutor(
8, 32, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(500),
new ThreadFactoryBuilder().setNameFormat("order-%d").build(),
new ThreadPoolExecutor.CallerRunsPolicy()
);
}
@Bean("reportExecutor")
public ThreadPoolExecutor reportExecutor() {
return new ThreadPoolExecutor(
2, 8, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(200),
new ThreadFactoryBuilder().setNameFormat("report-%d").build(),
new ThreadPoolExecutor.DiscardOldestPolicy()
);
}
}
// 在服务层使用
@Service
public class OrderService {
@Async("orderExecutor")
public CompletableFuture<OrderResult> processOrderAsync(OrderRequest request) {
return CompletableFuture.completedFuture(doProcess(request));
}
}
限流降级——Sentinel是Spring Cloud生态中应用最广的流控组件。关键配置:
// Sentinel规则配置
FlowRule orderRule = new FlowRule()
.setResource("order-service")
.setGrade(RuleConstant.FLOW_GRADE_QPS)
.setCount(500) // QPS限制500
.setLimitApp("default")
.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP) // 预热模式
.setWarmUpPeriodSec(30); // 预热时长30秒
DegradeRule degradeRule = new DegradeRule("order-service")
.setGrade(RuleConstant.DEGRADE_GRADE_RT) // 慢调用比例熔断
.setCount(200) // RT阈值200ms
.setTimeWindow(30) // 熔断持续30秒
.setMinRequestAmount(10)
.setSlowRatioThreshold(0.6); // 慢调用比例60%触发
List<FlowRule> rules = List.of(orderRule);
FlowRuleManager.loadRules(rules);
DegradeRuleManager.loadRules(List.of(degradeRule));
分布式事务方案选型与实现
微服务拆分后,跨服务的数据一致性是最棘手的问题。三种主流方案的适用场景:
方案一:Seata AT模式——适合对一致性要求高、并发量中等的场景。实现最简单,但有全局锁开销:
@Service
public class OrderServiceImpl {
@GlobalTransactional(timeoutMills = 30000, name = "create-order")
public OrderResult createOrder(OrderRequest request) {
// 1. 创建订单
Order order = orderMapper.insert(buildOrder(request));
// 2. 扣减库存(远程调用)
inventoryClient.deduct(request.getProductId(), request.getQuantity());
// 3. 扣减账户余额(远程调用)
accountClient.debit(request.getUserId(), order.getTotalAmount());
return OrderResult.success(order);
}
}
方案二:基于消息的最终一致性——适合高并发场景,用RocketMQ事务消息保证本地事务和消息发送的原子性:
@Service
public class OrderServiceImpl {
@Transactional
public OrderResult createOrder(OrderRequest request) {
// 1. 本地事务:创建订单(状态为PENDING)
Order order = orderMapper.insert(buildOrder(request));
// 2. 发送半消息
rocketMQTemplate.sendMessageInTransaction(
"order-create-topic",
MessageBuilder.withPayload(order).build(),
order // 传给本地事务检查的参数
);
return OrderResult.success(order);
}
// 半消息提交后的本地事务检查
@RocketMQTransactionListener
class OrderTransactionListener implements RocketMQLocalTransactionListener {
@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
try {
// 执行库存扣减等操作
return RocketMQLocalTransactionState.COMMIT;
} catch (Exception e) {
return RocketMQLocalTransactionState.ROLLBACK;
}
}
}
}
方案三:Saga模式——适合长事务流程,每步有补偿操作。用状态机编排:
// Saga定义
public class OrderSagaDefinition {
public SagaDefinition<OrderState> saga() {
return step()
.invokeParticipant(this::createOrder)
.withCompensation(this::cancelOrder)
.step()
.invokeParticipant(this::deductInventory)
.withCompensation(this::restoreInventory)
.step()
.invokeParticipant(this::debitAccount)
.withCompensation(this::creditAccount)
.build();
}
}
API接口规范与服务治理
微服务间的API接口规范化是服务治理的基石。推荐统一响应格式和错误码体系:
// 统一响应
@Data
public class ApiResult<T> {
private int code;
private String message;
private T data;
private long timestamp;
public static <T> ApiResult<T> success(T data) {
ApiResult<T> r = new ApiResult<>();
r.setCode(0);
r.setData(data);
r.setTimestamp(System.currentTimeMillis());
return r;
}
public static ApiResult<Void> error(ErrorCode errorCode) {
ApiResult<Void> r = new ApiResult<>();
r.setCode(errorCode.getCode());
r.setMessage(errorCode.getMessage());
r.setTimestamp(System.currentTimeMillis());
return r;
}
}
// 错误码枚举
public enum ErrorCode {
PARAM_INVALID(40001, "参数校验失败"),
NOT_FOUND(40401, "资源不存在"),
CONCURRENCY_CONFLICT(40901, "并发冲突请重试"),
RATE_LIMIT(42901, "请求过于频繁"),
INTERNAL_ERROR(50001, "服务内部错误");
private final int code;
private final String message;
}
服务间调用必须设置超时和重试策略,Nacos + OpenFeign配置示例:
# application.yml
feign:
client:
config:
default:
connectTimeout: 3000
readTimeout: 5000
sentinel:
enabled: true
# 重试配置
spring:
cloud:
loadbalancer:
retry:
enabled: true
max-attempts: 2
retry-on-all-operations: false
微服务架构不是拆得越细越好。拆分的粒度由团队结构和业务边界决定,服务治理的复杂度才是微服务真正的成本。在高并发场景下,消息中间件削峰填仓、Sentinel限流熔断、Seata事务协调三板斧缺一不可。每一层防护都对应一类故障场景,少一层就多一个可能的全局故障点。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/springboot-wei-fu-wu-jia-gou-shi-zhan-gao-bing-fa-she-ji-yu/