Spring Cloud微服务架构深度解析:把分布式核心讲透,你真的了解吗?
🎯 写在前面:在微服务时代,Spring Cloud是Java后端工程师必须掌握的技能。但很多人只是会用,却不理解其背后的原理。这篇文章,将带你从源码层面深度剖析Spring Cloud的核心组件!
一、微服务架构基础:什么是微服务?
1.1 单体架构 vs 微服务架构
┌─────────────────────────────────────────────────────────────────┐
│ 单体架构 │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 单体应用 │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ │ │用户 │ │订单 │ │支付 │ │商品 │ │库存 │ │ │
│ │ │模块 │ │模块 │ │模块 │ │模块 │ │模块 │ │ │
│ │ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 问题:所有模块耦合在一起,修改任何一个模块都需要重新部署整个应用 │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 微服务架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │用户 │ │订单 │ │支付 │ │商品 │ │库存 │ │
│ │服务 │ │服务 │ │服务 │ │服务 │ │服务 │ │
│ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ │
│ │ │ │ │ │ │
│ └──────────┴──────────┴──────────┴──────────┘ │
│ ↓ │
│ ┌───────────────┐ │
│ │ 注册中心 │ │
│ │ (Nacos/Eureka)│ │
│ └───────────────┘ │
│ │
│ 优势:每个服务独立部署、独立扩展、独立技术栈 │
└─────────────────────────────────────────────────────────────────┘
1.2 Spring Cloud核心组件全景图
┌─────────────────────────────────────────────────────────────────────┐
│ Spring Cloud组件全景图 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ 服务治理 │ │
│ │ 注册中心:Nacos / Eureka / Consul │ │
│ │ 配置中心:Nacos Config / Apollo / Spring Cloud Config │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ 网关层 │ │
│ │ Spring Cloud Gateway / Zuul │ │
│ │ 路由转发、限流、熔断、认证鉴权 │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ 服务调用 │ │
│ │ OpenFeign(声明式HTTP客户端) │ │
│ │ Ribbon(负载均衡器) │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ 容错保护 │ │
│ │ Sentinel / Resilience4j / Hystrix │ │
│ │ 熔断、降级、限流 │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
二、服务注册与发现:Nacos深度剖析
2.1 Nacos注册原理
// 服务注册示例
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
// application.yml配置
spring:
application:
name: user-service // 服务名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 // Nacos地址
namespace: dev // 命名空间
group: DEFAULT_GROUP // 分组
2.2 Nacos注册流程
┌─────────────────────────────────────────────────────────────────────┐
│ Nacos服务注册流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 服务启动 │
│ ↓ │
│ 2. Spring Cloud自动装配NacosServiceAutoConfiguration │
│ ↓ │
│ 3. 创建NacosNamingService实例 │
│ ↓ │
│ 4. 定时任务:发送心跳(默认5秒) │
│ ↓ │
│ 5. 注册服务:POST /nacos/v1/ns/instance │
│ ↓ │
│ 6. Nacos Server保存服务实例到内存 │
│ ↓ │
│ 7. 推送变更事件给订阅者 │
│ │
└─────────────────────────────────────────────────────────────────────┘
2.3 服务发现与负载均衡
// 服务调用 - 使用Feign声明式HTTP客户端
@FeignClient(name = "order-service", fallback = OrderServiceFallback.class)
public interface OrderFeignClient {
@GetMapping("/order/{userId}")
List<Order> getOrders(@PathVariable("userId") Long userId);
@PostMapping("/order/create")
Order createOrder(@RequestBody OrderRequest request);
}
// 启用Feign客户端
@EnableFeignClients
@SpringBootApplication
public class OrderConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(OrderConsumerApplication.class, args);
}
}
// 实现降级逻辑
@Component
public class OrderServiceFallback implements OrderFeignClient {
@Override
public List<Order> getOrders(Long userId) {
// 降级处理:返回空列表或缓存数据
return Collections.emptyList();
}
@Override
public Order createOrder(OrderRequest request) {
// 降级处理
return null;
}
}
三、网关:Spring Cloud Gateway深度剖析
3.1 Gateway工作原理
┌─────────────────────────────────────────────────────────────────────┐
│ Spring Cloud Gateway工作原理 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 请求 → Gateway Handler Mapping(路由匹配) │
│ ↓ │
│ Gateway Web Handler(过滤器链) │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Filter Chain │ │
│ │ │ │
│ │ 1. GlobalFilter A ←── 自定义全局过滤器 │ │
│ │ 2. GatewayFilter B ←── 路由特定过滤器 │ │
│ │ 3. GatewayFilter C │ │
│ │ 4. ... │ │
│ │ 5. Netty Routing Filter ←── 转发请求到下游服务 │ │
│ │ 6. ... │ │
│ │ 7. GatewayFilter C │ │
│ │ 8. GatewayFilter B │ │
│ │ 9. GlobalFilter A │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 响应 │
│ │
└─────────────────────────────────────────────────────────────────────┘
3.2 Gateway核心配置
spring:
cloud:
gateway:
# 路由配置
routes:
# 用户服务路由
- id: user-service
uri: lb://user-service # lb表示负载均衡
predicates:
- Path=/api/user/**
- After=2024-01-01T00:00:00Z # 时间断言
- Header=X-Request-Id, \d+ # 请求头断言
filters:
- StripPrefix=1 # 去掉第一层路径 /api/user/** -> /user/**
- RequestRateLimiter=10,20 # 限流:每秒10个请求,突发20个
# 订单服务路由
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- StripPrefix=1
- name: RequestSize
args:
maxSize: 5000000 # 最大请求体5MB
# 静态资源路由
- id: static-resources
uri: https://static.example.com
predicates:
- Path=/static/**
# 全局默认过滤器
default-filters:
- AddRequestHeader=X-Gateway, SpringCloudGateway
- AddResponseHeader=X-Response-Time, #{T(System).currentTimeMillis()}
# 全局跨域配置
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods:
- GET
- POST
- PUT
- DELETE
allowedHeaders: "*"
3.3 自定义全局过滤器
// 认证鉴权过滤器
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Autowired
private JwtUtil jwtUtil;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getURI().getPath();
// 1. 放行登录接口
if (path.contains("/auth/login") || path.contains("/auth/register")) {
return chain.filter(exchange);
}
// 2. 获取Token
String token = request.getHeaders().getFirst("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
return unauthorized(exchange, "Missing or invalid token");
}
token = token.substring(7);
// 3. 验证Token
try {
Claims claims = jwtUtil.parseToken(token);
String userId = claims.getSubject();
// 4. 将用户信息传递给下游服务
ServerHttpRequest modifiedRequest = request.mutate()
.header("X-User-Id", userId)
.header("X-User-Role", claims.get("role", String.class))
.build();
return chain.filter(exchange.mutate().request(modifiedRequest).build());
} catch (Exception e) {
return unauthorized(exchange, "Token verification failed");
}
}
private Mono<Void> unauthorized(ServerWebExchange exchange, String message) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "application/json");
String body = "{\"code\": 401, \"message\": \"" + message + "\"}";
DataBuffer buffer = response.bufferFactory().wrap(body.getBytes());
return response.writeWith(Mono.just(buffer));
}
@Override
public int getOrder() {
return -100; // 优先级,数字越小越先执行
}
}
// 限流过滤器(令牌桶算法)
@Component
public class RateLimiterFilter implements GlobalFilter, Ordered {
private final Map<String, Bucket> buckets = new ConcurrentHashMap<>();
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String key = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
// 获取或创建令牌桶(每秒10个请求)
Bucket bucket = buckets.computeIfAbsent(key, k ->
Bucket.builder()
.addLimit(Bandwidth.classic(10, Refill.intervally(10, Duration.ofSeconds(1))))
.build()
);
// 尝试获取令牌
if (bucket.tryConsume(1)) {
return chain.filter(exchange);
} else {
exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
return exchange.getResponse().setComplete();
}
}
@Override
public int getOrder() {
return -200;
}
}
四、熔断降级:Sentinel深度剖析
4.1 Sentinel vs Hystrix 对比
┌─────────────────────────────────────────────────────────────────────┐
│ 熔断器对比 │
├──────────────────────┬──────────────────────────────────────────────┤
│ Hystrix │ Sentinel │
├──────────────────────┼──────────────────────────────────────────────┤
│ 设计模式 │ 实时统计 + 滑动窗口 │
│ 线程池隔离 │ 信号量隔离 / 线程池隔离 │
│ 命令模式 │ @SentinelResource注解 │
│ 熔断策略 │ 慢调用比例、异常比例、异常数 │
│ 生效时机 │ 请求被拦截时 │
│ 规则配置 │ 硬编码 / 文件 / Nacos动态推送 │
│ Dashboard │ 控制台 + 规则动态管理 │
│ 社区状态 │ 阿里的商业支持,更新活跃 │
└──────────────────────┴──────────────────────────────────────────────┘
结论:Sentinel功能更全面、性能更好,推荐使用!
4.2 Sentinel核心配置
// Sentinel配置
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
// 方式1:配置文件配置
System.setProperty("csp.sentinel.dashboard.server", "localhost:8080");
System.setProperty("csp.sentinel.api.port", "8719");
SpringApplication.run(OrderApplication.class, args);
}
}
// application.yml
spring:
cloud:
sentinel:
enabled: true
transport:
dashboard: localhost:8080 # Sentinel Dashboard地址
port: 8719 # 通信端口
datasource:
ds:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-sentinel
groupId: SENTINEL_GROUP
data-type: json
rule-type: flow
4.3 Sentinel注解使用
// 定义资源(可以是接口、方法和异常)
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("/order/{id}")
@SentinelResource(
value = "getOrder", // 资源名
blockHandler = "getOrderBlockHandler", // 限流/熔断处理
fallback = "getOrderFallback", // 降级处理
exceptionsToIgnore = {BusinessException.class} // 忽略的异常
)
public Result<Order> getOrder(@PathVariable Long id) {
return Result.success(orderService.getById(id));
}
// BlockHandler:限流/熔断触发时调用(必须public,返回值必须和原方法一致)
public Result<Order> getOrderBlockHandler(Long id, BlockException e) {
log.warn("请求被限流:{}", e.getClass().getSimpleName());
return Result.fail("系统繁忙,请稍后重试");
}
// Fallback:业务异常或降级时调用
public Result<Order> getOrderFallback(Long id, Throwable e) {
log.warn("降级处理:{}", e.getMessage());
// 可以返回兜底数据
return Result.success(new Order().setId(id).setStatus("兜底数据"));
}
}
// 热点参数限流
@GetMapping("/order/detail")
@SentinelResource("orderDetail")
public Result<OrderDetail> orderDetail(
@RequestParam Long orderId,
@RequestParam(required = false) Long userId
) {
// 热点参数:orderId是热点参数,针对不同的orderId单独限流
return Result.success(orderService.getDetail(orderId, userId));
}
// 热点规则配置
@Configuration
public class SentinelConfig {
@PostConstruct
public void init() {
// 热点参数规则:orderId参数,索引0,每秒每个orderId最多10个请求
List<ParamFlowRule> rules = new ArrayList<>();
ParamFlowRule rule = new ParamFlowRule("orderDetail")
.setParamIdx(0)
.setCount(10)
.setDurationInSec(1);
rules.add(rule);
ParamFlowRuleManager.loadRules(rules);
}
}
// 系统自适应限流
@Configuration
public class SystemRuleConfig {
@PostConstruct
public void init() {
List<SystemRule> rules = new ArrayList<>();
SystemRule rule = new SystemRule()
.setHighestCpuUsage(0.8) // CPU使用率80%时触发
.setHighestSystemLoad(10.0) // 系统负载10时触发
.setAvgRt(1000) // 平均响应时间1秒时触发
.setQps(5000); // QPS 5000时触发
rules.add(rule);
SystemRuleManager.loadRules(rules);
}
}
4.4 熔断器状态机
┌─────────────────────────────────────────────────────────────────────┐
│ Sentinel熔断状态机 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 熔断关闭 熔断开启 │
│ (CLOSED) ──────────→ (OPEN) │
│ ↑ │ │
│ │ │ (达到熔断时间) │
│ │ ↓ │
│ │ ┌─────────────┐ │
│ │ │ 半开状态 │ │
│ │ │ (HALF_OPEN)│ │
│ │ └─────────────┘ │
│ │ │ │
│ │ ┌─────────┴─────────┐ │
│ │ ↓ ↓ │
│ │ 失败率仍然高 成功率高 │
│ │ │ │ │
│ └─────────┴───────────────────┘ │
│ │
│ 熔断策略: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. 慢调用比例:响应时间 > RT(秒) 的调用视为慢调用 │ │
│ │ 当慢调用比例 >= 比例阈值,开启熔断 │ │
│ │ │ │
│ │ 2. 异常比例:请求异常数 / 总请求数 >= 比例阈值 │ │
│ │ 当异常比例 >= 比例阈值,开启熔断 │ │
│ │ │ │
│ │ 3. 异常数:请求异常数 >= 异常数阈值 │ │
│ │ 当异常数 >= 阈值,开启熔断 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
五、配置中心:Nacos Config
5.1 配置管理架构
┌─────────────────────────────────────────────────────────────────────┐
│ Nacos配置中心架构 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │User服务 │ │Order服务 │ │Pay服务 │ │
│ │dev环境 │ │dev环境 │ │dev环境 │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ └──────────────┴──────────────┘ │
│ ↓ │
│ ┌──────────────────────┐ │
│ │ Nacos Server │ │
│ │ │ │
│ │ user-service.yaml │ ← Data ID │
│ │ order-service.yaml │ │
│ │ pay-service.yaml │ │
│ │ │ │
│ │ shared.yaml │ ← 共享配置 │
│ └──────────────────────┘ │
│ │
│ 配置命名空间:dev / test / prod │
│ 配置分组:DEFAULT_GROUP / SYSTEM_GROUP │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.2 配置共享与动态刷新
# 主配置文件
spring:
application:
name: user-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: dev
group: DEFAULT_GROUP
# 共享配置(所有服务共享)
shared-configs:
- data-id: common.yaml
group: SHARED_GROUP
refresh: true # 动态刷新
- data-id: datasource.yaml
group: SHARED_GROUP
refresh: true
# 扩展配置(可选)
extension-configs:
- data-id: ${spring.application.name}-ext.yaml
group: EXT_GROUP
refresh: true
// 方式1:@Value注解(局部配置)
@RestController
@RefreshScope // 启用配置刷新
public class UserController {
@Value("${user.max-count:100}")
private int maxCount;
@GetMapping("/user/count")
public int getMaxCount() {
return maxCount; // 配置变更后会自动刷新
}
}
// 方式2:@ConfigurationProperties(推荐)
@Data
@Component
@ConfigurationProperties(prefix = "user")
@RefreshScope
public class UserProperties {
private int maxCount = 100;
private int timeout = 5000;
private List<String> allowedOrigins;
}
// 方式3:@NacosConfigurationProperties(直接监听)
@Data
@Component
@NacosConfigurationProperties(prefix = "user", autoRefreshed = true)
public class UserProperties {
private int maxCount;
}
六、分布式事务:Seata
6.1 Seata事务模式对比
┌─────────────────────────────────────────────────────────────────────┐
│ Seata事务模式对比 │
├──────────────────────┬──────────────────────────────────────────────┤
│ AT模式 │ XA模式 │
├──────────────────────┼──────────────────────────────────────────────┤
│ 无需改造业务代码 │ 需要修改数据库连接为XA模式 │
│ 自动生成反向SQL │ 手动编写业务逻辑 │
│ 性能损耗低 │ 性能损耗较高(两阶段提交) │
│ 适合短事务 │ 适合长事务、强一致性场景 │
│ MySQL 5.7.11+ │ 支持XA的数据库 │
├──────────────────────┼──────────────────────────────────────────────┤
│ TCC模式 │ Saga模式 │
├──────────────────────┼──────────────────────────────────────────────┤
│ 手动编写Try/Confirm │ 编排式补偿,自动生成补偿 │
│ 性能最高 │ 适合长流程业务 │
│ 需要实现三个接口 │ 不保证隔离性 │
│ 适合并发控制场景 │ 适合状态机流转场景 │
└──────────────────────┴──────────────────────────────────────────────┘
推荐:先AT模式,复杂场景用TCC
6.2 AT模式实战
// 1. 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</dependency>
// 2. 配置
seata:
tx-service-group: my-service-group
service:
vgroup-mapping:
my-service-group: default
enable-degrade: false
registry:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
// 3. 业务代码(AT模式无感知,无需额外注解)
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private AccountFeignClient accountFeignClient;
@Override
public void createOrder(OrderDTO orderDTO) {
// 1. 创建订单
Order order = new Order();
order.setUserId(orderDTO.getUserId());
order.setAmount(orderDTO.getAmount());
order.setStatus("PENDING");
orderMapper.insert(order);
// 2. 扣减余额(远程调用)
accountFeignClient.deduct(orderDTO.getUserId(), orderDTO.getAmount());
// 3. 更新订单状态
order.setStatus("COMPLETED");
orderMapper.updateById(order);
// 以上操作在一个全局事务中,任何一步失败都会回滚
}
}
七、常见面试题
Q1:Nacos和Eureka的区别?
┌─────────────────────────────────────────────────────────────────────┐
│ Nacos vs Eureka 对比 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. CAP定理 │
│ - Eureka:AP(优先可用性,允许短暂的数据不一致) │
│ - Nacos:同时支持AP和CP(可切换) │
│ │
│ 2. 功能 │
│ - Eureka:只支持服务注册/发现 │
│ - Nacos:服务注册/发现 + 配置管理 + 动态配置推送 │
│ │
│ 3. 配置管理 │
│ - Eureka:不支持 │
│ - Nacos:内置配置中心,支持配置变更推送 │
│ │
│ 4. 协议支持 │
│ - Eureka:只支持HTTP │
│ - Nacos:HTTP + gRPC │
│ │
│ 5. 活跃度 │
│ - Eureka 2.x已停更 │
│ - Nacos 阿里背书,持续更新 │
│ │
│ 结论:优先选择Nacos │
│ │
└─────────────────────────────────────────────────────────────────────┘
Q2:Gateway和Zuul的区别?
1. 架构:
- Zuul 1.x:同步阻塞模式,每个请求一个线程
- Gateway:基于WebFlux(响应式编程)+ Netty,非阻塞
2. 性能:
- Gateway性能是Zuul的2-3倍
3. 过滤机制:
- Zuul:Filter(4种类型)
- Gateway:GatewayFilter + GlobalFilter,更灵活
4. 限流:
- Zuul:需要借助Bucket4j等第三方
- Gateway:内置RequestRateLimiter
5. 结论:使用Spring Cloud Gateway
Q3:Sentinel的滑动窗口算法原理?
Sentinel使用滑动窗口来统计接口的QPS、响应时间等指标:
┌─────────────────────────────────────────────────────────────────────┐
│ 滑动窗口统计原理 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 当前时间:11:00:05 │
│ │
│ 窗口大小:1秒 │
│ 窗口数量:2个(统计最近2秒) │
│ │
│ ┌──────────────────┬──────────────────┐ │
│ │ 窗口1 │ 窗口2 │ │
│ │ 11:00:04 │ 11:00:05 │ │
│ │ 请求数:150 │ 请求数:80 │ │
│ │ 慢调用:10 │ 慢调用:5 │ │
│ │ 异常:3 │ 异常:1 │ │
│ └──────────────────┴──────────────────┘ │
│ │
│ 统计结果: │
│ - 总请求数 = 150 + 80 = 230 │
│ - 慢调用比例 = (10 + 5) / 230 = 6.5% │
│ - 异常比例 = (3 + 1) / 230 = 1.7% │
│ │
│ 特点:每500ms滑动一次,每次统计最近2个完整窗口 │
│ │
└─────────────────────────────────────────────────────────────────────┘
八、总结
┌─────────────────────────────────────────────────────────────────────┐
│ Spring Cloud知识地图 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 服务注册与发现 ───→ Nacos/Eureka │
│ ↓ │
│ 配置中心 ────────→ Nacos Config │
│ ↓ │
│ 网关 ───────────→ Spring Cloud Gateway │
│ ↓ │
│ 负载均衡 ───────→ Ribbon / LoadBalancer │
│ ↓ │
│ 服务调用 ───────→ OpenFeign │
│ ↓ │
│ 熔断降级 ───────→ Sentinel / Resilience4j │
│ ↓ │
│ 分布式事务 ─────→ Seata (AT/TCC/XA/Saga) │
│ │
│ 选型建议: │
│ 注册中心:Nacos(功能全面) │
│ 配置中心:Nacos Config(统一管理) │
│ 网关:Spring Cloud Gateway(性能好) │
│ 熔断:Sentinel(阿里背书,功能强) │
│ 分布式事务:Seata(对业务零侵入) │
│ │
└─────────────────────────────────────────────────────────────────────┘
🎯 讨论话题
大家在微服务改造中遇到过哪些坑?是怎么解决的?
往期热门文章推荐:
如果这篇文章对你有帮助,欢迎点赞、收藏、转发!我们下期再见! 👋