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

502

被折叠的 条评论
为什么被折叠?



