zoukankan      html  css  js  c++  java
  • 【转】 SpringCloudAlibaba--08——sentinel

    【转】 SpringCloudAlibaba--08——sentinel

    参考地址:蚂蚁课堂

    服务接口的保护方案:黑白名单、对IP限流/熔断机制、服务降级、服务隔离

    服务限流:就是保护我们的服务,在高并发情况下,如果客户端对服务端的请求到达一定的极限(就是我们设置的阈值),超出阈值,就会开启自我保护机制。直接执行服务降级的方法,不会走业务逻辑,会走本地的falback 方法。

    服务雪崩的效应:默认情况下tomcat或jetty 服务器只有一个线程处理所有接口的请求。如果是高并发情况下,所有的请求堆在同一个接口上,那么所有的线程都会处理该接口,可能会导致其他接口无法访问,因为短暂性的可能没有线程去处理。

    服务雪崩解决方案

    服务隔离机制:线程池隔离、信号量隔离。

    线程池隔离:每个接口都有自己独立的线程池维护我们的请求,每个线程池互不影响。缺点:占用内存非常大(如果有一千个服务,要搞一千个线程池??)

    信号量隔离:设置有一定的阈值数量的线程处理我们的接口,如果超出线程数量,就拒绝访问。

    Sentinel hytrix区别

    前哨以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度保护服务的稳定性。

    前哨具有以下特征:

    1.丰富的应用场景:前哨兵承接了阿里巴巴近10年的双十一大促流的核心场景,例如秒杀(即突然流量控制在系统容量可以承受的范围),消息削峰填谷,传递流量控制,实时熔断下游不可用应用等。

    2.完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台中看到接收应用的单台机器秒级数据,甚至500台以下规模的整合的汇总运行情况。

    广泛的开源生态:Sentinel提供开箱即用的与其他开源框架/库的集成模块,例如与Spring Cloud,Dubbo,gRPC的整合。您只需要另外的依赖并进行简单的配置即可快速地接入Sentinel。

    3.完善的SPI扩展点:Sentinel提供简单易用,完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理,适应动态数据源等。

    Sentinel中文文档介绍:

    https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

     

    Sentinel 实现Api动态限流

    两种方法:

    1、手动配置(基本已经淘汰)

    2、Sentinel 的控制台配置

    3、默认Sentinel不会对数据持久化,需要自己单独去持久化

    配置限流的步骤:创建流控规则,然后再被映射地址去引用。

    依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-alibaba-sentinel</artifactId>
        <version>0.2.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    直接模仿去抄:

    创建限流规则

    private static final String GETORDER_KEY = "getOrder";
    
    @RequestMapping("/initFlowQpsRule")
    public String initFlowQpsRule() {
        List<FlowRule> rules = new ArrayList<FlowRule>();
        FlowRule rule1 = new FlowRule();
        rule1.setResource(GETORDER_KEY);
        // QPS控制在2以内
        rule1.setCount(1);
        // QPS限流
        rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule1.setLimitApp("default");
        rules.add(rule1);
        FlowRuleManager.loadRules(rules);
        return "....限流配置初始化成功..";
    }
    
    @RequestMapping("/getOrder")
    public String getOrders() {
        Entry entry = null;
        try {
            entry = SphU.entry(GETORDER_KEY);
            // 执行我们服务需要保护的业务逻辑
            return "getOrder接口";
        } catch (Exception e) {
            e.printStackTrace();
            return "该服务接口已经达到上线!";
        } finally {
            // SphU.entry(xxx) 需要与 entry.exit() 成对出现,否则会导致调用链记录异常
            if (entry != null) {
                entry.exit();
            }
        }
    
    }

    ok,然后我们需要先访问initFlowQpsRule 这个接口,初始化创建限流配置以后,然后再访问getOrder 这个接口

    这样测试是没有问题,可是如果我们项目重启,还是要先访问initFlowQpsRule 这个接口,很不方便。

    解决方法:

    @Component
    @Slf4j
    public class SentinelApplicationRunner implements ApplicationRunner {
        private static final String GETORDER_KEY = "getOrder";
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            List<FlowRule> rules = new ArrayList<FlowRule>();
            FlowRule rule1 = new FlowRule();
            rule1.setResource(GETORDER_KEY);
            // QPS控制在2以内
            rule1.setCount(1);
            // QPS限流
            rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
            rule1.setLimitApp("default");
            rules.add(rule1);
            FlowRuleManager.loadRules(rules);
            log.info(">>>限流服务接口配置加载成功>>>");
        }
    }

    这次就ok了,不过这种手写的太low了,用注解:

    注解形式配置管理Api限流

    @SentinelResource  value参数:流量规则资源名称、

    blockHandler 限流/熔断出现异常执行的方法

    Fallback 服务的降级执行的方法

    @SentinelResource(value = GETORDER_KEY, blockHandler = "getOrderQpsException")
    @RequestMapping("/getOrderAnnotation")
    public String getOrderAnnotation() {
        return "getOrder接口";
    }
    
    /**
     * 被限流后返回的提示
     *
     * @param e
     * @return
     */
    public String getOrderQpsException(BlockException e) {
        e.printStackTrace();
        return "该接口已经被限流啦!";
    }

    Sentinel 环境快速搭建

    下载对应Sentinel-Dashboard

    https://github.com/alibaba/Sentinel/releases/tag/1.7.1 运行即可。

    运行执行命令

    java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.api.port=8719 - jar  + jar包

    8718属于 界面端口号 8719 属于api通讯的端口号

    SpringBoot整合Sentinel仪表盘 配置

    spring:
      application:
        ###服务的名称
        name: meitemayikt-order
    
      cloud:
        nacos:
          discovery:
            ###nacos注册地址
            server-addr: 127.0.0.1:8848
        sentinel:
          transport:
            dashboard: 127.0.0.1:8718
          eager: true

    * Sentinel 动态实现接口限流

    项目一旦停止,自己定义的限流规则也会在控制台消失,因为Sentinel默认是没有做持久化的,如果要做持久化,采用:zk、nacos、阿波罗等(下一集笔记再写)

     * Sentinel 信号量隔离

    每次最多只会有一个线程处理业务逻辑,超出该阈值的情况下,直接拒绝访问。

    @SentinelResource(value = "getOrderThrad", blockHandler = "getOrderQpsException")
    @RequestMapping("/getOrderThrad")
    public String getOrderThrad() {
        System.out.println(Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
    
        }
        return "getOrderThrad";
    }

    因为线程是非常块的,所以延迟一秒,不然看不出效果

  • 相关阅读:
    Java中继承的详细用法
    Java中继承的详细用法
    树莓派中安装QT
    qt在windows下的udp通信(最简单)
    qt+opencv对两幅图片进行融合
    浅谈QT打印功能实现
    qt中采用宽带speex进行网络语音通话实验程序
    实时预览的在线 Markdown 编辑器
    LigerUI一个前台框架增、删、改asp.net代码
    .NET MVC通过反射获取数据修
  • 原文地址:https://www.cnblogs.com/Javastudy-note/p/13818370.html
Copyright © 2011-2022 走看看