spring alibaba sentinel
Sentinel 是阿里巴巴开源的一款面向微服务架构的流量控制组件,它提供了丰富的流量控制功能,包括流量控制、熔断降级、系统负载保护等。Sentinel 旨在帮助开发者在微服务环境中更好地控制和保护服务。以下是 Sentinel 的一些核心特性和概念:
### 1. 流量控制(Flow Control)
- **QPS(每秒查询率)限制**:Sentinel 允许您为每个资源(如接口或服务)设置QPS限制,以防止流量过载。
- **预热策略**:Sentinel 提供了预热策略,允许系统在启动时逐渐增加流量,避免一开始就承受过高的流量。
- **排队等待**:Sentinel 支持排队等待机制,当达到阈值时,可以排队等待而不是直接拒绝请求。
### 2. 熔断降级(Circuit Breaking)
- **快速失败**:Sentinel 可以快速检测到下游服务的异常,并立即熔断,避免系统过载。
- **优雅降级**:Sentinel 允许您定义降级策略,当下游服务不可用时,可以优雅地降级服务。
### 3. 系统负载保护(System Protection)
- Sentinel 可以实时监控系统的负载情况,并根据系统的负载情况动态调整流量,以保护系统不被过载。
### 4. 热点参数限流(Param Flow Control)
- Sentinel 支持对函数的参数进行限流,例如,可以限制某个参数值的请求频率。
### 5. 授权规则(Authority Rule)
- Sentinel 提供了授权规则,允许您控制哪些用户可以访问特定的资源。
### 6. 动态规则配置
- Sentinel 支持动态配置规则,您可以在运行时动态地调整规则,而无需重启服务。
### 7. 多数据中心支持
- Sentinel 支持多数据中心(Region)和多集群(Cluster)的部署,适合在复杂的云环境中使用。
### 8. 扩展性
- Sentinel 提供了扩展点,允许开发者自定义规则和逻辑,以适应特定的业务需求。
### 9. 集成支持
- Sentinel 提供了与 Spring Cloud、Dubbo 等框架的集成支持,可以轻松集成到现有的微服务架构中。
### 10. 监控和报警
- Sentinel 提供了实时监控功能,可以监控资源的流量和系统负载情况,并支持报警机制。
Sentinel 的设计目标是提供一个强大的流量控制和熔断降级框架,以帮助开发者构建更加健壮和可靠的微服务系统。通过 Sentinel,开发者可以更好地控制服务的流量,提高系统的可用性和稳定性。
https://github.com/alibaba/Sentinel/releases/tag/1.7.0
下载Sentinel Dashboard ,提供更好的可视化界面。
java -jar sentinel-dashboard-1.8.3.jar
然后通过浏览器访问:http://localhost:8080
,默认账号密码都是sentinel
spring cloud 整合sentinel的maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制台地址
port: 8719 # Sentinel 连接端口
我的配置
server:
port: ${PORT}
spring:
application:
name: nacos-test1
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制台地址
nacos:
discovery:
server-addr: 192.168.200.130:8848 # Nacos服务地址
config:
server-addr: 192.168.200.130:8848
file-extension: yml #nacos远程配置文件的后缀
key: 99999
配置好启动项目后,因为sentinel是懒加载的,所有先要访问一下我们项目的地址才会出现对应的信息在sentinel控制台
流量规则。流量控制,防止短时间大量访问压垮服务器导致宕机。
通过QPS限流
上面设置的是/test这个地址每秒只能访问一次,如果超过了就会这样
在Sentinel中,注解主要被用于资源定义和流量控制。以下是Sentinel中常用的注解及其用途:
1. **@SentinelResource**:
- 这个注解用于定义资源,并为其绑定流量控制规则。你可以在任何方法或类上使用这个注解,Sentinel会根据注解的值来识别资源,并应用相应的流量控制规则。
- 示例:
@SentinelResource(value = "resource1", blockHandler = "handleException")
public String resource1() {
// 方法逻辑
}
- `value`属性定义了资源的名称,`blockHandler`属性指定了当请求被限流时的处理方法。
2. **@SentinelGuard**:
- 这个注解用于在Spring Security中集成Sentinel,以实现基于Sentinel的流量控制和熔断降级。
- 示例:
@SentinelGuard(resourceName = "resourceName", fallback = "fallbackMethod")
public String securedMethod() {
// 方法逻辑
}
- `resourceName`属性定义了资源的名称,`fallback`属性指定了降级方法。
3. **@FlowRule**:
- 这个注解用于定义流量控制规则,包括QPS、并发数等。
- 示例:
@FlowRule(resourceName = "resourceName", limitApp = "default", count = 10)
public void flowRuleMethod() {
// 方法逻辑
}
- `resourceName`属性定义了资源的名称,`limitApp`属性定义了资源的来源,`count`属性定义了QPS限制。
4. **@DegradeRule**:
- 这个注解用于定义熔断降级规则,包括慢调用比例、异常比例等。
- 示例:
@DegradeRule(resourceName = "resourceName", grade = RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO, count = 0.5)
public void degradeRuleMethod() {
// 方法逻辑
}
- `resourceName`属性定义了资源的名称,`grade`属性定义了熔断规则的类型,`count`属性定义了异常比例。
5. **@SystemRule**:
- 这个注解用于定义系统保护规则,包括负载、RT等。
- 示例:
@SystemRule(resourceName = "resourceName", grade = RuleConstant.SYSTEM_LOAD, count = 0.8)
public void systemRuleMethod() {
// 方法逻辑
}
- `resourceName`属性定义了资源的名称,`grade`属性定义了系统保护规则的类型,`count`属性定义了负载阈值。
这些注解提供了一种声明式的方式来定义资源和规则,使得流量控制和熔断降级的配置更加灵活和方便。通过使用这些注解,你可以在代码中直接指定资源的流量控制和熔断降级策略,而无需在控制台手动配置。
使用代码的方式对具体参数进行限流
1. 创建配置类
你可以创建一个配置类,该类实现了ApplicationListener
接口或使用了@EventListener
注解,以确保在Spring应用启动时加载热点参数限流规则。
使用ApplicationListener
接口
java
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import java.util.Collections;
@Component
public class SentinelParamFlowRuleInitializer implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// 创建热点参数限流规则
ParamFlowRule rule = new ParamFlowRule("test")
.setParamIdx(0) // 参数索引,0表示第一个参数
.setCount(1); // 限流阈值
// 加载规则
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
}
}
使用@EventListener
注解
java
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.Collections;
@Component
public class SentinelParamFlowRuleInitializer {
@EventListener(ApplicationReadyEvent.class)
public void initParamFlowRules() {
// 创建热点参数限流规则
ParamFlowRule rule = new ParamFlowRule("test")
.setParamIdx(0) // 参数索引,0表示第一个参数
.setCount(1); // 限流阈值
// 加载规则
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
}
}
2. 说明
@Component
:将类标记为Spring组件,使其成为Spring应用上下文的一部分。@EventListener(ApplicationReadyEvent.class)
:监听Spring Boot的ApplicationReadyEvent
事件,该事件在Spring Boot应用完全启动并准备好后触发。ParamFlowRule
:创建热点参数限流规则对象。ParamFlowRuleManager.loadRules()
:加载热点参数限流规则。
@GetMapping("/test")
public String test(
@RequestParam("username") String username,
@RequestParam("password") String password) {
// 方法逻辑
}
有username这个参数的请求一秒只能请求一次
如果你想针对某个参数的某个值进行限流
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import org.springframework.context.annotation.Configuration;
import java.util.Collections;
@Configuration
public class SentinelConfig {
public void init() {
// 创建热点参数限流规则
ParamFlowRule rule = new ParamFlowRule("test")
.setParamIdx(0) // 参数索引,0表示第一个参数(username)
.setCount(1) // 限流阈值,每秒1次
.setParamFlowItemList(Collections.singletonList(
new ParamFlowRuleItem("username", "张三"))); // 参数值列表,这里示例为"张三",实际使用时需要根据业务需求配置
// 加载规则
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
}
}