SpringCloud Alibaba Sentinel 服务限流、熔断、降级 - 基于dashboard方式配制

一、Sentinel

在上两篇博客中我们基于程序配制的方式演示了Sentinel 的功能,相信大家应该对 Sentinel 已经有了更深的认识,本篇接着上篇继续,使用便捷化的dashboard控制台进行实现,可以实现无需重启服务的情况下动态修改策略规则。下面是上篇文章的地址:

Sentinel 熔断降级:https://blog.csdn.net/qq_43692950/article/details/122161209

Sentinel 流量控制:https://blog.csdn.net/qq_43692950/article/details/122161209

在开始前,需要下载官方的 dashboard jar 包,下载地址:

https://github.com/alibaba/Sentinel/releases

在这里插入图片描述
下载好后,在同级目录编写一个start.bat启动脚本,写入以下内容:

java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.2.jar

双击start.bat启动 dashboard 程序,然后浏览器访问 http://localhost:8180/ 即可进入控制台页面,默认用户名密码为 sentinel

在这里插入图片描述
在这里插入图片描述

二、服务连接至 dashboard

上面dashboard 就已经搭建成功了,下面就需要将我们的服务注册到dashboard 中,下面新建一个SpringBoot的Module,在pom中引入依赖:

<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>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

修改application.yml配制文件:

server:
  port: 8080

spring:
  application:
    name: cloudalibaba-sentinel
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.40.130:8848 #nacos地址
    sentinel:
      transport:
        port: 8719 #跟 sentinel 控制台交流的端口,随意指定一个未使用的端口即可默认是8719
        dashboard: 127.0.0.1:8180 # 指定 sentinel 控制台地址。
      eager: true #当服务启动时是否与sentinel建立链接
      web-context-unify: false #关闭 URL PATH 聚合
      
management:
  endpoints:
    web:
      exposure:
        include: '*'

主启动类:

@SpringBootApplication
@EnableDiscoveryClient
public class SentinelApplication {
    public static void main(String[] args) {
        SpringApplication.run(SentinelApplication.class, args);
    }
}

启动服务,查看Sentinel控制台:
在这里插入图片描述
已经连接到 dashboard中了

三、流控规则

QPS的流控规则

在这里插入图片描述
下面编写测试接口,并指定资源为mylimit

@RestController
@RequestMapping("/limit")
public class TestController {

    @SentinelResource(value = "mylimit",
            blockHandler = "blockHandler")
    @GetMapping("/testLimit")
    public ResponseTemplate limit(){
        return ResSuccessTemplate.builder().build();
    }

    public ResponseTemplate blockHandler(BlockException exception){
        return ResFailTemplate.builder().code(406).message("接口限流!").build();
    }
}

新建QPS的限流规则:
在这里插入图片描述
如果是看过上两篇博客,对这些参数就非常熟悉了。

下面浏览器访问:http://localhost:8080/limit/testLimit,快速点击就可以看到下面的效果:
在这里插入图片描述

线程池的流控规则

修改接口:

@RestController
@RequestMapping("/limit")
public class TestController {

    @SentinelResource(value = "mylimit",
            blockHandler = "blockHandler")
    @GetMapping("/testLimit")
    public ResponseTemplate limit() throws InterruptedException {
        TimeUnit.SECONDS.sleep(5);
        return ResSuccessTemplate.builder().build();
    }

    public ResponseTemplate blockHandler(BlockException exception){
        return ResFailTemplate.builder().code(406).message("接口限流!").build();
    }
}

在这里插入图片描述

开三个窗口,访问上面的接口,就会发现有个接口快速进入了限流的返回:
在这里插入图片描述

WarmUp预热模式

在这里插入图片描述
刚开始QPS为1,10秒后上升为3,再次访问上面接口,可以发现一秒只能访问一次,10秒后会发现访问数有明显提升:
在这里插入图片描述

四、熔断策略

在这里插入图片描述

新建测试接口:

@RestController
@RequestMapping("/circuitBreaker")
public class CircuitBreakerController {

    @SentinelResource(value = "errdegrade",
            blockHandler = "blockHandler",
            fallback = "fallback")
    @GetMapping("/errdegrade")
    public ResponseTemplate errdegrade(){
        System.out.println("请求了!");
        int a = 1 / 0;
        return ResSuccessTemplate.builder().build();
    }

    @SentinelResource(value = "timegrade",
            blockHandler = "blockHandler",
            fallback = "fallback")
    @GetMapping("/timegrade")
    public ResponseTemplate timegrade() throws InterruptedException {
        System.out.println("请求了!");
        TimeUnit.SECONDS.sleep(3);
        return ResSuccessTemplate.builder().build();
    }

    public ResponseTemplate blockHandler(BlockException exception){
        return ResFailTemplate.builder().code(406).message("接口限流!").build();
    }

    public ResponseTemplate fallback(){
        return ResFailTemplate.builder().code(400).message("降级处理!").build();
    }
}
慢调用比例

在这里插入图片描述

十秒的窗口中,请求数达到4次,有50%的接口时间超过了2秒,即进入熔断,熔断时长5秒后释放一个请求进探测接口是否恢复。

使用测试程序进行测试:

@Slf4j
public class TestDegrade {
    public static void main(String[] args) throws InterruptedException {
        RestTemplate restTemplate = new RestTemplate();

        String url = "http://localhost:8080/circuitBreaker/timegrade";
        for (int i = 1; i <= 20; i++) {
            long t = System.currentTimeMillis();
            String forObject = restTemplate.getForObject(url, String.class);
            log.info("请求次数:{} , 返回结果:{} , 耗时:{}", i, forObject, (System.currentTimeMillis() - t));
        }
    }
}

在这里插入图片描述
可以看到这些请求都被熔断了。

异常比例

在这里插入图片描述
5秒的窗口时间,请求数达到4次,并且50%的都失败,即进入熔断。
修改测试程序:

@Slf4j
public class TestDegrade {
    public static void main(String[] args) throws InterruptedException {
        RestTemplate restTemplate = new RestTemplate();

        String url = "http://localhost:8080/circuitBreaker/errdegrade";
        for (int i = 1; i <= 20; i++) {
            long t = System.currentTimeMillis();
            String forObject = restTemplate.getForObject(url, String.class);
            log.info("请求次数:{} , 返回结果:{} , 耗时:{}", i, forObject, (System.currentTimeMillis() - t));
        }
    }
}

在这里插入图片描述
在这里插入图片描述
共有4个请求进入了,其余均被熔断。

异常数

在这里插入图片描述
5秒的窗口时间,请求数达到4次,并且超过2次的失败,即进入熔断。

再次执行测试程序:
在这里插入图片描述
在这里插入图片描述
其余还是被熔断了。

热点规则

在这里插入图片描述
在这里插入图片描述

五、Sentinel配制的持久化

上面测试的过程中应该可以发现,服务以重启所有的配制都不见了,这是配制都存在了内存中了,并没有持久化,对于Sentinel可以将配制持久化到nacos中:

添加pom依赖:

<dependency>
   <groupId>com.alibaba.csp</groupId>
   <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

修改配制文件:

spring:
  application:
    name: cloudalibaba-sentinel
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.40.130:8848
    sentinel:
      transport:
        port: 8719 #跟 sentinel 控制台交流的端口,随意指定一个未使用的端口即可默认是8719
        dashboard: 127.0.0.1:8180 # 指定 sentinel 控制台地址。
      eager: true #当服务启动时是否与sentinel建立链接
      web-context-unify: false #关闭 URL PATH 聚合
      datasource:
        ds1:
          nacos:
            server-addr: 192.168.40.130:8848
            dataId: sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow

在Nacos中添加配制,data id 为 sentinel-service
在这里插入图片描述

配制内容:

[
 {
 "resource": "mylimit",
 "controlBehavior": 0,
 "count": 1.0,
 "grade": 1,
 "limitApp": "default",
 "strategy": 0
 }
]

重启服务,再次查看Sentinel控制台:
在这里插入图片描述
已经被持久化了。
在这里插入图片描述
喜欢的小伙伴可以关注我的个人微信公众号,获取更多学习资料!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小毕超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值