sentinel 是面向分布式微服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度保障微服务的稳定性。
使用sentinel限流
pom配置
<dependencies>
<!-- 创建工程需要的两个依赖 -->
<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-sentinel</artifactId>
</dependency>
<!-- Sentinel 适配了 Feign, 可以实现服务间调用的保护 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Sentinel 使用 Nacos 存储规则 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!-- web 工程 -->
<dependency>
<groupId>com.imooc.ecommerce</groupId>
<artifactId>e-commerce-mvc-config</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>yml配置
sentinel:
# 配置 sentinel dashboard 地址
transport:
dashboard: 127.0.0.1:7777
port: 8719 # 会在应用对应的机器上启动一个 Http Server, 该 Server 会与 Sentinel 控制台做交互流控规则硬编码
public class FlowRuleCodeController {
/**
* <h2>初始化流控规则</h2>
* */
@PostConstruct
public void init() {
// 流控规则集合
List<FlowRule> flowRules = new ArrayList<>();
// 创建流控规则
FlowRule flowRule = new FlowRule();
// 设置流控规则 QPS, 限流阈值类型 (QPS, 并发线程数)
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// 流量控制手段
flowRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
// 设置受保护的资源
flowRule.setResource("flowRuleCode");
// 设置受保护的资源的阈值
flowRule.setCount(1);
flowRules.add(flowRule);
// 加载配置好的规则
FlowRuleManager.loadRules(flowRules);
}
/**
* <h2>采用硬编码限流规则的 Controller 方法</h2>
* */
@GetMapping("/flow-rule")
// @SentinelResource(value = "flowRuleCode")
// @SentinelResource(value = "flowRuleCode", blockHandler = "handleException")
@SentinelResource(
value = "flowRuleCode", blockHandler = "qinyiHandleBlockException",
blockHandlerClass = QinyiBlockHandler.class
)
public CommonResponse<String> flowRuleCode() {
log.info("request flowRuleCode");
return new CommonResponse<>(0, "", "imooc-qinyi-ecommerce");
}
/**
* <h2>当限流异常抛出时, 指定调用的方法</h2>
* 是一个兜底策略
* */
public CommonResponse<String> handleException(BlockException exception) {
log.error("has block exception: [{}]", JSON.toJSONString(exception.getRule()));
return new CommonResponse<>(
-1,
"flow rule exception",
exception.getClass().getCanonicalName()
);
}
}