ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Sentinel 之 入门使用

2021-10-31 01:00:38  阅读:205  来源: 互联网

标签:调用 return 定义 限流 使用 Sentinel public 入门


公网 demo 接入体验

开通阿里云 AHAS    https://www.aliyun.com/product/ahas?spm=5176.19720258.J_8058803260.410.474b2c4a3AUYtx

Sentinel控制台搭建与应用接入

新建一个测试项目

引入依赖:

<!--Sentinel 核心依赖-->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.0</version>
</dependency>

定义限流规则(硬编码方式设置限流规则):

@Configuration
public class FLowRulesConfig {
 
    /**
     * 定义限流规则
     */
    @PostConstruct
    public void initFLowRules() {
        //1.创建限流规则
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
 
        // 定义资源,表示Sentinel会对哪个资源生效
        rule.setResource("hello");
 
        // 定义限流规则类型,QPS限流类型
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 定义QPS每秒能通过的请求个数
        rule.setCount(2);
        rules.add(rule);
 
        // 2、加载限流规则
        FlowRuleManager.loadRules(rules);
    }
}

编写Controller 测试

@RestController
@RequestMapping(value = "/test")
public class TestController {
 
    @GetMapping(value = "/hello")
    public String hello() {
        // 进行限流
        try (Entry entry = SphU.entry("hello")) { // 加载限流规则,若果存在才会往下执行
            // 被保护的资源
            return "hello Sentinel";
        } catch (BlockException e) {
            e.printStackTrace();
            // 被限流或者被降级的操作
            return "系统繁忙";
        }
    }
}

 


Sentinel 控制台的搭建

1、下载 官方提供的 Sentinel Jar包 :https://gitee.com/rmlb/Sentinel ,或者  https://github.com/alibaba/Sentinel

2、启动控制台

执行:

java -Dserver.port=9000 -jar sentinel-dashboard-1.8.0.jar

指定启动端口号 为 9000

登录: 账号密码均为 sentinel

 

本地应用接入到 本地的 Sentinel 控制台

1、本地应用引入依赖:

<!--Sentinel 控制台接入的依赖-->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.8.0</version>
</dependency>

2、启动时加入JVM参数:  -Dcsp.sentinel.dashboard.server=localhost:9000 -Dproject.name=Sentinel-Demo

参数解释:

-Dcsp.sentinel.dashboard.server=consoleIp:port

指定控制台地址和端口

-Dproject.name=Sentinel-Demo

设置本地应用在Sentinel控制台中的名称

控制台定义限流规则

1、以上的 TestController 中保持不变,将 FLowRulesConfig 中定义的限流格则清除

2、通过控制台设置限流规则

 

Sentinel 中定义资源的方式

  Sentinel 除了基本的定义资源方式外,还有其他定义资源的方式:

1、抛出异常的方式定义资源

2、返回 Boolean 的方式定义资源

3、异步调用支持

4、注解方式定义资源

5、主流框架的默认适配

 

1、抛出异常的方式定义资源:

Sentinel 中的 SphO 包含了 try - catch 风格的 API 。这种方式,当资源发生限流之后抛出 BlockException,这个时候可以捕获异常。进行限流之后的逻辑处理,如下

 

// 进行限流
try (Entry entry = SphU.entry("hello")) { // 加载限流规则,若果存在才会往下执行
    // 被保护的资源
    return "hello Sentinel";
} catch (BlockException e) {
    e.printStackTrace();
    // 被限流或者被降级的操作
    return "系统繁忙";
}

2、返回 Boolean 类型定义资源:

Sentinel 中的 SphO  提供了 if - else 风格的 API,用这种方式,当资源发生限流之后返回 false,这时可以根据返回值进行限流之后的逻辑处理

控制台中添加资源 Sentinel_Boolean 限流规则,然后进行测试

@GetMapping(value = "/booleanHello")
public String booleanHello() {
    // 1、进行限流控制
    if (SphO.entry("Sentinel_Boolean")) {
        try {
            return "Sentinel_Boolean,成功访问";
        } finally {
            // 限流出口
            SphO.exit();
        }
    } else {
        return "Sentinel_Boolean,系统繁忙,请稍后";
    }
}

注意: SphO.entry(xxx) 需要与SphO.exit() 承兑出现,否则会调至调用练记录异常,抛出 ErrorEntryException 异常

 

3、异步调用支持

Sentinel 支持异步调用链路的统计,在异步调用中,需要通过 SphU.asyncEntry(xxx) 方式定义资源,并需要在有异步的回调函数中 调用 exit() 方法

主启动类需要开启 起步调用的支持  @EnableAsync

  创建AsyncService编写异步调用的方法

@Service
public class AsyncService {
    // Async表示方法为异步调用
    @Async
    public void hello() {
        System.out.println("异步调用开始======");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("异步调用结束=====");
    }
}

编写Controller, Sentinel 控制台新增 资源 Sentinel_Async 限流规则 ,进行测试

@GetMapping(value = "/asyncHello")
public String asyncHello(){
    //1.进行限流控制
    AsyncEntry asyncEntry = null;
    try {
        asyncEntry = SphU.asyncEntry("Sentinel_Async"); // 限流入口
        asyncService.hello(); // 异步调用方法
        return "Sentinel_Async,调用成功";
    } catch (BlockException e) {
        e.printStackTrace();
        return "Sentinel_Async,繁忙,请稍后";
    } finally {
        if (asyncEntry != null){
            asyncEntry.exit(); //限流出口
        }
    }
}

4、注解方式定义资源:

Sentinel支持通过@SentinelResource定义资源并配置blockHandler函数来进行限流之后的处理。

因为 Sentinel 中使用 AspectJ 的扩展用于自动定义资源,处理 BlockExeption 所以项目中需要引入 依赖  sentinel-annotation-aspectj

<!--Sentinel 注解定义资源的支持-->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>1.8.0</version>
</dependency>

配置 AspectJ

@Configuration
public class SentinelAspectConfig {
 
    @Bean
    public SentinelResourceAspect resourceAspect() {
        return new SentinelResourceAspect();
    }
}

Controller

/**
 * value = "Sentinel_Annotation" 定义的资源名为:Sentinel_Annotation
 * blockHandler = "exceptionHandler",当抛出 BlockException 异常时调用哪个处理方法
 *
 * @return
 */
@SentinelResource(value = "Sentinel_Annotation", blockHandler = "exceptionHandler")
@GetMapping(value = "/annotationHello")
public String annotationHello() {
    // 使用限流规则
    return "Sentinel_Annotation,访问成功";
}

.

/**
 * 定义降级 / 限流 的处理函数
 *
 * @param exception
 * @return
 */
public String exceptionHandler(BlockException exception) {
    exception.printStackTrace();
    return "Sentinel_Annotation,访问失败";
}

5、主流框架的默认适配

为了减少开发的复杂度,我们大部分的主流框架,如 Web 、ServeLet、Dubbo、SpringCloud、gRPC、Spring WebFlux、Reactor 等都做了适配,只需要引入相对应的依赖即可方便的整合 Sentinel,可以通过引入 Spring Cloud Alibaba Sentinel 来方便的整合 Sentinel

 

>>>>>>>>>>>  接下一篇学习:   https://www.cnblogs.com/Alay/p/15488116.html    <<<<<<<<<<<

标签:调用,return,定义,限流,使用,Sentinel,public,入门
来源: https://www.cnblogs.com/Alay/p/15488108.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有