Spring cloud alibaba sentinel 实战

2023-11-05

一、简介

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应过载保护、热点流量防护等多个维度保护服务的稳定性。

中文官方文档地址

二、特性

  • 丰富的应用场景
  • 完备的实时监控
  • 广泛的开源生态
  • 完善的SPI扩展机制

三、概念

  • 资源名:唯一名称,默认请求路径

  • 针对来源:可针对调用者进行限流,填微服务名称,默认default(不区分来源)

  • 阈值类型:

    • QPS(每秒请求数): 达到阈值进行限流

    • 线程数:线程数达到阈值进行限流

  • 流控模式:

    • 直接:api 达到限流规则直接限流
    • 关联:当关联的资源达到阈值,限流自己
    • 链路:只记录指定链路上的流量(指定资源从入口处进来的流量)【api级别针对来源】
  • 流控效果:

    • 快速失败:直接失败,返回异常

    • warm up:根据codeFactor(冷加载因子,默认3),从阈值/codeFactor,经过预热时长达到QPS阈值

      给一个预热时长,到达预热时间后达到阈值,刚开始时阈值为最终阈值/3

    • 排队等待

      设置超时时间

四、安装

4.1 本地安装

sentinel 下载地址

4.2 docker 安装

docker 镜像地址

version: "3.8"
services:
  sentinel:
    image: bladex/sentinel-dashboard:latest
    container_name: sentinel
    ports:
      - "8858:8858"
    networks:
      - alibaba

networks:
  alibaba:
    name: spring-cloud-alibaba

五、实例

sentinel 默认是懒加载机制,只有当接口被调用时才会被 sentinel 监控

5.1 启动sentinel

5.2 模块配置

  • pom.xml
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • application.yml
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        # 配置 sentinel dashboard 地址
        dashboard: localhost:8858
        # 默认 8719,如果被占用则自动++
        port: 8719

management:
  endpoints:
    web:
      exposure:
        include: '*'
  • controller
@RestController
@RequestMapping("FlowLimit")
public class FlowLimitController {

    @GetMapping("/testA")
    public String testA() {
        return "-----------testA";
    }

    @GetMapping("/testB")
    public String testB() {
        return "-----------testB";
    }
    
   
    @GetMapping("/testC/{id}")
    public String testC(@PathVariable Integer id) {
        log.info("-----------C");
        int i = 10 / id;
        return "-----------testC";
    }

    /**
     * 热点数据限流
     * 类似于 @HystrixCommand
     * Sentinel 必须根据 hotKey 配置规则,blockHandler 用于处理热点数据异常
     * 可根据情况设置参数例外项
     */
    @GetMapping("/hotKey")
    @SentinelResource(value = "hotKey", blockHandler = "deal_hotKey")
    public String hotKey(@RequestParam(value = "p1", required = false) String p1,
                         @RequestParam(value = "p2", required = false) String p2) {
        return "----------------hotKey";
    }

    // 热点数据降级方案
    public String deal_hotKey(String p1, String p2, BlockException exception) {
        // sentinel 默认提示 Blocked by sentinel (flow limiting)
        return "----------deal_hotKey!!!";
    }
}

六、持久化配置

  • pom.xml
<!-- sentinel 限流规则持久化依赖 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
  • application.yml
spring:
  application:
    name: sentinel-openfeign-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        # 配置 sentinel dashboard 地址
        dashboard: localhost:8858
        # 默认 8719,如果被占用则自动++
        port: 8719
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848  # nacos 配置中心地址
            dataId: ${spring.application.name} # 服务名称
            groupId: DEFAULT_GROUP # 分组
            data-type: json # 文件类型
            rule-type: flow # 规则类型
  • nacos-service
// nacos 配置中心中对应的配置文件内容
[
    {
        "resource": "/order/get/{id}", // 资源名称
        "limitApp": "default", // 来源应用
        "grade": 1, // 阈值类型:0->线程数,1->QPS
        "count": 1, // 单机阈值
        "strategy": 0, // 流控模式:0直接,1关联,2链路
        "controlBehavior": 0, // 流控效果:0快速失败,1 warm up,2排队等待
        "clusterMode": false // 是否集群
    }
]

七、注意

6.1 @SentinelResource 注解

该注解只管 sentinel 限流规则抛出的异常,不会处理 runtimeException

用于接口层次的限流

6.2 系统规则

系统层次的限流

  • load自适应(仅对 linux/Unix有效):
  • CPU usage: CPU 使用率超过某阈值触发
  • 平均 RT:所有入口流量平均RT达到阈值触发
  • 并发线程数:当入口流量并发线程数达到阈值触发
  • 入口QPS:当入口QPS达到阈值触发
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring cloud alibaba sentinel 实战 的相关文章

随机推荐

  • ADB命令开启和关闭飞行模式,两段式操作方式!!!!

    开启飞行模式 必须要先执行1 再执行2 执行1 adb shell settings put global airplane mode on 1 执行2 adb shell am broadcast a android intent act
  • Docker部署Elasticsearch集群

    编写docker compose yml version 3 7 services es01 image elasticsearch 7 10 1 container name es01 ports 9200 9200 9300 9300
  • dc-1 靶机渗透学习

    环境 Vmware 虚拟机软件 dc 1 靶机ip地址 192 168 202 130 kali攻击机ip地址 192 168 202 129 本次渗透过程kali攻击机和dc靶机都采取NAT模式 信息收集 首先用ipconfig查看当前k
  • 初始化k8s踩过的坑

    问题一 error execution phase preflight couldn t validate the identity of the API Server abort connecting 这个问题网上有很多的解决方法 大致有
  • 【OpenCV】分离多通道图像RGB的值

    原文地址 http blog csdn net xiaowei cqu article details 7558657 1 计算图像ROI区域RGB的平均值 cvAvg函数 2 通道分离 合并的时候要特别的注意 分离之后的图像时单通道的灰度
  • RabbitMQ:使用Java进行操作

    使用Java操作消息队列 现在我们来看看如何通过Java连接到RabbitMQ服务器并使用消息队列进行消息发送 这里一起讲解 包括Java基础版本和SpringBoot版本 首先我们使用最基本的Java客户端连接方式
  • shell脚本的发送消息

    我们可以利用 Linux 自带的 mesg 和 write 工具 向其它用户发送消息 需求 实现一个向某个用户快速发送消息的脚本 输入用户名作为第一个参数 后面直 接跟要发送的消息 脚本需要检测用户是否登录在系统中 是否打开消息功能 以及当
  • 基于 LLM 的知识图谱另类实践

    本文整理自社区用户陈卓见在 夜谈 LLM 主题分享上的演讲 主要包括以下内容 利用大模型构建知识图谱 利用大模型操作结构化数据 利用大模型使用工具 利用大模型构建知识图谱 上图是之前 我基于大语言模型构建知识图谱的成品图 主要是将金融相关的
  • Go交叉编译

    交叉编译是指在一个硬件平台生成另一个硬件平台的可执行文件 而Go提供了非常方便的交叉编译方式 如何编译 Go交叉编译 涉及到几个环境变量的设置 GOARCH GOOS和CGO ENABLED GOARCH 编译目标平台的硬件体系架构 amd
  • 单元测试框架-Junit

    JUnit作为Java单元测试中的首选框架 在Java开发中使用最为广泛 JUnit 在测试驱动的开发方面有很重要的发展 教程 jUnit 教程 w3cschool BeforeAll修饰的 可以作为整个Class的初始化操作 前置操作 J
  • IDEA的run maven方式启动

    安装jetty插件 1 找到Plugins 查找jetty插件 安装 IDEA Jetty Runner 安装好后重启IDEA 安装插件 Maven Helper 方法同Jetty pom xml添加
  • cocos笔记——如何读取json表

    创建json表 1 将所需数据录入excel表格 或其他可转换为json表的文档 2 复制表中需要的文字 用在线json表转换工具 如 在线json校验格式化工具 中的Excel转json功能 将表格转化为json表的格式 3 复制转化好的
  • Chrome/Edge/Firefox浏览器离线安装包下载地址总汇

    Google Chrome谷歌浏览器离完整离线安装包下载地址整理总汇 每次重装系统 都要为安装 Chrome 而烦恼 虽然现在可以直接从谷歌浏览器官网下载在线安装包进行安装 但是在线安装包安装的版本不可控 大概率是 x86 版本 而且在断网
  • maven切换镜像源

    今天像往常一样准备构建项目时报错 原因是中央仓库暂停更新 导致很多jar包都没有 1 打开settings xml文件 settings xml文件一般在maven的安装目录conf文件夹下 2 切换镜像源 定位到
  • Lecture 9

    绪论 这一章节介绍的是divide and conquer multiplication divide的意思是分开 conquer的意思是占据 控制 divide and conquer直译下来就是分开后控制 其实就是分而治之的意思 mul
  • 手动可视化裁剪点云 (附open3d python代码)

    有时候 我们想要在一个比较刁钻的角度截取点云 或者想要截取一个多边形区域的点云 用代码可能不是那么方便的截取 这个时候 还是可视化的裁剪比较方便简单 代码如下 coding utf 8 import numpy as np import c
  • radare2 使用记录

    radare2 使用记录 编译 调试分析 数据结构 rasm disasm analop 反汇编 cs disasm libarch 编译 radare2 UNIX like reverse engineering framework an
  • VSCode 无法跳转C语言函数定义和变量定义的解决方案(本地端+远程服务器端)

    文章目录 前言 1 给本地端安装 C C 插件 2 给远程服务器端安装 C C 插件 小结 前言 初次使用 VSCode 编辑代码时 估计有不少小伙伴遇到过点击函数或变量无法跳转到定义处 左侧大纲栏里也没有任何内容的情况 这是缺少 C C
  • Vue项目运行报错:operty or method “xxx“ is not defined on the instance but referenced during render.

    报错原因 属性或方法 xxx未在实例上定义 但在渲染过程中被引用 解决方法 定义这个属性或者方法 1 只渲染了 没有定义 2 定义属性或方法 注意 如果定义了还是报这个错误 那么请一定检查定义的位置是不是正确的 博主偶尔也会出现这个问题 但
  • Spring cloud alibaba sentinel 实战

    Sentinel 分布式系统流量防卫兵 一 简介 二 特性 三 概念 四 安装 4 1 本地安装 4 2 docker 安装 五 实例 5 1 启动sentinel 5 2 模块配置 六 持久化配置 七 注意 6 1 SentinelRes