SpringCloud——Sentinel 限流熔断

本文介绍了Sentinel在流量控制和系统保护中的作用,包括其Java客户端和Dashboard的使用,以及如何通过SpringBoot集成并配置Sentinel资源、限流降级和异常处理功能。

一、Sentinel 是什么?

Sentinel 以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应过载保护、热点流量防护等多个维度保护服务的稳定性。
Sentinel 的主要特性

二、Sentinel 两个部分:

核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

三、Springboot整合Sentinel

1. 引入依赖
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
	<version>2022.0.0.0</version>
</dependency>
2. 配置SentinelResourceAspect
@Configuration
public class SentinelAspectConfiguration {
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}
3. 配置 aop.xml
<aspects>
    <aspect name="com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect"/>
</aspects>

四、注解 @SentinelResource

用来标识资源是否被限流、降级。
可以用于 Controller接口某服务的方法(注解埋点)

@SentinelResource属性
  • value: 资源名称,必需项(不能为空)
  • entryType: entry 类型,可选项(默认为 EntryType.OUT)
@RestController
public class TestController {
    @GetMapping(value = "/hello")
    @SentinelResource("hello")
    public String hello() {
        return "Hello Sentinel";
    }
}
1. SentinelResource 限流降级处理:blockHandler 和 blockHandlerClass

若本次访问被限流或服务降级,则调用blockHandler指定的接口

blockHandler:

指定处理 BlockException 的方法名(可选项)。

blockHandler 方法约定
访问范围public
返回类型与原方法相匹配
参数列表与原方法相匹配,并且最后加BlockException类型的参数

blockHandler 方法需要和原方法在同一个类中。

例:

@Service
public class TestService{
	 @SentinelResource(value = "test", blockHandler = "handleException")
	 public String hello() {
        return "Hello Sentinel";
    }
     public String handleException(BlockException ex) {
		//TODO
		return "处理xxxx";
     );
}

blockHandlerClass:

若希望使用其他类的方法,则可以指定 blockHandlerClass 为对应的类的 Class 对象。
注意:方法必需为 static ,否则无法解析。

public final class ExceptionUtil {
    public static void handleException(BlockException ex) {
        System.out.println("Oops: " + ex.getClass().getCanonicalName());
    }
}
@Service
public class TestService{
	 @SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})
	 public String hello() {
        return "Hello Sentinel";
    }
}
2. SentinelResource 异常处理:fallback / defaultFallback 和 fallbackClass

若本接口出现未知异常,则调用fallback指定的接口。

1). fallback:

fallback 函数可以针对所有类型的异常进行处理(除了 exceptionsToIgnore 里面排除掉的异常类型)。

fallback /defaultFallback 方法约定
访问范围public
返回类型与原方法一致
参数列表与原方法一致,或加 Throwable类型的参数用于接收对应的异常

fallback 方法默认需要和原方法在同一个类中。

@Service
public class TestService{
	
    @SentinelResource(value = "hello", fallback = "helloFallback")
    public String hello(long s) {
        if (s < 0) {
            throw new IllegalArgumentException("invalid arg");
        }
        return String.format("Hello at %d", s);
    }
    
    public String helloFallback(long s, Throwable ex) {
        // Do some log here.
        ex.printStackTrace();
        return "Oops, error occurred at " + s;
    }
}

若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数。

2).defaultFallback

用于通用的 fallback 逻辑。
同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效

3).exceptionsToIgnore

用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

@Service
public class TestService{

    @SentinelResource(value = "helloAnother", defaultFallback = "defaultFallback", exceptionsToIgnore = {IllegalStateException.class})
    public String helloAnother(String name) {
        if (name == null || "bad".equals(name)) {
            throw new IllegalArgumentException("oops");
        }
        if ("foo".equals(name)) {
            throw new IllegalStateException("oops");
        }
        return "Hello, " + name;
    }
    
    public String defaultFallback() {
        System.out.println("Go to default fallback");
        return "default_fallback";
    }
}

五、规则配置——Sentinel Dashboard

可以创建flowrule.json进行配置,但比较麻烦。
我们可以使用sentinel dashboard控制台进行配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码鹿的笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值