Spring Cloud Sentinel(限流、熔断、降级)、SpringBoot整合Sentinel、Sentinel的使用-60

news2024/11/26 15:30:25

一:Sentinel简介

Sentinel就是分布式系统的流量防卫兵
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

1.1 官方文档

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

1.2 项目地址

项目地址:https://github.com/alibaba/Sentinel

1.3 特征

在这里插入图片描述

  1. 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  2. 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  3. 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  4. 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

1.4 Sentinel 分为两个部分

  1. 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  2. 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的Tomcat
  3. Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。

1.5 基本概念

  • 资源
    资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
  • 规则
    围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

1.6 主要作用——流量控制、熔断降级、系统负载保护

  1. 什么是熔断
    A 服务调用 B 服务的某个功能,由于网络不稳定问题,或者 B 服务卡机,导致功能时间超长。如果这样子的次数太多。我们就可以直接将 B 断路了(A 不再请求 B 接口),凡是调用 B 的直接返回降级数据,不必等待 B 的超长执行。 这样 B 的故障问题,就不会级联影响到 A。
  2. 什么是降级
    整个网站处于流量高峰期,服务器压力剧增,根据当前业务情况及流量,对一些服务和页面进行有策略的降级[停止服务,所有的调用直接返回降级数据]。以此缓解服务器资源的的压力,以保证核心业务的正常运行,同时也保持了客户和大部分客户的得到正确的相应。
  • 相同点:
    1、为了保证集群大部分服务的可用性和可靠性,防止崩溃,牺牲小我
    2、用户最终都是体验到某个功能不可用

  • 不同点:
    1、熔断是被调用方故障,触发的系统主动规则
    2、降级是基于全局考虑,停止一些正常服务,释放资源

  1. 什么是限流
    对打入服务的请求流量进行控制,使服务能够承担不超过自己能力的流量压力

1.7 Hystrix 与 Sentinel比较

在这里插入图片描述
Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。

熔断降级设计理念
在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。Hystrix 通过 线程池隔离 的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本(过多的线程池导致线程数目过多),还需要预先给各个资源做线程池大小的分配。

Sentinel 对这个问题采取了两种手段:

  • 通过并发线程数进行限制
    和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步
    堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
  • 通过响应时间对资源进行降级
    除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复

二:SpringBoot整合Sentinel

2.1 引入依赖

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

2.2 下载sentinel-dashboard的jar包

在这里插入图片描述
使用 java -jar sentinel-dashboard-1.6.3.jar启动sentinel
在这里插入图片描述
注:默认是8080端口,如果8080端口被占用,那么可以修改对应的端口号

 java -jar sentinel-dashboard-1.6.3.jar --server.port=8333

在这里插入图片描述
成功启动!!!!

2.3 配置sentinel控制台地址信息

作用就是将信息收集到控制台

# 控制台地址配置
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8333
# 传输端口
spring.cloud.sentinel.transport.port=8719

2.4 实时监控——endpoint支持

1)每一个微服务都引入actuator信息审计模块依赖
在springboot模块添加此依赖,可以实时统计应用的健康状况信息,请求调用信息。sentinel可以获取到这些信息进行实时监控

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

2)暴露endpoint端口

#暴露所有端点
management.endpoints.web.exposure.include=*

2.5 自定义sentinel流控返回数据

1)新建配置类

@Configuration
public class GulimailSeckillSentinelConfig {

    public GulimailSeckillSentinelConfig() {

        WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {
            @Override
            public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException {
                R error = R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(), BizCodeEnume.TO_MANY_REQUEST.getMsg());
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/json");
                response.getWriter().write(JSON.toJSONString(error));

            }
        });

    }

}

2)进行全局配置

三:使用sentinel对feign的远程调用进行保护

3.1 调用方的熔断保护机制

3.1.1 引入依赖

引入openfeign依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

引入sentinel依赖

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

3.1.2 加入配置

feign.sentinel.enabled=true

此时就可以检测到feign的远程调用

3.1.3 修改feign的远程调用接口

@feignClient注解中添加fallback回调方法

@FeignClient(value = "gulimail-seckill",fallback = SeckillFeignServiceFallBack.class)

添加回调实现类

@Component
@Slf4j
public class SeckillFeignServiceFallBack implements SeckillFeignService {
    @Override
    public R getSkuSeckillInfo(Long skuId) {
        log.info("熔断方法调用。。。getSkuSeckillInfo");
        return R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(),BizCodeEnume.TO_MANY_REQUEST.getMsg());
    }
}

3.2 调用方手动指定远程服务的降级策略

在这里插入图片描述
RT:超过1ms就会降级
时间窗口:在这10秒以内就不会调用此方法,等10秒过后继续尝试调用
远程服务被降级处理后,sentinel就不会调用远程服务了,默认触发熔断回调方法

3.3 设置远程服务的方法

优点:远程服务不停机,返回默认的熔断数据(限流后的数据)
缺点:超大流量浏览的时候,必须牺牲一些远程服务,远程服务指定降级规则后,此时不会运行自己的业务逻辑

四:自定义受保护资源

4.1 基于代码的方式

1)使用try-catch的方式定义受保护的资源

        try(Entry entry = SphU.entry("seckillSkus")) {
            //业务逻辑
        } catch (Exception e) {
            log.error("资源被限流:{}",e.getMessage());
            e.printStackTrace();
        }
  • seckillSkus:受保护的资源名称

2)在操作页面添加流控规则
在这里插入图片描述

4.2 基于注解——@SentinelResource

1)添加注解

@SentinelResource(value = "getCurrentSeckillSkusResource",blockHandler = "blockHandler")

2)blockHandler——指定降级后方法的回调

blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

    /**
     * getCurrentSeckillSkus降级后的回调方法
     * @return
     */
    public List<SeckillSkuRedisTo> blockHandler(BlockException e){
        log.error("getCurrentSeckillSkusResource资源被限流:{}",e.getMessage());
        return null;
    }

3)fallback——针对异常的回调
fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:

  • 返回值类型必须与原函数返回值类型一致;
  • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
  • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

注:无论注解还是try-catch都需要配置被限流以后的默认返回,url请求可以设置统一返回:WebCallbackManager

五:网关层sentinel流控

https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81
在这里插入图片描述

5.1 概念

Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑:

  • GatewayFlowRule:网关限流规则,针对 API Gateway 的场景定制的限流规则,可以针对不同 route 或自定义的 API 分组进行限流,支持针对请求中的参数、Header、来源 IP 等进行定制化的限流。
  • ApiDefinition:用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api,请求 path 模式为 /foo/** 和 /baz/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。

其中网关限流规则 GatewayFlowRule 的字段解释如下:

  • resource:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称。
  • resourceMode:规则是针对 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中定义的 API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是 route。
  • grade:限流指标维度,同限流规则的 grade 字段。
  • count:限流阈值
  • intervalSec:统计时间窗口,单位是秒,默认是 1 秒。
  • controlBehavior:流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败。
  • burst:应对突发请求时额外允许的请求数目。
  • maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。
  • paramItem:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段:
    1. parseStrategy:从请求中提取参数的策略,目前支持提取来源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM)四种模式。
    2. fieldName:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称。
    3. pattern:参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。(1.6.2 版本开始支持)
    4. matchStrategy:参数值的匹配策略,目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX)。(1.6.2 版本开始支持)

用户可以通过 GatewayRuleManager.loadRules(rules) 手动加载网关规则,或通过 GatewayRuleManager.register2Property(property) 注册动态规则源动态推送(推荐方式)。

5.2 在网关层整合sentinel依赖

<!--引入sentinel依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>

5.3 在网关控制台进行配置

在这里插入图片描述
在这里插入图片描述
api名称与网关配置文件的id保持一致

5.4 指定回调的类型

#回调的类型
spring.cloud.sentinel.scg.fallback.content-type=application/json
#指定回调的状态码
spring.cloud.sentinel.scg.fallback.response-status=400

六:Sentinel定制网关流控返回

添加配置类SentinelGatewayConfig

@Configuration
public class SentinelGatewayConfig {
    public SentinelGatewayConfig() {
        GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
            //网关限流了请求,就会调用此回调
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable t) {
                R error = R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(), BizCodeEnume.TO_MANY_REQUEST.getMsg());
                String errorJson = JSON.toJSONString(error);
                Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(errorJson), String.class);
                return body;
            }
        });
    }

}

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

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

相关文章

哪里可以找到电子版的大学课本?

第一个&#xff1a;中国高校课件下载网站网址&#xff1a;http://download.cucdc.com/这是一个可以下载各个大学课本的网站&#xff0c;基本上所有的大学课本都能在这里找到PDF版本。可以按学校学科搜。 第二个&#xff1a;淘链客网址&#xff1a;https://www.toplinks.cc/s/PD…

MySQL_存储引擎

存储引擎 MySQL体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功能&#xff0c;如SQL接口&…

读书:《如何想到又做到》

全书最有用的内容是下面这张图&#xff1a;持久改变的SCIENCE模型。 作者为了方便读者记忆&#xff0c;找了7个单词&#xff0c;首字母拼在一起就是SCIENCE&#xff0c;对应着7种武器&#xff1a; S 阶梯&#xff08;Stepladders&#xff09;&#xff1a;小而又小的迭代 C 社群…

高性能零售IT系统的建设09-Spring Boot2.4.2+Spring Cloud+Nacos+Feign+Hystrix的生产级应用实例

开篇 通过前面8篇我们已经感受到了我接手时这个项目有多“烂”&#xff0c;当然喽如果只是一味的承认它的烂这不是积极乐观主义。 我在接触管理早期听过一次四大厂的报告&#xff0c;报告中说到&#xff1a;从来没有屎一样的团队只有屎一样的“带队”。 这也符合我们一直接受的…

SpringMVC @RequestHeader @CookieValue 处理获取请求参数的乱码问题

SpringMVC RequestHeader CookieValue 处理获取请求参数的乱码问题RequestHeaderCookieValue什么是cookie通过POJO获取请求参数通过CharacterEncodingFilter处理获取请求参数的乱码问题get请求的乱码post请求乱码处理获取请求参数的乱码问题)RequestHeader 1.RequestHeader是将…

实时计算业务介绍实时日志分析

4.1 实时计算业务介绍 学习目标 目标 了解实时计算的业务需求知道实时计算的作用应用 无 4.1.1 实时计算业务需求 实时&#xff08;在线&#xff09;计算&#xff1a; 解决用户冷启动问题实时计算能够根据用户的点击实时反馈&#xff0c;快速跟踪用户的喜好 4.1.2 实时计算…

编译与优化

第10章 前端编译与优化 10.2.1 Javac的源码与调试 从Javac代码的总体结构来看&#xff0c;编译过程大致可以分为1个准备过程和3个处理过程&#xff0c;它们分别如下 所示。 1&#xff09;准备过程&#xff1a;初始化插入式注解处理器。 2&#xff09;解析与填充符号表过程&…

【C++】异常

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;C语言传统…

精神财富 物质财富

今天聊到别的家庭每天都制定好计划的&#xff0c;补习班 party 冬令营什么之类的&#xff0c;这个是我们达不到的。有人提前开启了认知&#xff0c;赚到了人生的第一桶金。懂得付出&#xff0c;和执行输出差了好多数量级。 今天看了杂技表演&#xff0c;男人和女人配合的好好 …

C++ 初阶 :stackqueue

文章目录1 stack的介绍2 stack的模拟实现3 queue的介绍4 queue的模拟实现5 priority_queue(优先级队列)介绍6 priority_queue 模拟实现7 仿函数8 deque的简单介绍8.1 deque与vector list的比较8.2 为什么选择deque作为stack和queue的底层默认容器1 stack的介绍 ①stack是一种容…

Springboot校园食堂外卖点餐系统357

目 录 1 概述 1 1.1课题背景及意义 1 1.2 国内外研究现状 1 1.3 本课题主要工作 2 2 系统开发环境 3 2.1 java简介 3 2.2 Mysql数据库 3 2.3 B/S结构 4 2.4 JSP技术介绍 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2操作…

javaEE 初阶 — Socket 套接字与 UDP 数据报套接字编程

文章目录1. Socket 套接字1.1 有连接与无连接1.2 可靠与不可靠传输1.3 面向字节流与面向数据报1.4 全双工与半双工2. UDP数据报套接字编程2.1 DatagramSocket API2.2 DatagramPacket API2.3 InetSocketAddress API3. UDP 版本的客户端服务器程序3.1 服务器实现3.2 客户端实现3.…

【JUC并发编程】Java内存模型——JMM

【JUC并发编程】Java内存模型——JMM详解 文章目录【JUC并发编程】Java内存模型——JMM详解一&#xff1a;并发编程模型的两个关键问题二&#xff1a;Java内存模型的抽象结构1&#xff1a;从 CPU 缓存模型说起2&#xff1a;JMM3&#xff1a;JMM与Java内存区域划分的区别与联系4…

(考研湖科大教书匠计算机网络)第三章数据链路层-第二节:封装成帧

专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;封装成帧概述二&#xff1a;封装成帧作用&#xff08;1&#xff09;帧定界A&#xff1a;概述B&#xff1a;注意&#xff08;2&#xff09;透明传输A&#xff1a;字符填充B&…

设置Linux的信任列表

前言 我们在使用普通用户的时候&#xff0c;我们可以对指令提权&#xff0c;需要用到sudo指令,但是我们在使用的时候会报错。 原因就是&#xff0c;我们linux系统不信任你&#xff0c;必须将你放到我们的信任列表中&#xff0c;我们就可以使用我们的指令提权。 下图是我们在不是…

数据库系统概论②——关系数据库基础

本篇文章主要讲解关系数据库基础中的基本概念&#xff0c;包括关系模型概述、关系的完整性约束等等内容。 同时想要了解更多数据库系统概论知识的朋友可以看下我的上一篇文章数据库系统概论①——数据库系统基本概念 文章目录1、关系数据库的基本概念1.1 关系模型概述1.2 关系数…

【26】C语言_数据存储

目录 数据类型的意义 大小端介绍 例题1&#xff1a;设计一个小程序输出存储方式&#xff1a; 例题2&#xff1a;下列程序输出什么&#xff0c;为什么 例题3&#xff1a;下列程序输出什么&#xff0c;为什么 例题4&#xff1a;下列程序输出什么&#xff0c;为什么 例题6&a…

函数知识点总结

函数知识点总结 函数知识点总结 一、平面直角坐标系中点的坐标 1. 各象限内2. 坐标轴上3. 各象限角平分线上4. 与坐标轴平行的直线上的点5. 点到坐标轴及原点的距离6. 平面上两点距离 一、平面直角坐标系中点的坐标 1. 各象限内 象限x,yx,\,yx,y 的关系第一象限x>0,y&…

powerDesigner如何将数据库中已有表逆向生成pdm文件

问题背景 系统升级&#xff0c;要在原有数据库表结构基础之上重构表系统&#xff0c;为了节省时间&#xff0c;原来能使用的表结构保留&#xff0c;制作升级变动&#xff0c;所以用到了powerDesigner的逆向生成工具。 解决方案 第一种 创建新的PDM工程 点击左上角File&…

一起Talk Android吧(第四百七十六回:缩放类视图动画)

文章目录使用方法属性介绍示例代码各位看官们大家好&#xff0c;上一回中咱们说的例子是"渐变类视图动画",这一回中咱们说的例子是" 缩放类视图动画"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&#xff01;使用方法 缩放类动画…