芋道 Spring Boot 服务容错 Sentinel 入门
发现 sentinel 可以很好的协助 gateway 实现防止恶意访问接口的问题
Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
Hystrix 已经不再维护了。
实例
本例子是基于 SpringCloud 实现的
>> 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<!--整合spring cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--引入spring cloud alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
>> 实现
@GetMapping("/demo")
@SentinelResource(value = "demo",blockHandler = "exceptionHandler",fallback = "fallbackHandler")
public String demo(String str) throws InterruptedException {
Thread.sleep(2000000L);
return str;
}
//BlockHandler 处理函数,参数最后多一个 BlockException,其余与原函数一致
public String exceptionHandler(String str,BlockException ex){
return "访问过于频繁";
}
//fallback 处理函数,参数最后多一个 BlockException,其余与原函数一致
public String fallbackHandler(String str,BlockException ex){
return "请求长时间无法响应";
}
解释说明:
@SentinelResouce
用于定义资源,并提供可选的异常处理和 fallback 配置项。@SentinelResouce
常用注解包含以下属性:
- value: 资源名称,必填
- blockHandler ,blockHandlerClass :
blockHandler
对应处理BlockException
的函数名称,可选项。- blockHandler 函数访问范围需要是
public
- 返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为
BlockException
。 - blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定
blockHandlerClass
为对应的类的Class
对象,注意对应的函数必需为 static 函数,否则无法解析。
- fallback :fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。
>> 配置
簇点链路
流控规则
在这里设置了 qps = 1,即每秒中只允许 1 个请求
>> 结果
todo :fallback 实现