SpringCloud 使用sentinel

一、添加依赖

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

二、配置文件配置地址

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080

 三、流控模式介绍

直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式

关联:统计与当前资源相关的另一个资源触发阈值时,对当前资源限流

        使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是有限支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。

链路:统计从指定链路访问到本资源的请求触发阈值时,对指定链路限流

例如有两条请求链路:

/test1→ /common
/test2→/common

如果只希望统计从/test2进入到/common的请求,则可以这样配置:

注意:

1、Sentinel默认会将Controller方法做context整合,导致链路模式的流控失效,需要修改application.yml,添加配置:

spring:
 
cloud:
    sentinel:
     
web-context-unify: false # 关闭context整合

2、Sentinel默认只标记Controller中的方法为资源,如果要标记其它方法(如service方法),需要利用@SentinelResource注解,示例:

@SentinelResource("goods")
public void queryGoods() {
    System.
err.println("查询商品");
}

 四、流控效果

快速失败:QPS超过阈值时,拒绝新的请求。

warm up: QPS超过阈值时,拒绝新的请求;但QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。

排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝。

五、热点参数限流

热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。并且可以对部分参数设置例外配置:

注意:热点参数限流对默认的SpringMVC资源无效,必须手动添加@SentinelResource注解

 六、FeignClient整合Sentinel

Sentinel支持的雪崩解决方案:1、线程隔离(仓壁模式)2、降级熔断

(1)在application.yml中配置:feign.sentienl.enable=true

feign:
  sentinel:
   
enabled: true # 开启FeignSentinel功能

(2)给FeignClient编写FallbackFactory并注册为Bean

public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable throwable) {
        // 创建UserClient接口实现类,实现其中的方法,编写失败降级的处理逻辑
        return new UserClient() {
            @Override
            public User findById(Long id) {
                // 记录异常信息
                log.error("查询用户失败", throwable);
                // 根据业务需求返回默认的数据,这里是空用户
                return new User();
            }
        };
    }
}

@Bean
public UserClientFallbackFactory userClientFallback(){
    return new UserClientFallbackFactory();
}

(3)将FallbackFactory配置到FeignClient

@FeignClient(value = "userservice", fallbackFactory =UserClientFallbackFactory.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

 七、熔断降级策略

1、慢调用比例:超过指定时长的调用为慢调用,统计单位时长内慢调用的比例,超过阈值则熔断

2、异常比例:统计单位时长内异常调用的比例,超过阈值则熔断

3、异常数:统计单位时长内异常调用的次数,超过阈值则熔断

八、授权规则

授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。

 Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的。

public interface RequestOriginParser {
    /**
     * 从请求request对象中获取origin,获取方式自定义
     */
    String parseOrigin(HttpServletRequest request);
}

所以在填写流控应用的时候,是根据自定义的RequestOriginParser来填写(比如在请求header上添加值来区分是网关过来的请求还是直接访问的服务的请求)

@Component
public class HeaderOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        String origin = request.getHeader("origin");
        if(StringUtils.isEmpty(origin)){
            return "blank";
        }
        return origin;
    }
}

九、自定义返回方法

只需实现BlockExceptionHandler接口即可

@Component
public class SentinelBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(
            HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        String msg = "未知异常";
        int status = 429;
        if (e instanceof FlowException) {
            msg = "请求被限流了!";
        } else if (e instanceof DegradeException) {
            msg = "请求被降级了!"; 
        } else if (e instanceof ParamFlowException) {
            msg = "热点参数限流!";
        } else if (e instanceof AuthorityException) {
            msg = "请求没有权限!";
            status = 401;
        }
        httpServletResponse.setContentType("application/json;charset=utf-8");
        httpServletResponse.setStatus(status);
        httpServletResponse.getWriter().println("{\"message\": \"" + msg + "\", \"status\": " + status + "}");
    }
}

 十、配置规则持久化三种模式

1、原始模式:保存在内存

2、pull模式:保存在本地文件或数据库,定时去读取

3、push模式:保存在nacos,监听变更实时更新

通常生产环境采用push模式,需要修改Sentinel-dashboard的源码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CSS】课程网站 网格商品展示 模块制作 ① ( 网格商品展示模块盒子模型测量及样式 | 顶部文本标题盒子测量及样式 | 代码示例 )

文章目录一、网格商品展示模块盒子模型测量及样式1、盒子尺寸测量2、标题盒子尺寸测量和样式3、左侧文本盒子尺寸测量和样式4、右侧文本盒子尺寸测量和样式二、顶部文本标题盒子代码示例1、HTML 标签结构2、CSS 样式3、展示效果绘制矩形框中的部分 : 一、网格商品展示模块盒子…

【服务器数据恢复】NTFS分区被格式化如何恢复数据?

服务器数据恢复环境&故障&#xff1a; 误操作格式化服务器RAID5磁盘阵列下的分区&#xff08;NTFS文件系统&#xff09;。 服务器数据恢复过程&#xff1a; 1、将故障服务器连接到北亚企安备份服务器上&#xff0c;将故障服务器的所有硬盘设置为脱机状态&#xff0c;然后以…

什么是中间件?

一、什么是中间件&#xff1f; 1、百度百科 中间件是介于应用系统和系统软件之间的一类软件&#xff0c;它使用系统软件所提供的基础服务&#xff08;功能&#xff09;&#xff0c;衔接网络上应用系统的各个部分或不同的应用&#xff0c;能够达到资源共享、功能共享的目的。目…

手写简易 Spring(二)

文章目录手写简易 Spring&#xff08;二&#xff09;1. 扩展 BeanFactory 接口2. 实现资源加载器&#xff0c;从 Spring.xml 解析和注册 Bean 对象1. 核心实现类 XmlBeanDefinitionReader3. 实现应用上下文&#xff0c;自动识别、资源加载、扩展机制1. 应用上下文2. 核心实现类…

java基础之抽象类与接口

文章目录1.抽象方法和抽象类2.抽象类的作用3.接口4.接口和抽象类的异同5.面向接口编程1.抽象方法和抽象类 抽象方法和抽象类必须使用abstract修饰符来定义&#xff0c;有抽象方法的类只能被定义成抽象类&#xff0c;抽象类里可以没有抽象方法。 抽象类必须使用abstract修饰符来…

【Redis学习】Redis入门概述

Redis是什么 Redis:REmote Dictionary Server(远程字典服务器) 官网介绍&#xff1a;The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.&#xff08;被数百万开发人员用作数据库、缓存、流…

在云服务部署前后端以及上传数据库

1.上传数据库(sql文件) 首先建立一个目录&#xff0c;用于存放要部署的sql文件&#xff0c;然后在此目录中进入mysql 进入后建立一个数据库&#xff0c;create database 数据库名 完成后&#xff0c;通过select * from 表名可以查到数据说明导入成功。 2.部署Maven后端 将Ma…

【预处理和程序环境】

预处理和程序环境一、程序的翻译环境和执行环境二、详解编译链接三、#define1. #define定义标识符2. #define定义宏3. #define的替换规则4. #和##4.1 #的使用4.2 ##的使用四、宏和函数对比五、条件编译一、程序的翻译环境和执行环境 我们的代码写完后称为源代码&#xff0c;源…

如何正确配置美国网络服务器?

在使用美国网络服务器时&#xff0c;充分注意其配置对于确保服务器和网络的性能、稳定性和安全性至关重要。网络服务器配置是指设置和配置网络服务器的硬件和软件以使其启动和运行的过程。它涉及多个步骤&#xff0c;包括配置操作系统、网络协议、安全设置、用户访问、共享资源…

linux驱动开发 - 01_字符设备驱动开发

文章目录字符设备驱动开发1. 字符设备驱动简介2 字符设备驱动开发步骤2.1 驱动模块的加载和卸载2.2 字符设备注册与注销2.3 实现设备的具体操作函数2.4 添加 LICENSE 和作者信息3 Linux 设备号3.1 设备号的组成3.2 设备号的分配4 chrdevbase 字符设备驱动开发实验4.1 实验程序编…

QT 之基础(一) 详解UI文件设计与运行机制

一、项目文件组成 1.1 创建一个项目文件 建立好项目如下 &#xff08;1&#xff09;项目组织文件【untitled.pro】 存储项目设置文件 QT core gui //表示项目中添加core gui模块 greaterThan(QT_MAJOR_VERSION, 4): QT widgets //条件执行语句&#xf…

【消息队列】聊一下如何避免消息的重复消费

什么是重复消费 一条消息在传输过程中&#xff0c;为了保证消息的不丢失&#xff0c;可能会多少量的消息进行重试&#xff0c;这样就可能导致Broker接受到的消息出现重复&#xff0c;如果说下游系统没有针对业务上的处理&#xff0c;那么可能导致同一笔借款或者支付订单出现重…

【Java多线程基础】Java线程的状态及主要转换方法

借鉴文献&#xff1a; 深入浅出Java多线程 注&#xff1a;《深入浅出Java多线程》是一本书&#xff0c;小编看的是它的 pdf&#xff0c;上面那个网页和书中内容是一致的。小编在起初学习多线程的时候是通过看视频的形式&#xff0c;学的模模糊糊的&#xff0c;这本书感觉很适合…

商务车改装后,有哪些情况会导致异响?

一、开车时出现了异响&#xff0c;主要由这些情况导致。&#xff08;1&#xff09;像商务车&#xff0c;二排基本都升级成了航空座椅&#xff0c;可能是出厂就有问题&#xff0c;拼接处没做好&#xff0c;导致座椅来回磨蹭。另外固定航空座椅螺丝没拧好&#xff0c;车子开动后会…

HTML5 <bdi> 标签、HTML5 <bdo> 标签

HTML5 <bdi> 标签 实例 将用户名从周围的文本方向设置中隔离出来&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>w3cschool官网 - 编程狮&#xff0c;随时随地学编程</title> </head&g…

uni-app利用chooseImage方法封装一个图片选择组件

效果如图&#xff1a; 可以预览 长按可删除 可以设置最多上传数量 这里封装的组件有个MaxNumber &#xff0c;number类型&#xff0c;用的时候在父组件传就行了&#xff0c;这里默认给的8 废话不多说直接上代码 封装好了之后我们用的时候只需要引入直接用就行 <templat…

TypeScript学习笔记之二(高级类型)

文章目录一、TypeScript高级类型1.1 class类1.2 class继承1.3 class类成员可见性1.4 readonly1.5 类型兼容性1.5.1 对象之间的类型兼容性1.5.2 接口之间类型兼容性1.5.3 函数之间类型兼容性1.6 交叉类型1.7 交叉类型(&)和继承(extends)的对比二、泛型2.1 泛型约束--指定更具…

考虑大规模电动汽车接入电网的双层优化调度策略【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

蓝奥声核心技术分享——基于物联网的能源监测数据采集技术

1.技术背景 基于物联网的能源监测数据采集技术主要解决物联网能源监测节点面向目标对象以协同方式进行能源监测数据采集的问题&#xff0c;属于蓝奥声核心技术--边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术涉及无线物联网边缘智能与测控的技术领域&…

智能化生产,提高效率!使用关键词采集工具助力企业数字化转型

关键词采集工具在企业数字化转型中的优势和作用进行阐述。 随着信息技术的不断发展&#xff0c;企业数字化转型已经成为了企业发展的必然趋势。 对于各种规模的企业而言&#xff0c;数字化转型可以提升企业的生产效率、降低成本、提高产品质量等方面带来更多的发展机遇。 而关…