5.2.Spring Cloud Alibaba生态

打印 上一主题 下一主题

主题 1712|帖子 1712|积分 5136

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次

一、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的深度对比

功能覆盖差异

  1. ```java
  2. // 典型配置差异示例
  3. @Configuration
  4. // Netflix方式
  5. @EnableCircuitBreaker  
  6. // Alibaba方式
  7. @EnableSentinel  
  8. 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 阿里系中间件整合价值

双十一验证的技能矩阵

  1. [/code] 高并发
  2. Nacos百万级实例注册
  3. Sentinel百万QPS限流
  4. RocketMQ万亿级消息堆积
  5. [size=2][b]企业级加强特性[/b][/size]
  6. • [b]Nacos[/b]:
  7. [list]
  8. [*] 设置版本回滚(类似Git的版本控制)
  9. [*] 监听查询(精确追踪设置变更汗青)
  10. [/list] [code]-- Nacos配置历史表结构
  11. SELECT * FROM his_config_info
  12. WHERE data_id='order-service.yml'
  13. ORDER BY id DESC LIMIT 5;
复制代码

2. 核心组件矩阵与选型指南

2.1 注册中心选型决策树

Nacos vs Eureka vs Consul

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

  1. public class RegistrySelection {
  2.     public static String choose(boolean needConfigCenter, boolean multiDC) {
  3.         if (needConfigCenter) return "Nacos";
  4.         return multiDC ? "Consul" : "Eureka";
  5.     }
  6. }
复制代码
2.2 熔断组件性能对比

Sentinel vs Hystrix基准测试

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

  1. // Hystrix线程池隔离
  2. @HystrixCommand(threadPoolKey = "orderThread")
  3. public Order getOrder() {...}
  4. // Sentinel信号量隔离
  5. @SentinelResource(value = "orderResource",
  6.                  blockHandler = "flowBlockHandler")
  7. 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 依赖管理最佳实践

  1. <!-- 父pom定义 -->
  2. <dependencyManagement>
  3.     <dependencies>
  4.         <dependency>
  5.             <groupId>com.alibaba.cloud</groupId>
  6.             <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  7.             <version>2021.0.5.0</version>
  8.             <type>pom</type>
  9.             <scope>import</scope>
  10.         </dependency>
  11.     </dependencies>
  12. </dependencyManagement>
复制代码
3.2 当地开发环境搭建

最小化启动设置

  1. bootstrap.yml
  2. spring:
  3.   application:
  4.     name: demo-service
  5.   cloud:
  6.     nacos:
  7.       discovery:
  8.         server-addr: localhost:8848
  9.       config:
  10.         server-addr: localhost:8848
  11.         file-extension: yaml
  12.         group: DEFAULT_GROUP
复制代码
关键依赖清单

  1. <!-- 必须依赖 -->
  2. <dependency>
  3.     <groupId>com.alibaba.cloud</groupId>
  4.     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>
  6. <dependency>
  7.     <groupId>com.alibaba.cloud</groupId>
  8.     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  9. </dependency>
复制代码
二、服务注册与设置中心:Nacos


1. Nacos核心功能实战

1.1 动态服务注册与发现

多集群隔离设置

  1. ```yaml
  2. application-cluster.yml
  3. spring:
  4.   cloud:
  5.     nacos:
  6.       discovery:
  7.         cluster-name: ${NACOS_CLUSTER:SHANGHAI_A}  # 集群名称
  8.         namespace: ${NACOS_NAMESPACE:DEV}          # 命名空间隔离
  9.         group: ${NACOS_GROUP:ORDER_GROUP}          # 业务分组
复制代码
服务注册源码解析

  1. // NacosServiceRegistry自动注册流程
  2. public class NacosAutoServiceRegistration {
  3.     @EventListener(WebServerInitializedEvent.class)
  4.     public void register() {
  5.         // 核心注册方法
  6.         namingService.registerInstance(
  7.             applicationName,
  8.             instance.setClusterName(clusterName)
  9.         );
  10.     }
  11. }
复制代码
1.2 设置热更新机制

@RefreshScope底层原理

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

  1. @RestController
  2. @RefreshScope
  3. public class ConfigController {
  4.     @Value("${order.timeout:5000}")
  5.     private Integer timeout;  // 配置变更后自动更新
  6.    
  7.     @GetMapping("/timeout")
  8.     public Integer getTimeout() {
  9.         return timeout;
  10.     }
  11. }
复制代码

2. 高可用生产级摆设

2.1 集群化摆设架构

MySQL长期化方案

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

  1. 启动命令示例
  2. java -Dnacos.standalone=false \
  3.      -Dnacos.mysql.url=jdbc:mysql://db-cluster:3306/nacos_config \
  4.      -Dnacos.mysql.user=nacos \
  5.      -Dnacos.mysql.password=encrypted_password \
  6.      -jar nacos-server.jar
复制代码
2.2 灰度发布流程

  1. [/code] 是
  2. 创建灰度设置
  3. 关联特定IP/标签
  4. 验证通过?
  5. 全量发布
  6. 回滚版本
  7. [hr] [size=4][b]3. 口试高频问题[/b][/size]
  8. [size=3][b]3.1 CP/AP模式切换原理[/b][/size]
  9. [size=2][b]Raft协议实现CP[/b][/size]
  10. [code]// Nacos的Distro协议处理类
  11. public class DistroProtocol {
  12.     // AP模式下数据同步
  13.     public void sync(DistroKey key, byte[] data) {
  14.         // 异步广播给其他节点
  15.     }
  16. }
复制代码
模式切换设置

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

长轮询流程

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

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


1. 流量控制与熔断降级

1.1 熔断规则三维控制体系

规则设置模板

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

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

热点规则设置

  1. @SentinelResource(
  2.     value = "queryUser",
  3.     blockHandler = "paramFlowBlockHandler",
  4.     fallback = "userFallback"
  5. )
  6. public User queryUser(@RequestParam String userId) {...}
  7. // 热点参数规则
  8. ParamFlowRule rule = new ParamFlowRule("queryUser")
  9.     .setParamIdx(0) // 第一个参数
  10.     .setCount(100); // 单参数阈值
复制代码
体系自顺应掩护

  1. // 全局系统规则配置
  2. SystemRule systemRule = new SystemRule()
  3.     .setHighestSystemLoad(4.0) // max load
  4.     .setAvgRt(200)             // 平均RT(ms)
  5.     .setMaxThread(800)         // 最大线程数
  6.     .setQps(5000);             // 全局QPS
复制代码

2. 规则长期化与生产实践

2.1 Nacos动态规则推送

设置中心数据结构

  1. {
  2.   "resource": "paymentApi",
  3.   "controlBehavior": 0,
  4.   "count": 100,
  5.   "grade": 1,
  6.   "strategy": 0
  7. }
复制代码
主动推送原理

  1. [/code] Sentinel DashboardNacos微服务Sentinel发布规则设置设置变更通知动态加载新规则Sentinel DashboardNacos微服务Sentinel
  2. [size=3][b]2.2 集群限流摆设方案[/b][/size]
  3. [size=2][b]Token Server模式[/b][/size]
  4. [code]application-cluster.yaml
  5. spring:
  6.   cloud:
  7.     sentinel:
  8.       transport:
  9.         dashboard: sentinel-dashboard:8080
  10.       filter:
  11.         enabled: false
  12.       # 集群配置
  13.       cluster:
  14.         server:
  15.           host: 192.168.1.10
  16.           port: 18730
  17.         client:
  18.           server-ip: 192.168.1.10
  19.           request-timeout: 200
复制代码
集群流控算法

  1. // 集群请求处理逻辑
  2. public class ClusterFlowChecker {
  3.     public boolean allowCheck(FlowRule rule, int count) {
  4.         // 向Token Server申请令牌
  5.         return acquireClusterToken(rule, count);
  6.     }
  7. }
复制代码

3. 口试聚焦

3.1 线程隔离模子对比

Hystrix线程池隔离

  1. @HystrixCommand(
  2.     threadPoolKey = "orderThread",
  3.     threadPoolProperties = {
  4.         @HystrixProperty(name="coreSize", value="20")
  5.     }
  6. )
  7. public Order getOrder() {...}  // 每个命令独立线程池
复制代码
Sentinel信号量隔离

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

链路维度限流

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

  1. 网关路由规则
  2. spring:
  3.   cloud:
  4.     gateway:
  5.       routes:
  6.         ▪ id: payment_route
  7.           uri: lb://payment-service
  8.           predicates:
  9.             ▪ Path=/payment/**
  10.           filters:
  11.             ▪ name: RequestRateLimiter
  12.               args:
  13.                 redis-rate-limiter.replenishRate: 100
  14.                 redis-rate-limiter.burstCapacity: 200
复制代码
四、分布式事务:Seata


1. 事务模式深度解析

1.1 AT模式核心机制

Undo Log工作原理

  1. ```sql
  2. -- 业务操作前镜像
  3. SELECT * FROM product WHERE id=1 FOR UPDATE;
  4. -- 执行业务SQL
  5. UPDATE product SET stock=stock-1 WHERE id=1;
  6. -- 生成后镜像
  7. SELECT * FROM product WHERE id=1;
复制代码
全局锁实现逻辑

  1. // GlobalLockInterceptor核心代码
  2. public Object invoke(MethodInvocation invocation) {
  3.     if (isGlobalLockRequired()) {
  4.         // 获取全局锁
  5.         GlobalLockHelper.lock(businessKey);
  6.     }
  7.     return invocation.proceed();
  8. }
复制代码
1.2 TCC模式开发规范

三阶段模板方法

  1. @LocalTCC
  2. public interface OrderTccAction {
  3.     @TwoPhaseBusinessAction(name = "prepareCreateOrder",
  4.                           commitMethod = "commit",
  5.                           rollbackMethod = "rollback")
  6.     boolean prepare(BusinessActionContext actionContext,
  7.                    @BusinessActionContextParameter(paramName = "orderId") String orderId);
  8.    
  9.     boolean commit(BusinessActionContext actionContext);
  10.     boolean rollback(BusinessActionContext actionContext);
  11. }
复制代码
TCC防悬挂方案

  1. // 空回滚检查
  2. if (actionContext.getActionContext("orderId") == null) {
  3.     throw new TccAvoidHangingException();
  4. }
复制代码

2. 生产环境优化方案

2.1 高可用摆设架构

DB存储模式设置

  1. registry.conf
  2. store {
  3.   mode = "db"
  4.   db {
  5.     datasource = "druid"
  6.     url = "jdbc:mysql://tc-cluster:3306/seata"
  7.     user = "seata"
  8.     password = "encrypted_pwd"
  9.   }
  10. }
复制代码
TC集群摆设方案

  1. docker-compose.yml
  2. seata-server:
  3.   image: seataio/seata-server:1.7.0
  4.   environment:
  5.     ◦ SEATA_IP=192.168.1.100
  6.     ◦ SEATA_PORT=8091
  7.     ◦ STORE_MODE=db
  8.   volumes:
  9.     ◦ ./registry.conf:/seata-server/resources/registry.conf
复制代码
2.2 事务分组策略

分组路由规则

  1. application.properties
  2. spring.cloud.alibaba.seata.tx-service-group=order-service-group
  3. seata.tx-service-group.default.grouplist=192.168.1.101:8091,192.168.1.102:8091
复制代码
集群负载均衡

  1. [/code] Begin
  2. Commit
  3. TM
  4. TC1
  5. TC2
  6. DB1
  7. DB2
  8. [hr] [size=4][b]3. 口试实战题[/b][/size]
  9. [size=3][b]3.1 AT模式防脏写方案[/b][/size]
  10. [size=2][b]全局锁校验流程[/b][/size]
  11. [code]// AbstractConnectionProxy检查逻辑
  12. public boolean checkGlobalLock(String tableName, String pk) {
  13.     return SELECT * FROM lock_table
  14.            WHERE table_name=#{tableName} AND pk=#{pk} FOR UPDATE;
  15. }
复制代码
非常处置惩罚场景

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

空回滚处置惩罚模板

  1. @Transactional
  2. public boolean rollback(BusinessActionContext context) {
  3.     if (!isTryPhaseExecuted(context.getXid())) { // 检查try阶段是否执行
  4.         // 记录空回滚标记
  5.         insertNullRollbackRecord(context.getXid());
  6.         return true;
  7.     }
  8.     // 正常回滚逻辑
  9. }
复制代码
幂等性保障方案

  1. -- 控制表设计
  2. CREATE TABLE tcc_control (
  3.     xid VARCHAR(128) PRIMARY KEY,
  4.     action_name VARCHAR(64),
  5.     status TINYINT,
  6.     gmt_modified DATETIME
  7. );
复制代码
五、分布式消息通讯:RocketMQ


1. Spring Cloud Stream整合

1.1 消息发布/订阅模子

Binder设置模板

  1. ```yaml
  2. application.yml
  3. spring:
  4.   cloud:
  5.     stream:
  6.       bindings:
  7.         orderOutput: # 生产者通道
  8.           destination: ORDER_TOPIC
  9.           content-type: application/json
  10.         paymentInput: # 消费者通道  
  11.           destination: PAYMENT_TOPIC
  12.           group: payment-group
  13.           consumer:
  14.             concurrency: 3 # 并发线程数
  15.       rocketmq:
  16.         binder:
  17.           namesrv-addr: 192.168.1.100:9876
复制代码
事务消息实战

  1. // 事务消息发送模板
  2. @Transactional
  3. public void createOrderWithTransaction(Order order) {
  4.     // 1. 本地事务
  5.     orderMapper.insert(order);
  6.    
  7.     // 2. 发送事务消息
  8.     rocketMQTemplate.sendMessageInTransaction(
  9.         "order-tx-group",
  10.         MessageBuilder.withPayload(order)
  11.             .setHeader("order_id", order.getId())
  12.             .build(),
  13.         null
  14.     );
  15. }
  16. // 事务监听器
  17. @RocketMQTransactionListener(txProducerGroup="order-tx-group")
  18. public class OrderTransactionListenerImpl implements RocketMQLocalTransactionListener {
  19.     @Override
  20.     public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
  21.         // 执行本地事务
  22.         return RocketMQLocalTransactionState.COMMIT;
  23.     }
  24. }
复制代码

2. 生产级可靠性保障

2.1 消息高可用机制

Broker集群摆设方案

  1. broker-a.properties
  2. brokerClusterName=DefaultCluster
  3. brokerName=broker-a
  4. brokerId=0
  5. namesrvAddr=192.168.1.100:9876
  6. defaultTopicQueueNums=8
  7. storePathRootDir=/rocketmq/store-a
  8. enableDLegerCommitLog=true
  9. dLegerGroup=DLedgerGroup00
  10. dLegerPeers=n0-192.168.1.101:40911;n1-192.168.1.102:40911
复制代码
消息存储架构

  1. [/code] Write
  2. Producer
  3. CommitLog
  4. ConsumeQueue
  5. Consumer
  6. IndexFile
  7. [size=3][b]2.2 死信队列处置惩罚[/b][/size]
  8. [size=2][b]重试策略设置[/b][/size]
  9. [code]// 消费者重试配置
  10. @Bean
  11. public ConsumerFactory<String, Object> consumerFactory() {
  12.     Map<String, Object> props = new HashMap<>();
  13.     props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 300000);
  14.     props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 10);
  15.     return new DefaultKafkaConsumerFactory<>(props);
  16. }
  17. // 死信队列监听
  18. @StreamListener("inputDlq")
  19. public void handleDlq(Message<?> message) {
  20.     // 人工处理逻辑
  21.     log.error("DLQ Message: {}", message.getPayload());
  22. }
复制代码

3. 口试常见问题

3.1 消息零丢失保障方案

全链路防护措施

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

  1. // 生产者可靠发送
  2. rocketMQTemplate.setVipChannelEnabled(false); // 避免VIP通道问题
  3. rocketMQTemplate.setRetryTimesWhenSendFailed(3);
  4. // 消费者可靠消费
  5. @RocketMQMessageListener(
  6.     consumerGroup = "order-group",
  7.     topic = "ORDER_TOPIC",
  8.     consumeMode = ConsumeMode.ORDERLY,  // 顺序消费
  9.     messageModel = MessageModel.CLUSTERING
  10. )
  11. public class OrderConsumer implements RocketMQListener<Order> {
  12.     @Override
  13.     public void onMessage(Order order) {
  14.         try {
  15.             process(order);
  16.         } catch (Exception e) {
  17.             throw new RocketMQConsumeException("消费失败,稍后重试");
  18.         }
  19.     }
  20. }
复制代码
3.2 消息堆积办理方案

紧急处置惩罚四步法


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


1. 网关核心功能扩展

1.1 Sentinel网关流控

流控规则设置

  1. ```yaml
  2. 网关流控规则(通过Nacos配置中心下发)
  3. spring:
  4.   cloud:
  5.     gateway:
  6.       routes:
  7.         ▪ id: order-service
  8.           uri: lb://order-service
  9.           predicates:
  10.             ▪ Path=/api/order/**
  11.           filters:
  12.             ▪ name: RequestRateLimiter
  13.               args:
  14.                 redis-rate-limiter.replenishRate: 100
  15.                 redis-rate-limiter.burstCapacity: 200
  16.             ▪ name: Sentinel
  17.               args:
  18.                 resource: gateway:order-service
  19.                 fallback: forward:/fallback
复制代码
自定义流控非常处置惩罚

  1. @Bean
  2. public SentinelGatewayBlockExceptionHandler sentinelBlockHandler() {
  3.     return (exchange, ex) -> {
  4.         Map<String,String> error = Map.of(
  5.             "code", "429",
  6.             "message", "请求过于频繁"
  7.         );
  8.         return Mono.just(error)
  9.             .flatMap(data -> {
  10.                 exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
  11.                 return exchange.getResponse().writeWith(
  12.                     Mono.just(exchange.getResponse()
  13.                         .bufferFactory()
  14.                         .wrap(JSON.toJSONBytes(data)))
  15.                 );
  16.             });
  17.     };
  18. }
复制代码
1.2 Nacos动态路由

路由设置主动更新

  1. @RefreshScope
  2. @Configuration
  3. public class DynamicRouteConfig {
  4.    
  5.     @Autowired
  6.     private NacosConfigManager configManager;
  7.     @Bean
  8.     public RouteDefinitionRepository nacosRouteDefinitionRepository() {
  9.         return new NacosRouteDefinitionRepository(
  10.             configManager,
  11.             "gateway-routes",  // Nacos Data ID
  12.             "DEFAULT_GROUP"
  13.         ) {
  14.             @Override
  15.             public Flux<RouteDefinition> getRouteDefinitions() {
  16.                 // 监听Nacos配置变化
  17.                 return super.getRouteDefinitions()
  18.                     .doOnNext(route -> log.info("路由更新: {}", route));
  19.             }
  20.         };
  21.     }
  22. }
复制代码
服务上下线主动感知

  1. [/code] NacosGatewayService注册/下线实例推送服务变更变乱刷新路由缓存NacosGatewayService
  2. [hr] [size=4][b]2. 安全与性能优化[/b][/size]
  3. [size=3][b]2.1 JWT鉴权实现[/b][/size]
  4. [size=2][b]过滤器链设置[/b][/size]
  5. [code]public class JwtAuthFilter implements GlobalFilter {
  6.     @Override
  7.     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  8.         String token = exchange.getRequest()
  9.             .getHeaders()
  10.             .getFirst("Authorization");
  11.         
  12.         if (!JwtUtils.validateToken(token)) {
  13.             exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
  14.             return exchange.getResponse().setComplete();
  15.         }
  16.         
  17.         return chain.filter(exchange);
  18.     }
  19. }
复制代码
OAuth2中继模式

  1. spring:
  2.   security:
  3.     oauth2:
  4.       client:
  5.         provider:
  6.           keycloak:
  7.             issuer-uri: http://auth-server/auth/realms/demo
  8.         registration:
  9.           gateway-client:
  10.             provider: keycloak
  11.             client-id: gateway
  12.             client-secret: secret
  13.             authorization-grant-type: client_credentials
复制代码
2.2 高性能缓存策略

相应缓存设置

  1. @Bean
  2. public RouteLocator cachedRoutes(RouteLocatorBuilder builder) {
  3.     return builder.routes()
  4.         .route("product-service", r -> r.path("/api/product/**")
  5.             .filters(f -> f.cache(
  6.                 CacheConfig.of()
  7.                     .setSize(1000)
  8.                     .setTimeToLive(Duration.ofMinutes(10))
  9.             ))
  10.             .uri("lb://product-service"))
  11.         .build();
  12. }
复制代码
请求归并示例

  1. @PostMapping("/batch")
  2. public Mono<List<Product>> batchQuery(@RequestBody List<String> ids) {
  3.     return Flux.fromIterable(ids)
  4.         .flatMap(id -> productService.getById(id))
  5.         .collectList();
  6. }
复制代码

3. 口试题解析

3.1 灰度发布实现方案

基于Header的路由策略

  1. spring:
  2.   cloud:
  3.     gateway:
  4.       routes:
  5.         ▪ id: canary-route
  6.           uri: lb://new-service
  7.           predicates:
  8.             ▪ Path=/api/**
  9.             ▪ Header=X-Canary, true
  10.         ▪ id: primary-route  
  11.           uri: lb://old-service
  12.           predicates:
  13.             ▪ Path=/api/**
复制代码
权重分流设置

  1. @Bean
  2. public RouteLocator weightRouteLocator(RouteLocatorBuilder builder) {
  3.     return builder.routes()
  4.         .route("weight-high", r -> r.weight("service-group", 80)
  5.             .uri("lb://new-service"))
  6.         .route("weight-low", r -> r.weight("service-group", 20)
  7.             .uri("lb://old-service"))
  8.         .build();
  9. }
复制代码
3.2 过滤器扩展实战

自定义过滤器示例

  1. public class LoggingFilter implements GatewayFilter {
  2.     @Override
  3.     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  4.         long startTime = System.currentTimeMillis();
  5.         return chain.filter(exchange)
  6.             .then(Mono.fromRunnable(() -> {
  7.                 long duration = System.currentTimeMillis() - startTime;
  8.                 log.info("请求耗时: {}ms - {}", duration, exchange.getRequest().getURI());
  9.             }));
  10.     }
  11. }
  12. // 注册过滤器
  13. @Bean
  14. public RouteLocator customRoute(RouteLocatorBuilder builder) {
  15.     return builder.routes()
  16.         .route(r -> r.path("/custom/**")
  17.             .filters(f -> f.filter(new LoggingFilter()))
  18.             .uri("lb://custom-service"))
  19.         .build();
  20. }
复制代码
过滤器执行顺序
过滤器类型默认顺序典范用途Global Pre-1000认证/限流Route Filter0路由级修改Global Post1000日志/指标收集Error Handling最高优先级非常处置惩罚 七、进阶实战与性能调优


1. 微服务全链路监控

1.1 SkyWalking深度集成

Trace ID透传方案

  1. ```java
  2. // 手动埋点示例
  3. @RestController
  4. public class OrderController {
  5.     @GetMapping("/orders")
  6.     public List<Order> listOrders(@RequestHeader(value = "sw8", required = false) String traceId) {
  7.         // 跨服务传递Trace ID
  8.         return restTemplate.exchange("http://payment-service/payments",
  9.             HttpMethod.GET,
  10.             new HttpEntity<>(createHeadersWithTrace(traceId)),
  11.             List.class);
  12.     }
  13.     private HttpHeaders createHeadersWithTrace(String traceId) {
  14.         HttpHeaders headers = new HttpHeaders();
  15.         if (traceId != null) {
  16.             headers.add("sw8", traceId); // SkyWalking Header规范
  17.         }
  18.         return headers;
  19.     }
  20. }
复制代码
性能分析设置

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

自定义业务指标

  1. @RestController
  2. public class MetricsController {
  3.     private final Counter orderCounter = Counter.build()
  4.         .name("order_create_total")
  5.         .help("Total orders created")
  6.         .register();
  7.     @PostMapping("/orders")
  8.     public Order createOrder() {
  9.         orderCounter.inc(); // 指标计数
  10.         return orderService.create();
  11.     }
  12. }
复制代码
Grafana监控看板

  1. -- 订单成功率查询
  2. 100 - (sum(rate(http_server_requests_errors_total{application="$application"}[5m]))
  3.   / sum(rate(http_server_requests_total{application="$application"}[5m])) * 100)
复制代码

2. 云原生环境适配

2.1 Kubernetes摆设方案

Nacos集群StatefulSet设置

  1. nacos-statefulset.yaml
  2. apiVersion: apps/v1
  3. kind: StatefulSet
  4. metadata:
  5.   name: nacos
  6. spec:
  7.   serviceName: nacos-headless
  8.   replicas: 3
  9.   template:
  10.     spec:
  11.       containers:
  12.       ◦ name: nacos
  13.         image: nacos/nacos-server:2.2.3
  14.         env:
  15.         ▪ name: MODE
  16.           value: cluster
  17.         ▪ name: SPRING_DATASOURCE_PLATFORM
  18.           value: mysql
  19.         ▪ name: MYSQL_SERVICE_HOST
  20.           value: "mysql-service"
复制代码
服务网格Sidecar注入

  1. istio-sidecar-injection.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: order-service
  6.   annotations:
  7.     sidecar.istio.io/inject: "true" # 自动注入Envoy
  8. spec:
  9.   template:
  10.     metadata:
  11.       labels:
  12.         app: order-service
复制代码

3. 生产环境踩坑指南

3.1 Nacos客户端重试机制

重试策略设置

  1. application.properties
  2. spring.cloud.nacos.discovery.fail-fast=true
  3. spring.cloud.nacos.discovery.retry.max-attempts=5
  4. spring.cloud.nacos.discovery.retry.initial-interval=1000
  5. spring.cloud.nacos.discovery.retry.multiplier=1.5
复制代码
重试过程日志分析

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

常见故障场景

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

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


1. 计划类问题

1.1 亿级电商架构计划

高可用架构方案

  1. ```mermaid
  2. graph TD
  3.     A[客户端] --> B[SLB]
  4.     B --> C[API Gateway]
  5.     C --> D[服务网格]
  6.     D --> E[核心服务集群]
  7.     E --> F[分布式缓存]
  8.     F --> G[分库分表]
  9.     G --> H[异地多活]
  10.     style A fill:#f9f,stroke:#333
  11.     style H fill:#bbf,stroke:#333
复制代码
关键组件选型

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

跨库事务优化方案

  1. // 批量操作优化
  2. @GlobalTransactional
  3. public void batchProcess(List<Order> orders) {
  4.     // 1. 开启并行模式
  5.     orders.parallelStream().forEach(order -> {
  6.         // 2. 本地事务表批量插入
  7.         orderMapper.batchInsert(order);
  8.     });
  9.    
  10.     // 3. 异步提交全局事务
  11.     CompletableFuture.runAsync(() -> {
  12.         GlobalTransactionContext.reload(RootContext.getXID()).commit();
  13.     });
  14. }
复制代码

2. 源码级深挖

2.1 Nacos心跳机制

核心源码路径

  1. // ClientBeatCheckTask.run()
  2. public void run() {
  3.     // 心跳间隔动态调整(默认5s)
  4.     long nextTime = calculateNextTime();
  5.     // 心跳数据包构造
  6.     BeatInfo beatInfo = buildBeatInfo();
  7.     // 异步发送心跳
  8.     beatReactor.sendBeat(beatInfo);
  9. }
  10. // NacosNamingService.registerInstance()
  11. public void registerInstance(...) {
  12.     // 首次注册立即发送心跳
  13.     beatReactor.addBeatInfo(serviceName, beatInfo);
  14. }
复制代码
心跳非常处置惩罚

  1. @startuml
  2. participant Client
  3. participant Server
  4. Client -> Server: 发送心跳
  5. alt 正常响应
  6.     Server --> Client: OK
  7. else 超时未响应
  8.     Client -> Client: 指数退避重试
  9. end
  10. @enduml
复制代码
2.2 Sentinel滑动窗口

算法实现核心

  1. // ArrayMetric.leapWindow
  2. public void add(long currentTime, int count) {
  3.     // 1. 计算时间窗口下标
  4.     int idx = calculateTimeIdx(currentTime);
  5.     // 2. 更新窗口计数
  6.     WindowWrap<MetricBucket> old = array.get(idx);
  7.     if (old == null || !old.isTimeInWindow(currentTime)) {
  8.         // 创建新窗口
  9.         array.compareAndSet(idx, old, new WindowWrap<>(...));
  10.     }
  11.     old.value().add(count);
  12. }
  13. // StatisticNode.avgRt
  14. public double avgRt() {
  15.     // 滑动聚合计算
  16.     return rollingCounterInMinute.avgTime() * 60.0 / rollingCounterInMinute.totalCount();
  17. }
复制代码

3. 场景开放题

3.1 微服务雪崩办理方案

全链路防护体系

  1. 多级防护配置
  2. spring:
  3.   cloud:
  4.     sentinel:
  5.       flow:
  6.         qps-threshold: 1000 # 入口QPS限制
  7.       circuit:
  8.         rules:
  9.           ▪ resource: paymentApi
  10.             strategy: SlowRequestRatio
  11.             threshold: 0.5 # 慢调用比例
  12.       system:
  13.         highestSystemLoad: 4.0 # 系统负载保护
复制代码
应急处置惩罚流程


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

关键挑战对比

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

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表