IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Sentienl的使用及原理 -> 正文阅读

[Java知识库]Sentienl的使用及原理

基本使用不需要下载Sentienl,直接用依赖即可

步骤:创建本地应用、搭建本地Sentienl控制台、本地接入控制台

先创建springboot项目,引入依赖

<dependencies>
        <!--Sentienl依赖-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
            <version>1.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

创建控制层,测试

package com.lzq.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 TestController {
    @GetMapping("hello")
    public String hello(){
        try {
            //限流入口
            Entry entry = SphU.entry("Hello");{ //限流入口
                return "hello";
            }
        } catch (BlockException e) {
            e.printStackTrace();
            return "系统繁忙";      //限流或者降级处理
        }

    }
    //定义限流规则
    @PostConstruct //当前类构造函数执行后执行
    public void initRules(){
        //创建存放限流规则的集合
        List<FlowRule> rules= new ArrayList<>();
        //创建限流规则
        FlowRule rule = new FlowRule();
        rule.setResource("Hello");//定义对那个资源生效
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//蒂尼限流类型
        rule.setCount(2);//设置qps值
        rules.add(rule); //将规则放在集合中
        //加载限流规则
        FlowRuleManager.loadRules(rules);
    }
}

此时访问即可实现限流操作

使用开源控制台

官网下载好开源jar包,启动,cmd命令启动

java -Dserver.port=8080 -jar sentinel-dashboard-1.8.1.jar

浏览器输入网址即可进入

本地连接sentinel控制台,引入对应依赖

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

设置JVM启动参数:

-Dcsp.sentinel.dashboard.server=localhost:8080

此时访问控制层http://localhost:9090/hello就可以发现已经接入Sentinel

此时注释掉本地的限流规则,在控制台动态设置规则

sentinel定义资源的方式

1.抛出异常、2.返回布尔值、3.异步调用、4.注解、5.主流框架

抛出异常方式就是上面的例子

返回布尔值

@RestController
public class TestController {
    @GetMapping("boolean")
    public boolean hello(){
        if (SphO.entry("boolean")){
            try{
                System.out.println("boolean");
                return true;
            }finally {
                SphO.exit();//限流出口
            }
        }else {
            //限流或者降级
            System.out.println("业务繁忙");
            return false;
        }
    }

}

在控制台设置限流规则

异步调用

在主类加上注解,开启异步支持

@EnableAsync

创建service

@Service
public class AsyncService {
    @Async
    public void hello(){
        System.out.println("异步开启");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("异步结束");
    }
}

控制层

@RestController
public class TestController {
    @Autowired
    private AsyncService asyncService;
    @GetMapping("async")
    public void hello(){
        //使用限流规则
        AsyncEntry asyncEntry = null;
        try {
            SphU.asyncEntry("Sentinel_Async");
            asyncService.hello();
        } catch (BlockException e) {
            System.out.println("系统繁忙");
        }finally {
            if (asyncEntry != null){
                asyncEntry.exit();
            }
        }
    }

}

注解定义

因为Sentinel中使用AspectJ的扩展自动定义资源、处理BlockException等,所以需要引入依赖

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

创建对应配置类

@Configuration
public class SentinelAspect {
    @Bean
    public SentinelResourceAspect sentinelResourceAspect(){
        return new SentinelResourceAspect();
    }
}

控制层

@RestController
public class TestController {
    //定义资源名称  设置限流处理函数
    @SentinelResource(value = "Sentinel_Ann",blockHandler = "exceptionHandler")
    @GetMapping("ann")
    public String hello(){
       return "ann";
    }

    public String exceptionHandler(BlockException e){
        e.printStackTrace();
        return "系统繁忙";
    }
}

流控规则

流量控制原理是监控流量的qps或并发线程数等,当达到阈值是对流量进行控制,避免瞬时流量,保证高可用性

流控规则可设置:

resource:资源名、count:限流阈值、grade:阈值类型、limitApp:流控来源、strategy:调用关系

流量控制效果:直接拒绝、Warm Up(冷启动,在一定时间逐渐增加阈值到上线)、匀速排队

熔断降级实现

在某个资源出现不稳定状态时,对资源调用进行限制,让其快速失败,避免影响其他资源导致级联错误,在降级时间窗口内,对该资源的调用都自动熔断

属性:resource、count、grate:熔断策略、timeWindow:降级时间、rtAlowRequestAmount:每秒请求阈值、minRequestAmount:熔断触发最小请求数

熔断策略:

DEGRADE_GRADE_RT:平均响应时间超过阈值会自动熔断抛出异常

DEGRADE_GRADE_EXCEPTION_RATIO:异常比例,当请求量大于阈值异常超过阈值熔断

DEGRADE_GRADE_EXCEPTION_COUNT:分钟异常数,统计异常是分钟级别

自适应保护

从应用入口流量进行控制,结合Load、cpu使用率、平均RT、入口qps和并发线程数作为监控指标,通过自适应流控策略,让系统入口流量和负载达到一个平衡。

授权控制

设置访问来源,设置白名单与黑名单,若请求在黑名单时不予通过

属性:resource、limitApp:白名单/黑名单,多个用逗号分隔、strategy:限制模式,默认白名单模式

动态规则扩展

动态规则源动态设置规则,通过控制台设置规则推送到规则管理中心,客户端十点接口监听规则中心实时变更

拉取方式:客户端主动向规则管理中心拉取规则;继承AutoRefreshDataSource抽象类,实现readSource()方法

推送方式:客户端通过监听器监听变化,好处:实时性、一直性

熔断降级概念

Sentienl与Hystrix采用不一样的方法

Hystrix通过线程池隔离的方式,对依赖进行隔离,好处是资源和资源做到了彻底的隔离,但是增加线程切换的成本

Sentienl

:通过并发线程数进行限制,没有损耗,也不需要预先分配线程池的大小

:通过响应时间降级,当资源不稳定访问时间长进行降级,过了指定时间窗口才重新恢复

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:16:56  更:2022-02-26 11:19:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:29:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码