简介
Sentinel
可以简单的分为Sentinel核心库和Dashboard。核心库不依赖Dashboard,但是结合Dashboard可以取得最好的效果。
-
核心库(
Java 客户端
)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对Dubbo / Spring Cloud
等框架也有较好的支持。 -
控制台(
Dashboard
)基于Spring Boot
开发,打包后可以直接运行,不需要额外的Tomcat
等应用容器。
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel
以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 的主要特性:
使用 Sentinel 来进行资源保护,主要分为几个步骤:
-
定义资源
-
定义规则
-
检查效果
先把可能需要保护的资源定义好,之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。
定义资源
Sentinel支持以下几种方式定义资源:
-
抛出异常方式定义资源
-
返回布尔值方式定义资源
-
注解方式定义资源
-
异步调用方式定义资源
下面讲述通过抛出异常的方式定义资源,其他定义资源方式可以参见官方文档。
抛出异常的方式定义资源
当资源发生了限流之后会抛出BlockException
。这个时候可以捕捉异常,进行限流之后的逻辑处理。示例代码如下:
public static void main(String[] args) {
initFlowRules();
while (true) {
Entry entry = null;
try {
entry = SphU.entry("hello");
/*您的业务逻辑 - 开始*/
System.out.println("hello");
/*您的业务逻辑 - 结束*/
} catch (BlockException e1) {
/*流控逻辑处理 - 开始*/
System.out.println("block!");
/*流控逻辑处理 - 结束*/
} finally {
if (entry != null) {
entry.exit();
}
}
}
}
注意:SphU.entry(xxx)
需要与entry.exit()
方法成对出现,匹配调用,否则会导致调用链记录异常,抛出ErrorEntryFreeException
异常。
定义规则
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("hello");
// Set limit qps to 20
rule1.setCount(20);
rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule1.setLimitApp("default");
rules.add(rule1);
FlowRuleManager.loadRules(rules);
}
检查效果
运行之后,我们可以在日志~/logs/csp/${appName}-metrics.log.xxx
里看到下面的输出:
|--timestamp--|----date time------|-resource-| p |block|s |e|rt
|1621928504000|2021-05-25 15:41:44| hello |20 |0 |20|0|0
|1621928504000|2021-05-25 15:41:45| hello |20 |5579 |20|0|728
|1621928504000|2021-05-25 15:41:46| hello |20 |15698|20|0|0
|1621928504000|2021-05-25 15:41:47| hello |20 |19262|20|0|0
|1621928504000|2021-05-25 15:41:48| hello |20 |19502|20|0|0
|1621928504000|2021-05-25 15:41:49| hello |20 |18386|20|0|0
其中p
代表通过的请求,block
代表被阻止的请求,s
代表成功执行完成的请求个数,e
代表用户自定义的异常,rt
代表平均响应时长。
其他
小编近期新建IT技术交流群
,仅限于技术交流;欢迎各岗位大佬进群,环形链路式探讨学习全面提升;工作中遇到问题一起探讨解决,互帮互助,共同进步;扫面下方二维码添加小编,注明来源意图
。