07.Sentinel

一、代码嵌入式

1.引入依赖

 <!-- sentinel核心库,可以单独使用sentinel不需要alibaba.cloud-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
            <version>1.8.4</version>
        </dependency>


        <!-- 使用@sentinelResource注解方式需要引用-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-annotation-aspectj</artifactId>
            <version>1.8.4</version>
        </dependency>

2.编写controller


/**
 * @author LRY
 * @date 2022/7/31
 */
@RestController
@RequestMapping("/sentinel")
@Slf4j
public class SentinelController {

    //资源名称
    private static final String RESOURCE_NAME="hello";

    //sentinel流控
    @RequestMapping("/hello")
    public String hello(){
        String r=null;
        Entry entry=null;
        try {
            //资源
            entry= SphU.entry(RESOURCE_NAME);
            //被保护的业务逻辑
            r="hello world";
            log.info("==================="+r+"====================");
        } catch (BlockException e) {
            r="block,被流控了";
            e.printStackTrace();
           log.info(r);
        }catch (Exception e){
            //若需要配置降级规则,需要通过这种方式记录业务异常
            Tracer.traceEntry(e,entry);
        }finally {
            if(entry!=null){
                entry.exit();
            }
        }
        return r;
    }


    /**
     * 定义规则
     * Spring的初始化方法
     */
    @PostConstruct //这个注解就是,Spring创建SentinelController的Bean时自动调用这个给方法(init-method)
    public static void initFlowRules(){

        System.out.println("============================initFlowRules=====================================");

        //规则集合
        List<FlowRule> rules=new ArrayList<>();


        //流控规则
        FlowRule rule=new FlowRule();
        //设置受保护的资源
        rule.setResource(RESOURCE_NAME);
//设置规则,设置流控规则QPS(方式次数限制) rule.setGrade(RuleConstant.FLOW_GRADE_QPS); //设置受保护的资源阈值(1秒访问一次) rule.setCount(1); //添加到集合中去 rules.add(rule); //加载配置好的规则 FlowRuleManager.loadRules(rules); } }

二、注解方式

1.引入依赖同上

2.创建注入bean


    //注解支持的配置Bean
    @Bean
    public SentinelResourceAspect sentinelResourceAspect(){
        return new SentinelResourceAspect();
    }

3.编写controller


/**
 * @author LRY
 * @date 2022/7/31
 */
@RestController
@RequestMapping("/sentinel")
@Slf4j
public class SentinelController {

    //资源名称
    private static final String RESOURCE_NAME1="hello1";



    /**
     * 依赖包:<artifactId>sentinel-annotation-aspectj</artifactId>
     * 配置bean:SentinelResourceAspect
     * value:资源名
     * blockHandler:流控后去执行的方法(
     *              1.方法要声明在同一个类里面
     *                1)不在一个类里面要添加参数:blockHandlerClass = xxx.class
     *                2)方法也要静态方法
     *              2.并且要为public
     *              3.参数返回值一样
     */
    @RequestMapping("/hello1")
    @SentinelResource(value = RESOURCE_NAME1,blockHandler = "blockHandlerForhello1")
    public String hello1(){
        String  r="hello world1111111111111";
        return r;
    }

    public String blockHandlerForhello1(BlockException blockException){
        String  r="block,被流控了11111111111111111111";
        return r;
    }

    /**
     * 定义规则
     * Spring的初始化方法
     */
    @PostConstruct //这个注解就是,Spring创建SentinelController的Bean时自动调用这个给方法(init-method)
    public static void initFlowRules(){

        System.out.println("============================initFlowRules=====================================");

        //规则集合
        List<FlowRule> rules=new ArrayList<>();



        //流控规则
        FlowRule rule1=new FlowRule();
        //设置受保护的资源
        rule1.setResource(RESOURCE_NAME1);
//设置规则,设置流控规则QPS(方式次数限制) rule1.setGrade(RuleConstant.FLOW_GRADE_QPS); //设置受保护的资源阈值(1秒访问一次) rule1.setCount(1); rules.add(rule1); //加载配置好的规则 FlowRuleManager.loadRules(rules); } }

4.其他规则

1)降级规则(异常)


三、加入控制台

1.根据Spring Cloud Alibaba下载对应版本

地址:Spring Cloud Alibaba  ,  Sentinel



2.运行sentinel控制台

地址:sentinel官网

java -Dsentinel.dashboard.auth.username=lry -Dsentinel.dashboard.auth.password=lry -Dserver.port=9908 -jar sentinel-dashboard-1.8.4.jar



3.详细参数说明



4.整合到项目,文档

导入依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>x.y.z</version>
</dependency>


创建配置文件 sentinel.properties


修改配置文件

csp.sentinel.dashboard.server=127.0.0.1:9908


5.访问

先访问我们的项目地址


再访问控制台,就能看到配置的规则了(注:这里修改的规则临时保存



(1)