Java教程

Sentinel 之 入门使用

本文主要是介绍Sentinel 之 入门使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

公网 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    <<<<<<<<<<<

这篇关于Sentinel 之 入门使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!