惊落一身雪 发表于 前天 06:00

5.2.Spring Cloud Alibaba生态

目次

一、Spring Cloud Alibaba生态全景概览


[*] 生态定位与核心优势 • 与Spring Cloud Netflix的对比(功能覆盖、社区支持) • 阿里系中间件整合价值(高并发、分布式场景优化)
[*] 核心组件矩阵与选型指南 • Nacos vs Eureka/Consul(服务发现与设置管理) • Sentinel vs Hystrix(流量控制与容错能力对比)
[*] 版本兼容性与环境搭建 • Spring Boot 2.x + Spring Cloud Alibaba版本映射 • 当地开发环境快速搭建(Maven依赖+底子设置)
二、服务注册与设置中心:Nacos


[*] Nacos核心功能实战 • 动态服务注册与发现(多集群隔离设置) • 设置中心热更新(@RefreshScope原理与利用)
[*] 高可用生产级摆设 • 集群化摆设模式(MySQL长期化存储) • 灰度发布与设置版本回滚
[*] 口试高频问题 • Nacos怎样保证CP与AP模式切换? • 设置变更推送机制(长轮询 vs 主动通知)
三、分布式流量治理:Sentinel


[*] 流量控制与熔断降级 • QPS/线程数/相应时间熔断规则设置 • 热点参数限流与体系自顺应掩护
[*] 规则长期化与生产实践 • 集成Nacos实现动态规则推送 • 集群限流场景下的Token Server模式
[*] 口试聚焦 • Sentinel与Hystrix的线程隔离模子差异? • 怎样实现分布式服务链路流量控制?
四、分布式事务:Seata


[*] 事务模式深度解析 • AT模式原理(Undo Log与全局锁机制) • TCC模式开发模板(@TwoPhaseBusinessAction)
[*] 生产环境优化方案 • Seata Server高可用摆设(DB存储模式) • 事务分组与TC集群隔离策略
[*] 口试实战题 • AT模式怎样办理脏写问题? • TCC空回滚与幂等性处置惩罚方案
五、分布式消息通讯:RocketMQ


[*] Spring Cloud Stream整合 • 消息发布/订阅模子(@StreamListener) • 顺序消息与事务消息实战
[*] 生产级可靠性保障 • 消息重试机制与死信队列计划 • 集群化摆设与Broker组设置
[*] 口试常见问题 • RocketMQ怎样保证消息不丢失? • 消息堆积场景下的快速消费方案
六、API网关:Spring Cloud Gateway与Alibaba整合


[*] 网关核心功能扩展 • 集成Sentinel实现网关限流 • Nacos动态路由设置(主动感知服务上下线)
[*] 安全与性能优化 • JWT鉴权与OAuth2中继实现 • 相应缓存与请求归并策略
[*] 口试题解析 • 网关怎样实现灰度发布? • 过滤器链执行顺序与自定义扩展
七、进阶实战与性能调优


[*] 微服务全链路监控 • SkyWalking整合(Trace ID透传与性能分析) • 日志追踪与Prometheus指标埋点
[*] 云原生环境适配 • Kubernetes摆设Spring Cloud Alibaba组件 • 服务网格(Service Mesh)与Sidecar模式探索
[*] 生产环境踩坑指南 • Nacos客户端设置重试机制 • Sentinel规则长期化失效排查
八、求职口试专题突破


[*] 计划类问题 • 怎样基于Spring Cloud Alibaba计划亿级流量电商架构? • Seata在跨库事务中的性能优化方案
[*] 源码级深挖 • Nacos注册中心心跳机制源码分析 • Sentinel滑动时间窗口算法实现
[*] 场景开放题 • 微服务雪崩场景下的全链路办理方案 • 从Spring Cloud迁移到Spring Cloud Alibaba的挑战
一、Spring Cloud Alibaba生态全景概览

1. 生态定位与核心优势

1.1 与Spring Cloud Netflix的深度对比

功能覆盖差异

```java
// 典型配置差异示例
@Configuration
// Netflix方式
@EnableCircuitBreaker
// Alibaba方式
@EnableSentinel
public class ResilienceConfig {} 功能维度Netflix方案Alibaba方案优势比较服务发现Eureka(AP)Nacos(AP/CP可切换)支持设置中心一体化熔断降级Hystrix(线程池隔离)Sentinel(信号量隔离)更低资源消耗分布式设置Config+BusNacos内置支持及时推送(<1s) 社区支持现状

• Netflix:2020年后停止重大更新,Spring官方保举迁移 • Alibaba:一连迭代(2023年发布2.2.10版本),中文文档完善
1.2 阿里系中间件整合价值

双十一验证的技能矩阵

高并发
Nacos百万级实例注册
Sentinel百万QPS限流
RocketMQ万亿级消息堆积
企业级加强特性

• Nacos:


[*] 设置版本回滚(类似Git的版本控制)
[*] 监听查询(精确追踪设置变更汗青)
-- Nacos配置历史表结构
SELECT * FROM his_config_info
WHERE data_id='order-service.yml'
ORDER BY id DESC LIMIT 5; 2. 核心组件矩阵与选型指南

2.1 注册中心选型决策树

Nacos vs Eureka vs Consul

指标NacosEurekaConsul一致性协议AP/CP可切换APCP健康检查TCP/HTTP/MYSQL心跳检测多种检查方式设置管理内置支持需结合Config需结合Vault 选型建议

public class RegistrySelection {
    public static String choose(boolean needConfigCenter, boolean multiDC) {
      if (needConfigCenter) return "Nacos";
      return multiDC ? "Consul" : "Eureka";
    }
} 2.2 熔断组件性能对比

Sentinel vs Hystrix基准测试

压测指标Sentinel(1.8.6)Hystrix(1.5.18)QPS上限15万+2万+相应延迟<5ms10-50ms内存占用50MB200MB+ 线程模子差异

// Hystrix线程池隔离
@HystrixCommand(threadPoolKey = "orderThread")
public Order getOrder() {...}

// Sentinel信号量隔离
@SentinelResource(value = "orderResource",
               blockHandler = "flowBlockHandler")
public Order getOrder() {...} 3. 版本兼容性与环境搭建

3.1 版本映射关系(2023最新)

Spring BootSpring CloudSpring Cloud Alibaba2.7.x2021.0.x2021.0.5.02.6.x2021.0.x2021.0.4.0 依赖管理最佳实践

<!-- 父pom定义 -->
<dependencyManagement>
    <dependencies>
      <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.0.5.0</version>
            <type>pom</type>
            <scope>import</scope>
      </dependency>
    </dependencies>
</dependencyManagement> 3.2 当地开发环境搭建

最小化启动设置

bootstrap.yml
spring:
application:
    name: demo-service
cloud:
    nacos:
      discovery:
      server-addr: localhost:8848
      config:
      server-addr: localhost:8848
      file-extension: yaml
      group: DEFAULT_GROUP 关键依赖清单

<!-- 必须依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency> 二、服务注册与设置中心:Nacos

1. Nacos核心功能实战

1.1 动态服务注册与发现

多集群隔离设置

```yaml
application-cluster.yml
spring:
cloud:
    nacos:
      discovery:
      cluster-name: ${NACOS_CLUSTER:SHANGHAI_A}# 集群名称
      namespace: ${NACOS_NAMESPACE:DEV}          # 命名空间隔离
      group: ${NACOS_GROUP:ORDER_GROUP}          # 业务分组 服务注册源码解析

// NacosServiceRegistry自动注册流程
public class NacosAutoServiceRegistration {
    @EventListener(WebServerInitializedEvent.class)
    public void register() {
      // 核心注册方法
      namingService.registerInstance(
            applicationName,
            instance.setClusterName(clusterName)
      );
    }
} 1.2 设置热更新机制

@RefreshScope底层原理

public class RefreshScope extends GenericScope {
    // 关键方法:配置变更时触发Bean重建
    public void refreshAll() {
      super.destroy();// 销毁旧Bean
      context.getBeanFactory().initializeBean(...); // 重新初始化
    }
} 动态设置示例

@RestController
@RefreshScope
public class ConfigController {
    @Value("${order.timeout:5000}")
    private Integer timeout;// 配置变更后自动更新
   
    @GetMapping("/timeout")
    public Integer getTimeout() {
      return timeout;
    }
} 2. 高可用生产级摆设

2.1 集群化摆设架构

MySQL长期化方案

-- 初始化数据库脚本
CREATE DATABASE nacos_config CHARACTER SET utf8mb4;
USE nacos_config;
SOURCE ${NACOS_HOME}/conf/nacos-mysql.sql 集群启动参数

启动命令示例
java -Dnacos.standalone=false \
   -Dnacos.mysql.url=jdbc:mysql://db-cluster:3306/nacos_config \
   -Dnacos.mysql.user=nacos \
   -Dnacos.mysql.password=encrypted_password \
   -jar nacos-server.jar 2.2 灰度发布流程



创建灰度设置
关联特定IP/标签
验证通过?
全量发布
回滚版本
3. 口试高频问题

3.1 CP/AP模式切换原理

Raft协议实现CP

// Nacos的Distro协议处理类
public class DistroProtocol {
    // AP模式下数据同步
    public void sync(DistroKey key, byte[] data) {
      // 异步广播给其他节点
    }
} 模式切换设置

application.properties
nacos.naming.data.consistency=AP# 可选AP/CP 3.2 设置推送机制

长轮询流程

// ClientLongPolling核心逻辑
class ClientLongPolling implements Runnable {
    public void run() {
      // 默认30s长轮询超时
      String[] dataIds = request.getParameterValues("dataIds");
      List<String> changedGroups = checkUpdate(dataIds);
      if(!changedGroups.isEmpty()) {
            // 立即返回变更数据
      } else {
            // 加入阻塞队列等待通知
      }
    }
} 版本对比算法

public class ConfigCache {
    // 客户端缓存校验逻辑
    public boolean checkListenerMd5(String group, String dataId, String md5) {
      return Objects.equals(md5, getLocalMd5(group, dataId));
    }
} 三、分布式流量治理:Sentinel

1. 流量控制与熔断降级

1.1 熔断规则三维控制体系

规则设置模板

```java
// 熔断规则构建器
DegradeRule rule = new DegradeRuleBuilder()
    .withResource("paymentApi")
    .withGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) // 异常比例模式
    .withCount(0.5)// 阈值50%
    .withTimeWindow(10) // 熔断时长(s)
    .withMinRequestAmount(5) // 最小触发请求数
    .withStatIntervalMs(10000) // 统计窗口(ms)
    .build(); 熔断策略对比矩阵

熔断维度设置参数适用场景相应时间DEGRADE_GRADE_RT慢调用熔断非常比例DEGRADE_GRADE_EXCEPTION_RATIO服务不稳固时非常数DEGRADE_GRADE_EXCEPTION_COUNT非高频场景 1.2 热点参数限流实战

热点规则设置

@SentinelResource(
    value = "queryUser",
    blockHandler = "paramFlowBlockHandler",
    fallback = "userFallback"
)
public User queryUser(@RequestParam String userId) {...}

// 热点参数规则
ParamFlowRule rule = new ParamFlowRule("queryUser")
    .setParamIdx(0) // 第一个参数
    .setCount(100); // 单参数阈值 体系自顺应掩护

// 全局系统规则配置
SystemRule systemRule = new SystemRule()
    .setHighestSystemLoad(4.0) // max load
    .setAvgRt(200)             // 平均RT(ms)
    .setMaxThread(800)         // 最大线程数
    .setQps(5000);             // 全局QPS 2. 规则长期化与生产实践

2.1 Nacos动态规则推送

设置中心数据结构

{
"resource": "paymentApi",
"controlBehavior": 0,
"count": 100,
"grade": 1,
"strategy": 0
} 主动推送原理

Sentinel DashboardNacos微服务Sentinel发布规则设置设置变更通知动态加载新规则Sentinel DashboardNacos微服务Sentinel
2.2 集群限流摆设方案

Token Server模式

application-cluster.yaml
spring:
cloud:
    sentinel:
      transport:
      dashboard: sentinel-dashboard:8080
      filter:
      enabled: false
      # 集群配置
      cluster:
      server:
          host: 192.168.1.10
          port: 18730
      client:
          server-ip: 192.168.1.10
          request-timeout: 200 集群流控算法

// 集群请求处理逻辑
public class ClusterFlowChecker {
    public boolean allowCheck(FlowRule rule, int count) {
      // 向Token Server申请令牌
      return acquireClusterToken(rule, count);
    }
} 3. 口试聚焦

3.1 线程隔离模子对比

Hystrix线程池隔离

@HystrixCommand(
    threadPoolKey = "orderThread",
    threadPoolProperties = {
      @HystrixProperty(name="coreSize", value="20")
    }
)
public Order getOrder() {...}// 每个命令独立线程池 Sentinel信号量隔离

@SentinelResource(
    value = "orderResource",
    blockHandler = "flowBlock",
    fallback = "orderFallback"
)// 共享线程资源,通过信号量控制
public Order getOrder() {...} 3.2 分布式链路流控方案

链路维度限流

// 入口资源定义
try (Entry entry = SphU.entry("parentResource")) {
    // 调用子服务
    childService.call();// 子资源自动统计
} 网关层流控

网关路由规则
spring:
cloud:
    gateway:
      routes:
      ▪ id: payment_route

          uri: lb://payment-service
          predicates:
            ▪ Path=/payment/**

          filters:
            ▪ name: RequestRateLimiter

            args:
                redis-rate-limiter.replenishRate: 100
                redis-rate-limiter.burstCapacity: 200 四、分布式事务:Seata

1. 事务模式深度解析

1.1 AT模式核心机制

Undo Log工作原理

```sql
-- 业务操作前镜像
SELECT * FROM product WHERE id=1 FOR UPDATE;
-- 执行业务SQL
UPDATE product SET stock=stock-1 WHERE id=1;
-- 生成后镜像
SELECT * FROM product WHERE id=1; 全局锁实现逻辑

// GlobalLockInterceptor核心代码
public Object invoke(MethodInvocation invocation) {
    if (isGlobalLockRequired()) {
      // 获取全局锁
      GlobalLockHelper.lock(businessKey);
    }
    return invocation.proceed();
} 1.2 TCC模式开发规范

三阶段模板方法

@LocalTCC
public interface OrderTccAction {
    @TwoPhaseBusinessAction(name = "prepareCreateOrder",
                        commitMethod = "commit",
                        rollbackMethod = "rollback")
    boolean prepare(BusinessActionContext actionContext,
                   @BusinessActionContextParameter(paramName = "orderId") String orderId);
   
    boolean commit(BusinessActionContext actionContext);
    boolean rollback(BusinessActionContext actionContext);
} TCC防悬挂方案

// 空回滚检查
if (actionContext.getActionContext("orderId") == null) {
    throw new TccAvoidHangingException();
} 2. 生产环境优化方案

2.1 高可用摆设架构

DB存储模式设置

registry.conf
store {
mode = "db"
db {
    datasource = "druid"
    url = "jdbc:mysql://tc-cluster:3306/seata"
    user = "seata"
    password = "encrypted_pwd"
}
} TC集群摆设方案

docker-compose.yml
seata-server:
image: seataio/seata-server:1.7.0
environment:
    ◦ SEATA_IP=192.168.1.100

    ◦ SEATA_PORT=8091

    ◦ STORE_MODE=db

volumes:
    ◦ ./registry.conf:/seata-server/resources/registry.conf
2.2 事务分组策略

分组路由规则

application.properties
spring.cloud.alibaba.seata.tx-service-group=order-service-group
seata.tx-service-group.default.grouplist=192.168.1.101:8091,192.168.1.102:8091 集群负载均衡

Begin
Commit
TM
TC1
TC2
DB1
DB2
3. 口试实战题

3.1 AT模式防脏写方案

全局锁校验流程

// AbstractConnectionProxy检查逻辑
public boolean checkGlobalLock(String tableName, String pk) {
    return SELECT * FROM lock_table
         WHERE table_name=#{tableName} AND pk=#{pk} FOR UPDATE;
} 非常处置惩罚场景

非常类型触发条件办理方案脏写全局锁获取失败回滚当前分支事务脏读未提交数据被读取默认隔离级别为Read Committed 3.2 TCC模式常见问题

空回滚处置惩罚模板

@Transactional
public boolean rollback(BusinessActionContext context) {
    if (!isTryPhaseExecuted(context.getXid())) { // 检查try阶段是否执行
      // 记录空回滚标记
      insertNullRollbackRecord(context.getXid());
      return true;
    }
    // 正常回滚逻辑
} 幂等性保障方案

-- 控制表设计
CREATE TABLE tcc_control (
    xid VARCHAR(128) PRIMARY KEY,
    action_name VARCHAR(64),
    status TINYINT,
    gmt_modified DATETIME
); 五、分布式消息通讯:RocketMQ

1. Spring Cloud Stream整合

1.1 消息发布/订阅模子

Binder设置模板

```yaml
application.yml
spring:
cloud:
    stream:
      bindings:
      orderOutput: # 生产者通道
          destination: ORDER_TOPIC
          content-type: application/json
      paymentInput: # 消费者通道
          destination: PAYMENT_TOPIC
          group: payment-group
          consumer:
            concurrency: 3 # 并发线程数

      rocketmq:
      binder:
          namesrv-addr: 192.168.1.100:9876 事务消息实战

// 事务消息发送模板
@Transactional
public void createOrderWithTransaction(Order order) {
    // 1. 本地事务
    orderMapper.insert(order);
   
    // 2. 发送事务消息
    rocketMQTemplate.sendMessageInTransaction(
      "order-tx-group",
      MessageBuilder.withPayload(order)
            .setHeader("order_id", order.getId())
            .build(),
      null
    );
}

// 事务监听器
@RocketMQTransactionListener(txProducerGroup="order-tx-group")
public class OrderTransactionListenerImpl implements RocketMQLocalTransactionListener {
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
      // 执行本地事务
      return RocketMQLocalTransactionState.COMMIT;
    }
} 2. 生产级可靠性保障

2.1 消息高可用机制

Broker集群摆设方案

broker-a.properties
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
namesrvAddr=192.168.1.100:9876
defaultTopicQueueNums=8
storePathRootDir=/rocketmq/store-a
enableDLegerCommitLog=true
dLegerGroup=DLedgerGroup00
dLegerPeers=n0-192.168.1.101:40911;n1-192.168.1.102:40911 消息存储架构

Write
Producer
CommitLog
ConsumeQueue
Consumer
IndexFile
2.2 死信队列处置惩罚

重试策略设置

// 消费者重试配置
@Bean
public ConsumerFactory<String, Object> consumerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 300000);
    props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 10);
    return new DefaultKafkaConsumerFactory<>(props);
}

// 死信队列监听
@StreamListener("inputDlq")
public void handleDlq(Message<?> message) {
    // 人工处理逻辑
    log.error("DLQ Message: {}", message.getPayload());
} 3. 口试常见问题

3.1 消息零丢失保障方案

全链路防护措施

环节措施实现方式生产者事务消息+当地表半消息机制+当地事务表Broker同步刷盘+主从复制设置flushDiskType=SYNC_FLUSH和brokerRole=SYNC_MASTER消费者手动ACK+重试队列关闭autoCommit,非常时返回RECONSUME_LATER 关键设置示例

// 生产者可靠发送
rocketMQTemplate.setVipChannelEnabled(false); // 避免VIP通道问题
rocketMQTemplate.setRetryTimesWhenSendFailed(3);

// 消费者可靠消费
@RocketMQMessageListener(
    consumerGroup = "order-group",
    topic = "ORDER_TOPIC",
    consumeMode = ConsumeMode.ORDERLY,// 顺序消费
    messageModel = MessageModel.CLUSTERING
)
public class OrderConsumer implements RocketMQListener<Order> {
    @Override
    public void onMessage(Order order) {
      try {
            process(order);
      } catch (Exception e) {
            throw new RocketMQConsumeException("消费失败,稍后重试");
      }
    }
} 3.2 消息堆积办理方案

紧急处置惩罚四步法


[*] 扩容消费者
spring:
cloud:
    stream:
      bindings:
      input:
          consumer:
            concurrency: 10 # 提升并发线程数
[*] 批量消费模式
@Bean
public Consumer<List<Message<Order>>> batchConsumer() {
    return messages -> {
      // 批量处理逻辑
      orderService.batchProcess(messages);
    };
}
[*] 跳过非关键消息
// 消息过滤配置
rocketMQTemplate.setMessageQueueSelector((mqs, msg, arg) -> {
    if (isCritical(msg)) return mqs;
    return mqs; // 非关键消息路由到低优先级队列
});
[*] 离线补偿处置惩罚
-- 建立积压消息临时表
CREATE TABLE backlog_messages (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    msg_id VARCHAR(64),
    body JSON,
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
六、API网关:Spring Cloud Gateway与Alibaba整合

1. 网关核心功能扩展

1.1 Sentinel网关流控

流控规则设置

```yaml
网关流控规则(通过Nacos配置中心下发)
spring:
cloud:
    gateway:
      routes:
      ▪ id: order-service

          uri: lb://order-service
          predicates:
            ▪ Path=/api/order/**

          filters:
            ▪ name: RequestRateLimiter

            args:
                redis-rate-limiter.replenishRate: 100
                redis-rate-limiter.burstCapacity: 200
            ▪ name: Sentinel

            args:
                resource: gateway:order-service
                fallback: forward:/fallback 自定义流控非常处置惩罚

@Bean
public SentinelGatewayBlockExceptionHandler sentinelBlockHandler() {
    return (exchange, ex) -> {
      Map<String,String> error = Map.of(
            "code", "429",
            "message", "请求过于频繁"
      );
      return Mono.just(error)
            .flatMap(data -> {
                exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
                return exchange.getResponse().writeWith(
                  Mono.just(exchange.getResponse()
                        .bufferFactory()
                        .wrap(JSON.toJSONBytes(data)))
                );
            });
    };
} 1.2 Nacos动态路由

路由设置主动更新

@RefreshScope
@Configuration
public class DynamicRouteConfig {
   
    @Autowired
    private NacosConfigManager configManager;

    @Bean
    public RouteDefinitionRepository nacosRouteDefinitionRepository() {
      return new NacosRouteDefinitionRepository(
            configManager,
            "gateway-routes",// Nacos Data ID
            "DEFAULT_GROUP"
      ) {
            @Override
            public Flux<RouteDefinition> getRouteDefinitions() {
                // 监听Nacos配置变化
                return super.getRouteDefinitions()
                  .doOnNext(route -> log.info("路由更新: {}", route));
            }
      };
    }
} 服务上下线主动感知

NacosGatewayService注册/下线实例推送服务变更变乱刷新路由缓存NacosGatewayService
2. 安全与性能优化

2.1 JWT鉴权实现

过滤器链设置

public class JwtAuthFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
      String token = exchange.getRequest()
            .getHeaders()
            .getFirst("Authorization");
      
      if (!JwtUtils.validateToken(token)) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
      }
      
      return chain.filter(exchange);
    }
} OAuth2中继模式

spring:
security:
    oauth2:
      client:
      provider:
          keycloak:
            issuer-uri: http://auth-server/auth/realms/demo
      registration:
          gateway-client:
            provider: keycloak
            client-id: gateway
            client-secret: secret
            authorization-grant-type: client_credentials 2.2 高性能缓存策略

相应缓存设置

@Bean
public RouteLocator cachedRoutes(RouteLocatorBuilder builder) {
    return builder.routes()
      .route("product-service", r -> r.path("/api/product/**")
            .filters(f -> f.cache(
                CacheConfig.of()
                  .setSize(1000)
                  .setTimeToLive(Duration.ofMinutes(10))
            ))
            .uri("lb://product-service"))
      .build();
} 请求归并示例

@PostMapping("/batch")
public Mono<List<Product>> batchQuery(@RequestBody List<String> ids) {
    return Flux.fromIterable(ids)
      .flatMap(id -> productService.getById(id))
      .collectList();
} 3. 口试题解析

3.1 灰度发布实现方案

基于Header的路由策略

spring:
cloud:
    gateway:
      routes:
      ▪ id: canary-route

          uri: lb://new-service
          predicates:
            ▪ Path=/api/**

            ▪ Header=X-Canary, true

      ▪ id: primary-route

          uri: lb://old-service
          predicates:
            ▪ Path=/api/**
权重分流设置

@Bean
public RouteLocator weightRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
      .route("weight-high", r -> r.weight("service-group", 80)
            .uri("lb://new-service"))
      .route("weight-low", r -> r.weight("service-group", 20)
            .uri("lb://old-service"))
      .build();
} 3.2 过滤器扩展实战

自定义过滤器示例

public class LoggingFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
      long startTime = System.currentTimeMillis();
      return chain.filter(exchange)
            .then(Mono.fromRunnable(() -> {
                long duration = System.currentTimeMillis() - startTime;
                log.info("请求耗时: {}ms - {}", duration, exchange.getRequest().getURI());
            }));
    }
}

// 注册过滤器
@Bean
public RouteLocator customRoute(RouteLocatorBuilder builder) {
    return builder.routes()
      .route(r -> r.path("/custom/**")
            .filters(f -> f.filter(new LoggingFilter()))
            .uri("lb://custom-service"))
      .build();
} 过滤器执行顺序
过滤器类型默认顺序典范用途Global Pre-1000认证/限流Route Filter0路由级修改Global Post1000日志/指标收集Error Handling最高优先级非常处置惩罚 七、进阶实战与性能调优

1. 微服务全链路监控

1.1 SkyWalking深度集成

Trace ID透传方案

```java
// 手动埋点示例
@RestController
public class OrderController {
    @GetMapping("/orders")
    public List<Order> listOrders(@RequestHeader(value = "sw8", required = false) String traceId) {
      // 跨服务传递Trace ID
      return restTemplate.exchange("http://payment-service/payments",
            HttpMethod.GET,
            new HttpEntity<>(createHeadersWithTrace(traceId)),
            List.class);
    }

    private HttpHeaders createHeadersWithTrace(String traceId) {
      HttpHeaders headers = new HttpHeaders();
      if (traceId != null) {
            headers.add("sw8", traceId); // SkyWalking Header规范
      }
      return headers;
    }
} 性能分析设置

agent.config
agent.service_name=${SW_SERVICE_NAME:order-service}
collector.backend_service=${SW_GRPC:skywalking-oap:11800}
sampler.rate=${SW_SAMPLER_RATE:5000} # 采样率
logging.level=${SW_LOGGING_LEVEL:INFO} 1.2 Prometheus指标埋点

自定义业务指标

@RestController
public class MetricsController {
    private final Counter orderCounter = Counter.build()
      .name("order_create_total")
      .help("Total orders created")
      .register();

    @PostMapping("/orders")
    public Order createOrder() {
      orderCounter.inc(); // 指标计数
      return orderService.create();
    }
} Grafana监控看板

-- 订单成功率查询
100 - (sum(rate(http_server_requests_errors_total{application="$application"}))
/ sum(rate(http_server_requests_total{application="$application"})) * 100) 2. 云原生环境适配

2.1 Kubernetes摆设方案

Nacos集群StatefulSet设置

nacos-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
spec:
serviceName: nacos-headless
replicas: 3
template:
    spec:
      containers:
      ◦ name: nacos

      image: nacos/nacos-server:2.2.3
      env:
      ▪ name: MODE

          value: cluster
      ▪ name: SPRING_DATASOURCE_PLATFORM

          value: mysql
      ▪ name: MYSQL_SERVICE_HOST

          value: "mysql-service" 服务网格Sidecar注入

istio-sidecar-injection.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
annotations:
    sidecar.istio.io/inject: "true" # 自动注入Envoy
spec:
template:
    metadata:
      labels:
      app: order-service 3. 生产环境踩坑指南

3.1 Nacos客户端重试机制

重试策略设置

application.properties
spring.cloud.nacos.discovery.fail-fast=true
spring.cloud.nacos.discovery.retry.max-attempts=5
spring.cloud.nacos.discovery.retry.initial-interval=1000
spring.cloud.nacos.discovery.retry.multiplier=1.5 重试过程日志分析

2023-08-20 14:00:00 第1次重试连接Nacos服务器...
2023-08-20 14:00:01 第2次重试(间隔1500ms)...
2023-08-20 14:00:03 连接成功! 3.2 Sentinel规则长期化问题

常见故障场景

问题征象根本缘故起因办理方案规则频繁丢失Nacos长轮询超时调整config.long-poll-timeout=30000部门节点规则差异步网络分区启用TCP健康检查控制台修改不生效未开启push模式设置sentinel.dashboard.push=127.0.0.1:8080 调试命令

检查规则是否持久化到Nacos
curl -X GET "http://nacos-server:8848/nacos/v1/cs/configs?dataId=sentinel-rule&group=DEFAULT_GROUP" 八、求职口试专题突破

1. 计划类问题

1.1 亿级电商架构计划

高可用架构方案

```mermaid
graph TD
    A[客户端] --> B
    B --> C
    C --> D[服务网格]
    D --> E[核心服务集群]
    E --> F[分布式缓存]
    F --> G[分库分表]
    G --> H[异地多活]

    style A fill:#f9f,stroke:#333
    style H fill:#bbf,stroke:#333 关键组件选型

场景技能栈优化要点秒杀体系Sentinel+Redis+Lua当地缓存+令牌桶限流订单中心Seata AT模式+分库分表热点数据分离商品详情RocketMQ+当地缓存多级缓存策略 1.2 Seata性能优化

跨库事务优化方案

// 批量操作优化
@GlobalTransactional
public void batchProcess(List<Order> orders) {
    // 1. 开启并行模式
    orders.parallelStream().forEach(order -> {
      // 2. 本地事务表批量插入
      orderMapper.batchInsert(order);
    });
   
    // 3. 异步提交全局事务
    CompletableFuture.runAsync(() -> {
      GlobalTransactionContext.reload(RootContext.getXID()).commit();
    });
} 2. 源码级深挖

2.1 Nacos心跳机制

核心源码路径

// ClientBeatCheckTask.run()
public void run() {
    // 心跳间隔动态调整(默认5s)
    long nextTime = calculateNextTime();
    // 心跳数据包构造
    BeatInfo beatInfo = buildBeatInfo();
    // 异步发送心跳
    beatReactor.sendBeat(beatInfo);
}

// NacosNamingService.registerInstance()
public void registerInstance(...) {
    // 首次注册立即发送心跳
    beatReactor.addBeatInfo(serviceName, beatInfo);
} 心跳非常处置惩罚

@startuml
participant Client
participant Server

Client -> Server: 发送心跳
alt 正常响应
    Server --> Client: OK
else 超时未响应
    Client -> Client: 指数退避重试
end
@enduml 2.2 Sentinel滑动窗口

算法实现核心

// ArrayMetric.leapWindow
public void add(long currentTime, int count) {
    // 1. 计算时间窗口下标
    int idx = calculateTimeIdx(currentTime);
    // 2. 更新窗口计数
    WindowWrap<MetricBucket> old = array.get(idx);
    if (old == null || !old.isTimeInWindow(currentTime)) {
      // 创建新窗口
      array.compareAndSet(idx, old, new WindowWrap<>(...));
    }
    old.value().add(count);
}

// StatisticNode.avgRt
public double avgRt() {
    // 滑动聚合计算
    return rollingCounterInMinute.avgTime() * 60.0 / rollingCounterInMinute.totalCount();
} 3. 场景开放题

3.1 微服务雪崩办理方案

全链路防护体系

多级防护配置
spring:
cloud:
    sentinel:
      flow:
      qps-threshold: 1000 # 入口QPS限制
      circuit:
      rules:
          ▪ resource: paymentApi

            strategy: SlowRequestRatio
            threshold: 0.5 # 慢调用比例
      system:
      highestSystemLoad: 4.0 # 系统负载保护 应急处置惩罚流程


[*] 流量控制:立刻降级非核心服务
[*] 日志分析:通过SkyWalking定位瓶颈点
[*] 渐进恢复:逐步放开限流阈值
3.2 迁移挑战与方案

关键挑战对比

迁移难点Netflix方案Alibaba方案服务发现Eureka静态集群Nacos动态分区设置管理Config+Bus手动刷新Nacos主动推送事务支持无Seata完整方案 迁移实行步骤

评估现有架构
组件替代方案计划
灰度迁移测试
监控对比验证
全量切换

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 5.2.Spring Cloud Alibaba生态