Sentinel 介绍与使用

简介

Sentinel可以简单的分为Sentinel核心库和Dashboard。核心库不依赖Dashboard,但是结合Dashboard可以取得最好的效果。

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对Dubbo / Spring Cloud等框架也有较好的支持。

  • 控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 的主要特性:

图片

使用 Sentinel 来进行资源保护,主要分为几个步骤:

  1. 定义资源

  2. 定义规则

  3. 检查效果

先把可能需要保护的资源定义好,之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。

定义资源

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技术交流群,仅限于技术交流;欢迎各岗位大佬进群,环形链路式探讨学习全面提升;工作中遇到问题一起探讨解决,互帮互助,共同进步;扫面下方二维码添加小编,注明来源意图

图片

猜你喜欢

转载自blog.csdn.net/AnOrdinaryLife/article/details/117287876