sentinel代码实现

sentinel代码实现

官网

https://sentinelguard.io/zh-cn/docs/quick-start.html

1、添加依赖

<parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.1.3.RELEASE</version>
   </parent>
   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>com.alibaba.csp</groupId>
           <artifactId>sentinel-core</artifactId>
           <version>1.8.0</version>
       </dependency>
   </dependencies>

2、编写控制器

package com.xyf.controller;
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
@RestController
public class UserController {
    private static final String USER_REQUST_HELLO="hello";
    @GetMapping("/hello")
    public String getHello(){
        //设置对那个请求做流控设置
        try {
            Entry entry = SphU.entry(USER_REQUST_HELLO);
       } catch (BlockException e) {
            //e.printStackTrace();
            return "你被限流了";
       }
        return "hello world";
   }
    //流控规则定义
    @PostConstruct //优先加载
    public  void initFlowBlock(){
        List<FlowRule> rules=new ArrayList<>();//设置流控的规则集合
        //创建流控的规则对象
        FlowRule flowRule = new FlowRule();
        //设置流控对象
        flowRule.setResource(USER_REQUST_HELLO);
        //设置流控方式
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//根据每秒请求的数量做线路
        //每秒请求两个
        flowRule.setCount(2);
        //添加规则到集合中
        rules.add(flowRule);
        //将流控规则交给流控管理对象
        FlowRuleManager.loadRules(rules);
   }
}

3、演示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

限流(每秒两次请求)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注解实现

1、导入依赖

<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-annotation-aspectj</artifactId>
            <version>1.8.0</version>
        </dependency>

2、控制器改造

 /**
     *
     * @param pid
     * blockHandler 指定限流后的处理方案
     */
    @GetMapping("/user")
    @SentinelResource(value = USER_REQUST_NAME,blockHandler = "blockUser")
    public User getUser(String pid){
        return new User("xyf");
   }
    public User blockUser(String id,BlockException e){
        return new User("限流");
   }

3、添加sentinelResourceAspect

@Bean  //引入sentinel切面
    public SentinelResourceAspect sentinelResourceAspect(){
        return new SentinelResourceAspect();
   }

4、演示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

限流:每秒2次请求

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Sentinel 是阿里巴巴开源的一个流量控制框架,它提供了一种降级(也称为熔断)的功能,当系统面临过多请求或服务异常时,可以自动切换到降级模式,避免因单点故障导致整个系统的雪崩效应。 Degrade 的代码实现通常涉及到以下几个步骤: 1. **创建规则**: 首先,在 Sentinel 配置降级规则,指定触发降级的阈值,如错误数超过某个值、响应时间超过阈值等。 ```java // 示例 Rule rule = RuleBuilder.newBuilder() .resource("your_resource_key") // 资源名 .grade(RuleGrade.ERROR_CODE, 90) // 设置错误码等级为 Grade.ERROR_CODE,并设置阈值为 90% .degradeAction(FlowController.DEGRADE_ACTION_DEFAULT) // 默认降级策略,如直接返回错误页面 .build(); ``` 2. **动态检查规则**: 在实际业务处理,通过 `FlowContext` 对象检查当前是否触发了降级规则。 ```java try { // 创建 Flow 控制器上下文 DynamicFlowContext flowCtx = new DynamicFlowContext(); if (flowCtx.isExecuteDecision()) { // 如果满足降级条件 // 执行降级操作,比如记录日志,返回错误信息等 throw new SentinelException("Service is in degrade mode."); } else { // 正常业务处理 yourBusinessLogic(); } } catch (BlockException e) { // 如果已经触发降级,则直接抛出异常 throw e; } ``` 3. **异常传播**: Sentinel 可以捕获并封装异常,然后按照预设的降级策略执行,同时还可以通过回调通知机制向外部发送告警信息。 在编写降级代码时,要注意对潜在的异常进行适当地处理,以确保程序的健壮性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值