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));
    }
}

posted @ 2024-12-14 13:18  在线电影制作人  阅读(11)  评论(0)    收藏  举报  来源