spring cloud alibaba Sentinel详解

news2025/5/26 1:43:40

spring cloud alibaba Sentinel详解

spring cloud alibaba Sentinel介绍

  • Sentinel 是阿里巴巴开源的一款动态流量控制组件,主要用于保障微服务架构中的服务稳定性。它能够对微服务中的各种资源(如接口、服务方法等)进行实时监控、流量控制、熔断降级等操作。

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

  • Sentinel 的核心功能是基于资源的流量控制(限流)和熔断降级。当微服务的流量超过设定的阈值时,Sentinel 可以通过拒绝多余的请求来防止系统过载,就像交通信号灯可以控制道路上的车流量一样。而熔断降级则是在某个服务出现异常时,暂时停止对该服务的调用,避免故障蔓延,给系统一个自我修复的机会。

安装Sentinel控制台

通过网盘分享的文件:sentinel-dashboard-1.8.8.jar
链接: 提取码: 7pa7
链接: https://pan.baidu.com/s/1od_f6KVfeM5tUJloFPbY5w?pwd=7pa7

下载完成后将他放在一个非中文路径的包下

进入这个包下 输入cmd
使用命令 java -jar sentinel-dashboard-1.8.8.jar 运行即可

启动成功后 访问localhost:8080 进入这个页面
在这里插入图片描述
默认用户和密码都为:sentinel

登陆成功后显示这个页面是因为我们还没将微服务接入sentinel
在这里插入图片描述

Sentinel使用步骤

  1. 导入依赖
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
  1. 在微服务中配置sentinel的地址 因为sentinel是懒加载 所以我们给他配置 eager: true 在项目启动的时候就加载
spring.cloud.sentinel.transport.dashboard=localhost:8080
spring.cloud.sentinel.eager=true
  1. 使用@SentinelResource注解

    @GetMapping("/create")
    public Order createOrder(@RequestParam("userId") Long userId,
                             @RequestParam("productId") Long productId){
        Order order = orderService.createOrder(productId,userId);
        return order;
    }
package com.nie.order.service;

import com.nie.order.bean.Order;

public interface OrderService {

    Order createOrder(Long productId ,Long userId);
}

package com.nie.order.service.Impl;

import com.nie.order.bean.Order;
import com.nie.order.feign.ProductFeignClient;
import com.nie.order.service.OrderService;
import com.nie.product.bean.Product;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

@Slf4j
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private ProductFeignClient productFeignClient;

    @SentinelResource(value = "createOrder")
    public Order createOrder(Long productId , Long userId) {
        Product product= productFeignClient.getPoductFeign(productId);

        Order order = new Order();
        order.setId(1L);
        //TODO 总金额
        order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));
        order.setUserId(userId);
        order.setNickName("zhangsan");
        order.setAddress("小聂");
        //TODO 远程查询商品列表
        order.setProductList(Arrays.asList(product));

        return order;
    }
}

package com.nie.order.feign;

import com.nie.order.feign.fallback.ProductFeignClientFallback;
import com.nie.product.bean.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;

@FeignClient(value = "service-product",fallback = ProductFeignClientFallback.class ) //feign客户端
public interface ProductFeignClient {


    //mvc注解的两套使用逻辑
    //放在controller上  是接受这样的请求
    //放在FeignClient上  是发送这样的请求
    @GetMapping("/product/{id}")
    Product getPoductFeign(@PathVariable("id") Long id);



}

运行之后就是这样的效果
在这里插入图片描述

异常处理

当web接口被限制的时候我们可以自定义异常处理

这里我们给create添加一个流量控制 即每秒只能访问一次
在这里插入图片描述

package com.nie.common;

import lombok.Data;

@Data
public class R {
    private Integer code;
    private String msg;
    private Object data;

    public static R ok() {
        R r = new R();
        r.setCode(200);
        return r;
    }

    public static R ok(String msg,Object data) {
        R r = new R();
        r.setCode(200);
        r.setMsg(msg);
        r.setData(data);
        return r;
    }

    public static R error(){
        R r = new R();
        r.setCode(500);
        return r;
    }

    public static R error(Integer code, String msg) {
        R r = new R();
        r.setCode(code);
        r.setMsg(msg);
        return r;
    }

}

package com.nie.order.exception;

import com.alibaba.csp.sentinel.adapter.spring.webmvc_v6x.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nie.common.R;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

import java.io.PrintWriter;


@Component
public class MyBlockExceptionHander implements BlockExceptionHandler {

    private ObjectMapper objectMapper=new ObjectMapper();


    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, String name, BlockException e) throws Exception {

        PrintWriter writer = response.getWriter();
        response.setContentType("application/json;charset=utf-8");

        R error = R.error(500, name + "被Sentinel限制了,原因为:" + e.getMessage());

        String json = objectMapper.writeValueAsString(error);

        writer.write(json);
    }
}

当我们一秒钟连续多次访问后 他给前端返回的就是我们自己写的信息
在这里插入图片描述

当@SentinelResource触发限制规则

如果没有触发限制规则 则正常运行 如果触发了限制规则 则运行我们写的兜底回调的代码 即createOrderFallback方法

    @SentinelResource(value = "createOrder",blockHandler = "createOrderFallback")
    public Order createOrder(Long productId , Long userId) {
        Product product= productFeignClient.getPoductFeign(productId);

        Order order = new Order();
        order.setId(1L);
        //TODO 总金额
        order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));
        order.setUserId(userId);
        order.setNickName("zhangsan");
        order.setAddress("小聂");
        //TODO 远程查询商品列表
        order.setProductList(Arrays.asList(product));

        return order;
    }


    //写兜底回调的业务逻辑
    public Order createOrderFallback(Long productId , Long userId, BlockException e) {
        Order order = new Order();
        order.setId(1L);
        order.setTotalAmount(productFeignClient.getPoductFeign(productId).getPrice());
        order.setUserId(userId);
        order.setNickName("zhangsan");
		
        return order;
    }

openFeign触发限制规则

package com.nie.order.feign;

import com.nie.order.feign.fallback.ProductFeignClientFallback;
import com.nie.product.bean.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;

@FeignClient(value = "service-product",fallback = ProductFeignClientFallback.class ) //feign客户端
public interface ProductFeignClient {


    //mvc注解的两套使用逻辑
    //放在controller上  是接受这样的请求
    //放在FeignClient上  是发送这样的请求
    @GetMapping("/product/{id}")
    Product getPoductFeign(@PathVariable("id") Long id);

}

package com.nie.order.feign.fallback;

import com.nie.order.feign.ProductFeignClient;
import com.nie.product.bean.Product;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;


@Component
public class ProductFeignClientFallback implements ProductFeignClient {


    @Override
    public Product getPoductFeign(Long id) {
        System.out.println("兜底回调.......");
        Product product = new Product();
        product.setId(id);
        product.setNum(1);
        product.setProductName("未知商品");
        product.setPrice(new BigDecimal(3));
        return product;
    }
}

流控规则

流量控制:限制多余的请求,从而保护系统资源不被耗尽
在这里插入图片描述

在这里插入图片描述

流控模式

  • 直接:直接对资源进行设置 多余的资源直接丢弃
    在这里插入图片描述
  • 关联:假如一个操作有读和写的时候 当写的操作量过大的时候就会对读进行限制
    当出现资源竞争的时候会使用关联
  • 链路: 根据不同的调用链 去来只限制某一个调用链
    注意这里要关闭上下文统一
web-context-unify: false

在这里插入图片描述

熔断规则

熔断降级

熔断降级作为保护自己的手段,通常在客户端(调用端)j进行配置.
在这里插入图片描述

  • 慢调用比例
    慢调用比例是指在一定时间内,响应时间超过预设阈值的请求占总请求数的比例。这个指标可以帮助开发者识别性能瓶颈,即哪些服务调用或方法执行时间较长,
  • 异常比例
    异常比例是指在一定时间内,发生异常(如抛出异常、错误返回等)的请求占总请求数的比例。这个指标可以帮助开发者了解服务的稳定性和错误处理能力。
  • 异常数
    异常数是指在一定时间内,发生异常的请求的总次数。这个指标提供了一个具体的数值,帮助开发者量化异常的发生频率。

热点规则

    @GetMapping("/seckill")
    @SentinelResource(value = "seckill-order", fallback = "seckillFallback")
    public Order seckill(@RequestParam("userId") Long userId,
                         @RequestParam("productId") Long productId){
        Order order = orderService.createOrder(productId, userId);
        order.setId(Long.MAX_VALUE);
        return order;
    }

    public Order seckillFallback(Long userId, Long productId, BlockException exception){
        System.out.println("已经开始限制了");
        Order order = new Order();
        order.setId(productId);
        order.setUserId(userId);
        order.setAddress("异常信息:" + exception.getClass());
        return order;
    }

在这里插入图片描述

这是说明我们按照第一个参数来规定 一个用户每一秒只能访问一次

当访问过快的时候的结果就是这样
在这里插入图片描述

注意 当我们在使用fallback 时 将错误写为Throwable
在使用blockHandler时,将错误写为BlockException

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

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

相关文章

React19源码系列之渲染阶段performUnitOfWork

在 React 内部实现中&#xff0c;将 render 函数分为两个阶段&#xff1a; 渲染阶段提交阶段 其中渲染阶段可以分为 beginWork 和 completeWork 两个阶段&#xff0c;而提交阶段对应着 commitWork。 在之前的root.render过程中&#xff0c;渲染过程无论是并发模式执行还是同…

DL00987-基于深度学习YOLOv11的红外鸟类目标检测含完整数据集

提升科研能力&#xff0c;精准识别红外鸟类目标&#xff01; 完整代码数据集见文末 针对科研人员&#xff0c;尤其是研究生们&#xff0c;是否在鸟类目标检测中遇到过数据不够精准、处理困难等问题&#xff1f;现在&#xff0c;我们为你提供一款基于深度学习YOLOv11的红外鸟类…

黑马程序员C++2024新版笔记 第4章 函数和结构体

1.结构体的基本应用 结构体struct是一种用户自定义的复合数据类型&#xff0c;可以包含不同类型的成员。例如&#xff1a; struct Studet {string name;int age;string gender; } 结构体的声明定义和使用的基本语法&#xff1a; struct 结构体类型 {成员1类型 成员1名称;成…

数据仓库,扫描量

有五种通用技术用于限制数据的扫描量&#xff0c;正如图3 - 4所示。第一种技术是扫描那些被打上时戳的数据。当一个应用对记录的最近一次变化或更改打上时戳时&#xff0c;数据仓库扫描就能够很有效地进行&#xff0c;因为日期不相符的数据就接触不到了。然而&#xff0c;目前的…

Vue3性能优化: 大规模列表渲染解决方案

# Vue3性能优化: 大规模列表渲染解决方案 一、背景与挑战 背景 在大规模应用中&#xff0c;Vue3的列表渲染性能一直是开发者关注的焦点。大规模列表渲染往往会导致卡顿、内存占用过高等问题&#xff0c;影响用户体验和系统整体性能。 挑战 渲染大规模列表时&#xff0c;DOM操作…

【RocketMQ 生产者和消费者】- 生产者启动源码 - MQClientInstance 定时任务(4)

文章目录 1. 前言2. startScheduledTask 启动定时任务2.1 fetchNameServerAddr 拉取名称服务地址2.2 updateTopicRouteInfoFromNameServer 更新 topic 路由信息2.2.1 topic 路由信息2.2.2 updateTopicRouteInfoFromNameServer 获取 topic2.2.3 updateTopicRouteInfoFromNameSer…

超全GPT-4o 风格提示词案例,持续更新中,附使用方式

本文汇集了各类4o风格提示词的精选案例&#xff0c;从基础指令到复杂任务&#xff0c;从创意写作到专业领域&#xff0c;为您提供全方位的参考和灵感。我们将持续更新这份案例集&#xff0c;确保您始终能够获取最新、最有效的提示词技巧。 让我们一起探索如何通过精心设计的提…

Android 自定义SnackBar和下滑取消

如何自定义SnackBar 首先我们得了解SnackBar的布局&#xff1a; 之前我看有一些方案是获取内部的contentLayout&#xff0c;然后做一些处理。但是现在已经行不通了&#xff1a; RestrictTo(LIBRARY_GROUP) public static final class SnackbarLayout extends BaseTransientB…

Netty学习专栏(三):Netty重要组件详解(Future、ByteBuf、Bootstrap)

文章目录 前言一、Future & Promise&#xff1a;异步编程的救星1.1 传统NIO的问题1.2 Netty的解决方案1.3 代码示例&#xff1a;链式异步操作 二、ByteBuf&#xff1a;重新定义数据缓冲区2.1 传统NIO ByteBuffer的缺陷2.2 Netty ByteBuf的解决方案2.3 代码示例&#xff1a;…

详解 C# 中基于发布-订阅模式的 Messenger 消息传递机制:Messenger.Default.Send/Register

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

多场景游戏AI新突破!Divide-Fuse-Conquer如何激发大模型“顿悟时刻“?

多场景游戏AI新突破&#xff01;Divide-Fuse-Conquer如何激发大模型"顿悟时刻"&#xff1f; 大语言模型在强化学习中偶现的"顿悟时刻"引人关注&#xff0c;但多场景游戏中训练不稳定、泛化能力差等问题亟待解决。Divide-Fuse-Conquer方法&#xff0c;通过…

Java 函数式接口(Functional Interface)

一、理论说明 1. 函数式接口的定义 Java 函数式接口是一种特殊的接口&#xff0c;它只包含一个抽象方法&#xff08;Single Abstract Method, SAM&#xff09;&#xff0c;但可以包含多个默认方法或静态方法。函数式接口是 Java 8 引入 Lambda 表达式的基础&#xff0c;通过函…

分布式锁总结

文章目录 分布式锁什么是分布式锁&#xff1f;分布式锁的实现方式基于数据库(mysql)实现基于缓存(redis)多实例并发访问问题演示项目代码(使用redis)配置nginx.confjmeter压测复现问题并发是1&#xff0c;即不产生并发问题并发30测试,产生并发问题(虽然单实例是synchronized&am…

使用MybatisPlus实现sql日志打印优化

背景&#xff1a; 在排查无忧行后台服务日志时&#xff0c;一个请求可能会包含多个执行的sql&#xff0c;经常会遇到SQL语句与对应参数不连续显示&#xff0c;或者参数较多需要逐个匹配的情况。这种情况下&#xff0c;如果需要还原完整SQL语句就会比较耗时。因此&#xff0c;我…

client.chat.completions.create方法参数详解

response client.chat.completions.create(model"gpt-3.5-turbo", # 必需参数messages[], # 必需参数temperature1.0, # 可选参数max_tokensNone, # 可选参数top_p1.0, # 可选参数frequency_penalty0.0, # 可选参数presenc…

深入浅出人工智能:机器学习、深度学习、强化学习原理详解与对比!

各位朋友&#xff0c;大家好&#xff01;今天咱们聊聊人工智能领域里最火的“三剑客”&#xff1a;机器学习 (Machine Learning)、深度学习 (Deep Learning) 和 强化学习 (Reinforcement Learning)。 听起来是不是有点高大上&#xff1f; 别怕&#xff0c;我保证把它们讲得明明…

基于 ColBERT 框架的后交互 (late interaction) 模型速递:Reason-ModernColBERT

一、Reason-ModernColBERT 模型概述 Reason-ModernColBERT 是一种基于 ColBERT 框架的后交互 (late interaction) 模型&#xff0c;专为信息检索任务中的推理密集型场景设计。该模型在 reasonir-hq 数据集上进行训练&#xff0c;于 BRIGHT 基准测试中取得了极具竞争力的性能表…

vector中reserve导致的析构函数问题

接上一节vector实现&#xff0c;解决杨辉三角问题时&#xff0c;我在最后调试的时候&#xff0c;发现return vv时&#xff0c;调用析构函数&#xff0c;到第四步时才析构含有14641的vector。我设置了一个全局变量i来记录。 初始为35&#xff1a; 当为39时&#xff0c;也就是第…

微软开源多智能体自定义自动化工作流系统:构建企业级AI驱动的智能引擎

微软近期推出了一款开源解决方案加速器——Multi-Agent Custom Automation Engine Solution Accelerator,这是一个基于AI多智能体协作的自动化工作流系统。该系统通过指挥多个智能体(Agent)协同完成复杂任务,显著提升企业在数据处理、业务流程管理等场景中的效率与准确性。…

安卓无障碍脚本开发全教程

文章目录 第一部分&#xff1a;无障碍服务基础1.1 无障碍服务概述核心功能&#xff1a; 1.2 基本原理与架构1.3 开发环境配置所需工具&#xff1a;关键依赖&#xff1a; 第二部分&#xff1a;创建基础无障碍服务2.1 服务声明配置2.2 服务配置文件关键属性说明&#xff1a; 2.3 …