上篇文章简单介绍了SpringCloud系列Gateway的基本用法以及Demo搭建,今天继续讲授下SpringCloud Gateway实战指南!在分享之前继续回首下本次SpringCloud的专题要讲的内容:
本教程demo源码已放入附件内
技术准备
读者须知:
- 本教程假设您已掌握SpringBoot基础开辟
- 接纳Spring Cloud Hoxton RELEASE版本
- 使用knife4j替代swagger作为API文档工具
- 本工程基于前文构建,建议先完成系列前五篇内容或直接获取源码:
系列回首:
- SpringCloud系列开篇
- Nacos服务注册与发现
- OpenFeign服务调用
- SpringCloud Gateway网关
焦点概念剖析
熔断机制的本质
想象一下家庭电路中的保险丝——当电流非常时主动熔断,掩护电器安全。在微服务架构中,熔断器(Circuit Breaker)饰演着类似的掩护角色:
- 工作原理:当服务调用失败率达到阈值时,主动切断请求链路
- 焦点代价:防止单个服务故障引发级联雪崩效应
- 典范场景:高并发下的服务掩护、非常流量控制
Sentinel框架剖析
作为阿里开源的流量治理组件,Sentinel(哨兵)为微服务提供:
- 精细管控:接口级别的流量控制与熔断降级
- 性能上风:相比Hystrix的线程池隔离,接纳用户线程模式淘汰上下文切换开销
- 动态配置:支持控制台实时调解限流规则
焦点特性对比:
特性SentinelHystrix隔离粒度接口级别服务级别规则配置动态实时生效静态配置监控 面板内置美满可视化需要扩展扩展性丰富SPI扩展点有限 实战整合指南
环境准备
- java -Dserver.port=8748 -Dcsp.sentinel.dashboard.server=localhost:8748 \
- -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.2.jar
复制代码 访问地址:http://localhost:8748 (默认账号/密码:sentinel)
- <!-- pom.xml新增 -->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
- </dependency>
复制代码- # application.yml配置
- spring:
- cloud:
- sentinel:
- transport:
- port: 18763 # 本地HTTP服务端口
- dashboard: 127.0.0.1:8748
- feign:
- sentinel:
- enabled: true # 开启Feign支持
复制代码 网关集成方案
针对Spring Cloud Gateway的特殊配置:
- <!-- 网关专用依赖 -->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
- </dependency>
复制代码 关键配置类示例:
- @Configuration
- public class SentinelGatewayConfig {
-
- @Bean
- @Order(Ordered.HIGHEST_PRECEDENCE)
- public SentinelGatewayBlockExceptionHandler exceptionHandler() {
- return new SentinelGatewayBlockExceptionHandler(
- viewResolvers, serverCodecConfigurer);
- }
- @PostConstruct
- public void initRules() {
- // 定义API分组
- Set<ApiDefinition> apis = new HashSet<>();
- apis.add(new ApiDefinition("consumer")
- .setPredicateItems(Set.of(
- new ApiPathPredicateItem()
- .setPattern("/consumer/**")
- .setMatchStrategy(URL_MATCH_STRATEGY_PREFIX)));
- // 设置流控规则
- Set<GatewayFlowRule> rules = new HashSet<>();
- rules.add(new GatewayFlowRule("consumer")
- .setCount(10)
- .setIntervalSec(1)
- .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER));
-
- GatewayRuleManager.loadRules(rules);
- }
- }
复制代码 生产级应用策略
流量控制维度
- rules.add(new GatewayFlowRule("provider")
- .setCount(100) // 每秒100次
- .setIntervalSec(1));
复制代码- rules.add(new FlowRule()
- .setGrade(RuleConstant.FLOW_GRADE_THREAD)
- .setCount(50)); // 最大50并发
复制代码- rules.add(new GatewayFlowRule("product")
- .setParamItem(new GatewayParamFlowItem()
- .setParseStrategy(PARAM_PARSE_STRATEGY_URL_PARAM)
- .setFieldName("productId")));
复制代码 熔断降级策略
策略类型适用场景配置示例慢调用比例接口响应时间过长grade=RT, count=500, timeWindow=10非常比例服务不稳定导致非常增多grade=EXCEPTION_RATIO, count=0.5非常数明确非常数量的场景grade=EXCEPTION_COUNT, count=100 监控 与运维
控制台焦点功能:
- 实时监控
:秒级监控各节点指标
- 规则管理:动态调解限流/降级规则
- 调用链路:可视化服务依赖关系
典范告警配置:
- DegradeRuleManager.loadRules(List.of(
- new DegradeRule("criticalApi")
- .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO)
- .setCount(0.7) // 异常比例阈值70%
- .setTimeWindow(60) // 熔断时长(s)
- .setMinRequestAmount(100) // 最小触发请求数
- .setStatIntervalMs(60*1000) // 统计周期
- ));
复制代码 最佳实践建议
- 分级防护:对差别重要性的API设置差异化策略
- 渐进式规则:从小流量开始逐步验证规则有效性
- 熔断恢复:合理设置熔断时长,制止长时间不可用
- 生产验证:在预发布环境充分测试规则配置
通过合理配置Sentinel,可使微服务架构具备:
- 高可用性:主动隔离故障服务
- 弹性本领:根据体系负载动态调解
- 可视化运维:实时掌握体系康健状态
|