上一篇知道了Springcloud Alibaba是什么以及Nacos知识点。
这篇继续总结Spring Cloud Alibaba生态中的Sentinel,它是微服务的哨兵。
哨兵以“流量”为切入点,在多个领域发力,包括流量控制,流量整形, 并发限制,断路 和系统自适应过载保护, 以保证微服务的可靠性和弹性。
Sentinel
Sentinel 的使用可以分为两个部分:
- 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。
Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard
核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。
使用 Sentinel 来进行资源保护,主要分为几个步骤:
- 定义资源
- 定义规则
- 检验规则是否生效
先把可能需要保护的资源定义好,之后再配置规则。
使用方式
使用方式,引入对应的依赖即可方便地整合 Sentinel.
Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时 Sentinel 也提供相关 API,供您来定制自己的规则策略。
Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。
重要属性:
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,资源名是限流规则的作用对象 | |
count | 限流阈值 | |
grade | 限流阈值类型,QPS 或线程数模式 | QPS 模式 |
limitApp | 流控针对的调用来源 | default,代表不区分调用来源 |
strategy | 调用关系限流策略:直接、链路、关联 | 根据资源本身(直接) |
controlBehavior | 流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流 | 直接拒绝 |
通过代码定义流量控制规则
理解上面规则的定义之后,我们可以通过调用 FlowRuleManager.loadRules()
方法来用硬编码的方式定义流量控制规则,比如:
private static void initFlowQpsRule() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule1 = new FlowRule();
rule1.setResource(resource);
// Set max qps to 20
rule1.setCount(20);
rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule1.setLimitApp("default");
rules.add(rule1);
FlowRuleManager.loadRules(rules);
}
熔断降级规则包含下面几个重要的属性:
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即规则的作用对象 | |
grade | 熔断策略,支持慢调用比例/异常比例/异常数策略 | 慢调用比例 |
count | 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 | |
timeWindow | 熔断时长,单位为 s | |
minRequestAmount | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) | 5 |
statIntervalMs | 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) | 1000 ms |
slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) |
同一个资源可以同时有多个降级规则。
理解上面规则的定义之后,我们可以通过调用 DegradeRuleManager.loadRules()
方法来用硬编码的方式定义流量控制规则。
private static void initFlowQpsRule() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule1 = new FlowRule();
rule1.setResource(resource);
// Set max qps to 20
rule1.setCount(20);
rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule1.setLimitApp("default");
rules.add(rule1);
FlowRuleManager.loadRules(rules);
}
Sentinel是一款针对分布式系统的高可用流量控制框架,可以在多个维度上实现流量控制,包括QPS、线程数、CPU使用率等。
在Java项目中使用Sentinel需要以下步骤:
引入Sentinel依赖
在pom.xml中引入Sentinel依赖:
代码语言:javascript复制<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>x.y.z</version>
</dependency>
其中,x.y.z表示版本号,可以根据需要选择最新的版本。
配置Sentinel规则
在Java项目中使用Sentinel需要定义规则,可以在项目中通过代码或配置文件定义规则。例如,使用注解方式定义规则:
代码语言:javascript复制@SentinelResource("hello")
public String hello() {
return "Hello World";
}
这里定义了一个名为“hello”的Sentinel规则,表示对“hello”接口进行流量控制。可以根据需要修改规则的参数,例如设置QPS阈值、异常比例等。
配置Sentinel数据源
Sentinel的流量控制规则需要存储在数据源中,可以选择本地文件或Nacos等云原生平台中存储规则。在Java项目中需要配置数据源,例如:
代码语言:javascript复制-Dcsp.sentinel.dashboard.server=localhost:8080
-Dcsp.sentinel.api.port=8080
-Dproject.name=my-project
其中,csp.sentinel.dashboard.server表示Sentinel的控制台地址,csp.sentinel.api.port表示Sentinel的API端口号,project.name表示项目名称。
启动Sentinel
在Java项目中启动Sentinel需要进行以下步骤:
创建Sentinel配置类,例如:
代码语言:javascript复制@Configuration
public class SentinelConfig {
@PostConstruct
public void init() {
// 初始化Sentinel
initFlowRules();
}
private void initFlowRules() {
// 定义Sentinel规则
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("hello");
rule.setCount(10);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rules.add(rule);
// 加载Sentinel规则
FlowRuleManager.loadRules(rules);
}
}
这里定义了一个名为“hello”的Sentinel规则,表示对“hello”接口进行流量控制。
启动Spring Boot应用程序。在启动时,Sentinel会自动加载规则并启动流量控制。
以上是Java项目使用和配置Sentinel的基本步骤。需要注意的是,Sentinel的使用和配置需要根据实际情况进行调整和优化,以达到最佳的流量控制效果。