IT评测·应用市场-qidao123.com技术社区
标题:
5.2.Spring Cloud Alibaba生态
[打印本页]
作者:
惊落一身雪
时间:
昨天 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 阿里系中间件整合价值
双十一验证的技能矩阵
[/code] 高并发
Nacos百万级实例注册
Sentinel百万QPS限流
RocketMQ万亿级消息堆积
[size=2][b]企业级加强特性[/b][/size]
• [b]Nacos[/b]:
[list]
[*] 设置版本回滚(类似Git的版本控制)
[*] 监听查询(精确追踪设置变更汗青)
[/list] [code]-- 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 灰度发布流程
[/code] 是
否
创建灰度设置
关联特定IP/标签
验证通过?
全量发布
回滚版本
[hr] [size=4][b]3. 口试高频问题[/b][/size]
[size=3][b]3.1 CP/AP模式切换原理[/b][/size]
[size=2][b]Raft协议实现CP[/b][/size]
[code]// 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
}
复制代码
主动推送原理
[/code] Sentinel DashboardNacos微服务Sentinel发布规则设置设置变更通知动态加载新规则Sentinel DashboardNacos微服务Sentinel
[size=3][b]2.2 集群限流摆设方案[/b][/size]
[size=2][b]Token Server模式[/b][/size]
[code]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
复制代码
集群负载均衡
[/code] Begin
Commit
TM
TC1
TC2
DB1
DB2
[hr] [size=4][b]3. 口试实战题[/b][/size]
[size=3][b]3.1 AT模式防脏写方案[/b][/size]
[size=2][b]全局锁校验流程[/b][/size]
[code]// 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
复制代码
消息存储架构
[/code] Write
Producer
CommitLog
ConsumeQueue
Consumer
IndexFile
[size=3][b]2.2 死信队列处置惩罚[/b][/size]
[size=2][b]重试策略设置[/b][/size]
[code]// 消费者重试配置
@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[0];
return mqs[1]; // 非关键消息路由到低优先级队列
});
复制代码
离线补偿处置惩罚
-- 建立积压消息临时表
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));
}
};
}
}
复制代码
服务上下线主动感知
[/code] NacosGatewayService注册/下线实例推送服务变更变乱刷新路由缓存NacosGatewayService
[hr] [size=4][b]2. 安全与性能优化[/b][/size]
[size=3][b]2.1 JWT鉴权实现[/b][/size]
[size=2][b]过滤器链设置[/b][/size]
[code]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"}[5m]))
/ sum(rate(http_server_requests_total{application="$application"}[5m])) * 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 [nacos-retry] 第1次重试连接Nacos服务器...
2023-08-20 14:00:01 [nacos-retry] 第2次重试(间隔1500ms)...
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
调试命令
检查规则是否持久化到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[SLB]
B --> C[API Gateway]
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完整方案
迁移实行步骤
[code][/code] 评估现有架构
组件替代方案计划
灰度迁移测试
监控对比验证
全量切换
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/)
Powered by Discuz! X3.4