SpringCloudAlibaba之Sentinel(一)流控篇

news2024/12/30 2:14:34

 前言:

为什么使用Sentinel,这是一个高可用组件,为了使我们的微服务高可用而生

我们的服务会因为什么被打垮?

一,流量激增    缓存未预热,线程池被占满 ,无法响应

二,被其他服务拖垮,比如第三方的接口响应慢

三,异常没有处理:缓存击穿,缓存穿透等等

总之而言:系统缺乏可用性防护,没有容错机制,尤其是针对流量的防护会降低服务的可用性

服务雪崩:首先是积分系统服务挂掉了,一个系统不可用,导致整个微服务系统都不可用

 限制流量

熔断

服务的降级   A计划-->B计划   积分服务就是一个弱依赖,和整体的流程关联不大,挂掉了也不会影响什么

有很多组件可以让我们进行流控、熔断、及降级,从中我们选择了SpringCloudAlibaba为我们提供的Sentinel这个组件作为我们项目中的保证服务高可用的组件。

https://github.com/alibaba/spring-cloud-alibaba/wiki

sentinel的说明文档

https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md

sentinel的控制台

https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0

先了解一下如何接入 Sentinel

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

1. 下载控制台 jar包

https://github.com/alibaba/Sentinel/releases  下载控制台 jar 包。此处下载的是1.8.5

2.启动控制台

Sentinel 控制台是一个标准的 Spring Boot 应用,以 Spring Boot 的方式运行 jar 包即可。

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar

注意:下载的版本的区别,不都是1.8.5

启动之后访问ip:8080

 user/pwd sentinel/sentinel

在代码端(客户端):

pom中:

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
    </dependencies>

 之后在application.yml文件中:主要是:spring.cloud.sentinel.transport.dashboard

server:
  port: 8087
spring:
  application:
    name: order_nacos-sentinel
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public
    sentinel:
      transport:
        dashboard: localhost:8080

我们写的服务需要访问一次才能在dashboard中显示

访问了下列地址每个地址一次之后:

http://192.168.50.59:8087/order/getStock

http://192.168.50.59:8087/order/test1

http://192.168.50.59:8087/order/test2

http://192.168.50.59:8087/order/flow

之后,就可以发现:

3.流控(直接流控)

  (1) QPS流控

给getStock设置一个QPS流控:

 设置为1

我们继续访问http://192.168.50.59:8087/order/getStock,连续多点,会出现以下:

 怎么改这个页面呢?

指定的blockHandler方法要求:

1.必须是public的  2.方法返回值必须和源方法相同 3.方法参数和源方法相同,最后一个方法参数是BlockException

 继续快速访问

 这里出现了一个问题:我的程序每次重新启动的时候,流控规则都消失了,因为现在这些规则是存放在内存中的,没有做持久化

(2)线程数流控

也可以说是并发线程数流控

线程数流控和QPS流控有什么区别呢?

以一个为例:

qps为1的话代表每秒只允许有一个请求访问,

并发线程数为1的话,只要有一个线程访问,这个线程没有访问结束,那么其他线程就不能再次访问,测试的时候用睡眠的方式来测试。

@RequestMapping("/flow")
    @SentinelResource(value = "getStock",blockHandler = "flowBlockException")
    public String flow(){
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "QPS流控";
    }

    public String flowBlockException(BlockException e){
        return "并发线程数流控";
    }

 

 如果不想用@SentinelResource

那么我们可以写一个类:实现:BlockExceptionHandler

@Component
@Slf4j
public class MyBlockException implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest httpServletRequest
            , HttpServletResponse httpServletResponse, BlockException e) throws Exception {

        if(e instanceof BlockException){
            log.error("被流控了" + e.getRule());
        }else if(e instanceof DegradeException){
            log.error("被降级了" + e.getRule());
        }
        httpServletResponse.getWriter().print(e.getRule());

//        new ObjectMapper().writeValue(httpServletResponse.getWriter(),e.getRule());
    }

流控规则一般在服务的提供方,降级规则设置在服务的消费端。

4.关联流控

 当关联资源1被设置了以后限流以后,限制的不是自己,而是资源2的流控

这里会用到Jmeter这个测试工具,关于JMeter中文的设置(使用之前一定要配置好jdk)

性能测试(2): 测试工具 -- JMeter 安装和中文设置-腾讯云开发者社区-腾讯云

这里多写了一个简单的/add接口

 启动测试计划以后访问:http://127.0.0.1:8087/order/getStock

访问不了,显示被流控了

5.链路流控

   想要使用这个功能,配置文件中,必须设置:spring.cloud.sentinel.web-context-unify 这个属性值默认为true,表示收敛调用链路的。

spring.cloud.sentinel.web-context-unify=false

 要说明的是:进行流控的资源名不一定是controller中的接口,也有可能是service中的方法

controller中:

 service中:


@Service
@Slf4j
public class OrderService {

    @SentinelResource(value = "aa",blockHandler = "aaBlockException")
    public String aa(){
        log.info("测试链路流控...");
        System.out.println("测试链路流控...");
        return "测试链路流控...";
    }

    public String aaBlockException(BlockException e){
        log.error(e.getRule()+" ~~~");
        return "wawawawawwwawa";
    }
}

 

 测试的过程中会发现test3接口怎么测试都不会发生变化,test4访问速度过快就会显示wawawawawwwawa

6.流量效果

1.快速失败

2.warm up 预热

    针对激增流量突然涌入进来打垮冷系统,防止缓存击穿。刚开始QPS是(阈值/3) ,经过填写的预热时间增长到阈值

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量 突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐 增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。 冷加载因子: codeFactor 默认是3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。

3.排队等待

    针对脉冲流量

 这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下 来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的 请求。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React Native元素旋转一定的角度

mMeArrowIcon: {fontSize: 30, color: #999, transform: [{rotate: 180deg}]},<Icon name"arrow" style{styles.mMeArrowIcon}></Icon>参考链接&#xff1a; https://reactnative.cn/docs/transforms https://chat.xutongbao.top/

uniapp自定义头部导航栏

有时我们需要一些特殊的头部导航栏页面&#xff0c;取消传统的导航栏&#xff0c;来增加页面的美观度。 下面我就教大家如何配置&#xff1a; 一、效果图 二、实现 首先在uniapp中打开pages.json配置文件&#xff0c;在单个路由配置style里面设置导航栏样式​​​​​​nav…

《HeadFirst设计模式(第二版)》第四章代码——工厂模式

代码文件目录结构&#xff1a; Cheese: 原料ingredient类中只以Cheese为例&#xff0c;不重复展示&#xff1a; package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;/*** Author 竹心* Date 2023/8/4**/public abstract class Cheese {String name;String g…

国货香水,真“香”吗?

【潮汐商业评论/原创】 Judy在选择香水这块还属于入门级选手&#xff0c;“我只买过一次YSL的自由之水&#xff0c;其他都是生日时朋友送给我的。如果真让我选&#xff0c;说实话我还真不知道买啥。”Judy偷笑着说。 在电影《香水》中&#xff0c;有一句台词说到&#xff0c;…

走进人工智能|自主无人系统 从概念到现实的飞跃

前言&#xff1a; 自主无人系统是具备自主感知、决策和执行能力的智能系统&#xff0c;无需人类干预即可完成任务的技术体系。 文章目录 序言AUS的现有应用从概念到现实的飞跃技术发展历程 目前形式领跑人困难和挑战 总结 自主无人系统&#xff08;Autonomous Unmanned Systems…

Vue2 第十九节 Vuex(二)

1.Vuex API 补充内容 2.getters 配置项 3.四个Map方法的使用 4.多组件共享数据 5.Vux模块化和命名空间 一.Vuex API补充内容 ① 在actions中&#xff0c;如果一个函数处理不完&#xff0c;可以继续调dispatch处理 ② 开发者工具是跟mutations中的数据进行交互的&#xff…

About Multiple regression

ps:this article is not very strict,just some ml and mathematic basic knowledge.My english is poor too.So If this passage make you confuse and uncomfortable.Please give me a feedback in the comment :-D Prior to this(在此之前), we learned the concept of sin…

linuxARM裸机学习笔记(2)----汇编LED灯实验

MX6ULL 的 IO IO的复用功能 这里的只使用了低五位&#xff0c;用来配置io口&#xff0c;其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的&#xff0c;GPIO1_IO00 一共可以复用为 9种功能 IO&#xff0c;分别对应 ALT0~ALT8。每种对应了不同的功能 io的属性配置 HY…

优思学院|精益生产如何真正落地?你要掌握这4个P!

怎样才能让精益生产的方法落地&#xff1f;这是一个经常听到的问题&#xff0c;但对于这个问题很多人有不同的想法和答法&#xff0c;因为大家对“落地”一词有着不同的看法。 “落地”是指整个管理系统的重组&#xff0c;是企业把所学的管理知识和方法&#xff0c;在经营实践…

那些不想骑车的正常理由和十三不骑。

骑友们最热门&#xff0c;也是常常讨论的话题大多是如何骑自行车&#xff1f;但有时候&#xff0c;我们也会思考一些另类的问题。例如&#xff0c;那些不想骑车的理由。 首先&#xff0c;我们可以从科学角度来看待这个问题。骑车虽然有益于健康&#xff0c;但是骑车的姿势也会对…

用msys2安装verilator并用spinal进行仿真

一 参考 SpinalHDL 开发环境搭建一步到位(图文版) - 极术社区 - 连接开发者与智能计算生态 (aijishu.com)https://aijishu.com/a/1060000000255643Setup and installation of Verilator — SpinalHDL documentation

微信认证申请流程(政府/事业单位类型)

第一步&#xff1a;登录微信公众平台->设置->微信认证->开通 第二步&#xff1a;同意协议&#xff1a;签署《微信公众平台认证服务协议》 第三步&#xff1a;验证管理员 第四步&#xff1a;选择认证类型及填写认证资料 选择认证类型及上传申请公函 政府/事业单位资质…

沙箱逃逸复现

当this指向window 原理 1.this直接指向window&#xff0c;拿到window的tostring的constructor来利用构造函数拿到process 是对象且指向沙箱外部&#xff0c;才可以利用 const vm require(vm); const script const process this.toString.constructor(return process)() pr…

vs code 如何配置保存cpolar所建立公共互联网网页的隧道参数?

文章目录 &#x1f4cb; 前言1.如何配置保存cpolar所建立的隧道参数&#xff1f;2.本地安装 VS Code并修改隧道参数2.1 Visual studio Code 下载2.2 配置Visual studio Code 相关参数2.3 编辑 cpolar.yml 隧道参数文件2.3 修改website隧道参数 3. 检查 cpolar.yml 文件配置是否…

直播课 | 大橡科技研发总监丁端尘博士“类器官芯片技术在新药研发中的应用”

从类器官到类器官芯片&#xff0c;正在生物科学领域大放异彩。 药物研发需要新方法 众所周知&#xff0c;一款新药是一个风险大、周期长、成本高的艰难历程&#xff0c;国际上有一个传统的“双十”说法——10年时间&#xff0c;10亿美金&#xff0c;才可能成功研发出一款新药…

前期自学Java之Arrays篇及JDK帮助文档的下载

Assays 数组的工具类java.util.Arrays 一. 数组的简介 由于数组对象本身并没有什么方法可以提供给我们调用&#xff0c;但API中提供了一个工具类Arrays供我们使用&#xff0c;从而可以对数组对象进行一些基本的操作 Arrays类中的方法都是static修饰的静态方法&#xff0c;在…

Spring-1-透彻理解Spring XML的Bean创建--IOC

学习目标 上一篇文章我们介绍了什么是Spring,以及Spring的一些核心概念&#xff0c;并且快速快发一个Spring项目&#xff0c;实现IOC和DI&#xff0c;今天具体来讲解IOC 能够说出IOC的基础配置和Bean作用域 了解Bean的生命周期 能够说出Bean的实例化方式 一、Bean的基础配置 …

jenkins准备

回到目录 jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&#xff0c;也可独立运行。通常与版本管理工具(SCM)、构…

项目中使用非默认字体

项目场景&#xff1a; 由于开发需要&#xff0c;默认的字体不符合开发需求&#xff0c;有时候我们需要引入某种字体到项目中 解决方案&#xff1a; 首先需要下载或引入字体包 然后创建一个 index.css 文件用于声明引入字体名称 font-face {font-family: "YouSheBiao…

用html+javascript打造公文一键排版系统13:增加半角字符和全角字符的相互转换功能

一、实践发现了bug和不足 今天用了公文一键排版系统对几个PDF文件格式的材料进行文字识别后再重新排版&#xff0c;处理效果还是相当不错的&#xff0c;节约了不少的时间。 但是也发现了三个需要改进的地方&#xff1a; &#xff08;一&#xff09;发现了两个bug&#xff1a…