springcloud笔记(7)-限流降级Sentinel

news2024/11/20 13:42:56

官方文档:概述 | Spring Cloud Alibaba

basic-api-resource-rule | Sentinel (sentinelguard.io)

Sentinel是SpringCloudAlibaba的组件。

sentinel的功能

introduction | Sentinel

流量控制

熔断降级:降低调用链路中的不稳定资源

系统负载保护:让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求,放置系统雪崩。

限流降级​

在微服务系统中,一个对外的业务功能可能会涉及很长的服务调用链路。当其中某个服务出现异常,如果没有服务调用保护 机制可能会造成该服务调用链路上大量相关服务直接或间接调用的服务器仍然持续不断发起请求,最终导致相关的所有服务资源耗尽产生异常发生雪崩效应。限流和降级分别作为在流量控制和服务保护方面的两个重要手段,可以有效地应对此类问题。

限流 blockHandler​

限流是指对微服务系统中某个服务的某个接口的访问量进行限制,以避免过大的流量将服务实例击垮。其一般是通过为服务设置流量阈值,当达到限制的阈值时,可以采取一些策略进行处理,比如排队、返回错误信息等来对请求进行响应以实现对服务实例的保护。在微服务系统中,限流主要是针对服务提供者而言的。

降级 Fallback​

降级是指当某个服务出现异常或者被限流时,对该服务的调用进行降级处理,比如返回一个默认值,返回一个兜底数据等。在微服务系统中,降级主要是针对服务消费者而言的。

Sentinel概述​

Spring Cloud Alibaba 集成的开箱即用限流降级方案来自 Sentinel,其以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

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

官方示例:https://github.com/alibaba/spring-cloud-alibaba/tree/2022.x/spring-cloud-alibaba-examples/sentinel-example

对应项目的readme有教程

sentinel中的概念

资源:资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则:围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。 

sentinel的工作流程

basic-implementation | Sentinel

springboot中使用sentinel

quick-start | Sentinel

1、引入依赖

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

 IDEA里没有maven idea开发工具右侧没有maven工具栏 – 源码巴士

打开的pom.xml文件中,鼠标右键,点击【 Add as Maven Project】解决

2. 接入限流埋点

埋点文档:annotation-support | Sentinel (sentinelguard.io)


   -HTTP 埋点

      Sentinel starter 默认为所有的 HTTP 服务提供了限流埋点,如果只想对 HTTP 服务进行限流,那么只需要引入依赖,无需修改代码。


   - 自定义埋点

      如果需要对某个特定的方法进行限流或降级,可以通过 `@SentinelResource` 注解来完成限流的埋点,示例代码如下:

      ```java
      @SentinelResource("resource")
      public String hello() {
          return "Hello";
      }
      ```

Sentinel 提供了 @SentinelResource 注解用于定义资源annotation-support | Sentinel

这里的hello()方法就成为了一个资源。

Sentinel 支持配置 blockHandler 和 fallback 函数来进行限流之后的处理。示例:

// 原本的业务方法.
@SentinelResource(blockHandler = "blockHandlerForGetUser")
public User getUserById(String id) {
    throw new RuntimeException("getUserById command failed");
}

// blockHandler 函数,原方法调用被限流/降级/系统保护的时候调用
public User blockHandlerForGetUser(String id, BlockException ex) {
    return new User("admin");
}

注意 blockHandler 函数会在原方法被限流/降级/系统保护的时候调用,而 fallback 函数会针对所有类型的异常。请注意 blockHandler 和 fallback 函数的形式要求,更多指引可以参见 Sentinel 注解支持文档。

3. 配置限流规则


    Sentinel 提供了两种配置限流规则的方式:代码配置 和 控制台配置。

代码配置

通过代码配置限流规则,流控规则来指定允许该资源通过的请求次数,例如下面的代码定义了资源 HelloWorld 每秒最多只能通过 20 个请求。

private static void initFlowRules(){
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule();
    rule.setResource("HelloWorld");
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // Set limit QPS to 20.
    rule.setCount(20);
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}

控制台方式

 下载sentinel控制台,

https://edas-public.oss-cn-hangzhou.aliyuncs.com/install_package/demo/sentinel-dashboard.jar

启动

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

在应用的配置文件中,增加如下控制台配置信息:

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

这里的 spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了1个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。

更多 Sentinel 控制台的使用及问题参考 Sentinel控制台。

访问控制台

 启动sentinel-core-example

 sentinel可以看到启动的应用

 新增流控规则,资源名填写需要限流的 URL 相对路径或者是`@SentinelResource` 注解 `value` 字段的值,单机阈值选择需要限流的阈值,点击新增进行确认。(这里将值设置成了 1)

 访问URL,当QPS超过1,可以看到限流效果。这里返回的是默认的效果,也可以自定义限流处理逻辑。

各种规则配置

basic-api-resource-rule | Sentinel (sentinelguard.io)

Sentinel 控制台

dashboard | Sentinel (sentinelguard.io)

 实时监控


Sentinel 控制台支持实时监控查看,您可以通过 Sentinel 控制台查看各链路的请求的通过数和被限流数等信息。
其中 `p_qps` 为通过(pass) 流控的 QPS,`b_qps` 为被限流 (block) 的 QPS。

 用jmeter对/hello进行压测,发现QPS超过100的会被拒绝,因为默认配置了系统规则入口QPS上限为100。

系统规则

客户端支持​

Spring Cloud Alibaba 提供的 Sentinel 有关 Starter 提供了对 Spring Cloud 生态中如 OpenFeign、RestTemplate 等主流的客户端组件的适配支持。

OpenFeign

可以看官方示例sentinel-openfeign-example

sentinel,对程序内部异常(各种异常,包括超时)这种捕捉,显得很乏力,它主要是针对流量控制,系统吞吐量,或者是异常比例这种,会发生降级或熔断,但是当程序内部发生异常,直接返回给用户错误页面,根本不会触发异常比例这种降级。所以才需要整合open-feign 来解决程序内部异常时,配置相应的兜底方法
————————————————
版权声明:本文为CSDN博主「hancoder」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hancoder/article/details/109063671​

spring-cloud-starter-alibaba-sentinel 适配了 OpenFeign 组件。如果想使用,除了引入必要的 Starter 依赖外还需要在配置文件打开 sentinel 对 feign 的支持:

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

feign.sentinel.enabled=true

这是一个 FeignClient 的简单使用示例:

@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class)
public interface EchoService {
    @GetMapping(value = "/echo/{str}")
    String echo(@PathVariable("str") String str);
}

class FeignConfiguration {
    @Bean
    public EchoServiceFallback echoServiceFallback() {
        return new EchoServiceFallback();
    }
}

class EchoServiceFallback implements EchoService {
    @Override
    public String echo(@PathVariable("str") String str) {
        return "echo fallback";
    }
}

@FeignClient 注解中的所有属性,Sentinel 都做了兼容。

sentinel-openfeign-example

sentinel-openfeign-example定义了三个接口,三个接口调用httpbinClient的方法
在接口httpbinClient中,使用了@FeignClient注释,指定了访问的url和fallbackFactory = EchoServiceFallbackFactory.class,这个属性是用来指定当Feign客户端调用失败时使用的回退工厂类,类EchoServiceFallbackFactory返回了HttpbinClientFallback,
在HttpbinClientFallback中定义了每个方法的return,具体的失败规则在SentinelRulesConfiguration类中配置。

启动应用,1s内连续访问接口,可以看到降级规则生效,返回了fallback方法。

RestTemplate​

spring-cloud-starter-alibaba-sentinel 支持对 RestTemplate 的服务调用使用 Sentinel 进行保护,在构造 RestTemplate bean的时候需要加上 @SentinelRestTemplate 注解。

@Bean
@SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class)
public RestTemplate restTemplate() {
    return new RestTemplate();
}

@SentinelRestTemplate 注解的属性支持限流(blockHandler, blockHandlerClass)和降级(fallback, fallbackClass)的处理。

其中 blockHandler 或 fallback 属性对应的方法必须是对应 blockHandlerClass 或 fallbackClass 属性中的静态方法。

该方法的参数跟返回值跟 org.springframework.http.client.ClientHttpRequestInterceptor#interceptor 方法一致,其中参数多出了一个 BlockException 参数用于获取 Sentinel 捕获的异常。

比如上述 @SentinelRestTemplate 注解中 ExceptionUtil 的 handleException 属性对应的方法声明如下:

public class ExceptionUtil {
    public static ClientHttpResponse handleException(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException exception) {
        ...
    }
}

NOTE: 应用启动的时候会检查 @SentinelRestTemplate 注解对应的限流或降级方法是否存在,如不存在会抛出异常

@SentinelRestTemplate 注解的限流(blockHandler, blockHandlerClass)和降级(fallback, fallbackClass)属性不强制填写。

当使用 RestTemplate 调用被 Sentinel 熔断后,会返回 RestTemplate request block by sentinel 信息,或者也可以编写对应的方法自行处理返回信息。这里提供了 SentinelClientHttpResponse 用于构造返回信息。

Sentinel RestTemplate 限流的资源规则提供两种粒度:

  • httpmethod:schema://host:port/path:协议、主机、端口和路径

  • httpmethod:schema://host:port:协议、主机和端口

NOTE: 以 淘宝网 - 淘!我喜欢 这个 url 并使用 GET 方法为例。对应的资源名有两种粒度,分别是 GET:https://www.taobao.com 以及 GET:https://www.taobao.com/test。

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

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

相关文章

什么是接口自动化?为什么要做?和怎么做接口自动化?

服务端接口测试介绍 什么是服务端&#xff1f; 一般所说的服务端是指为用户在 APP 或 PC 使用的互联网功能提供数据服务的背后的一切。以天猫精灵智能音箱系列的产品链路为例&#xff0c;服务端便是网关&#xff08;包括网关在内&#xff09;之后的链路。 什么是接口&#xf…

数据结构—— AVL树

&#xff08;一&#xff09; 基础补充 二叉搜索树(BST) 定义&#xff1a; 二叉搜索树&#xff08;Binary Search Tree&#xff09;&#xff0c;简写BST&#xff0c;是满足某些条件的特殊二叉树。任何一个节点的左子树上的点&#xff0c;都必须小于当前节点。任何一个…

java split分割去掉空值

代码如下&#xff1a; public static void main(String[] args) {String dataString "#01#02#03#00#05#434";String[] infos Arrays.stream(dataString.split("#")).filter(s -> !s.isEmpty()).toArray(String[]::new);//投向领域IDString[] infos2 d…

深度学习-房价预测案例

1. 实现几个函数方便下载数据 import hashlib import os import tarfile import zipfile import requests#save DATA_HUB dict() DATA_URL http://d2l-data.s3-accelerate.amazonaws.com/def download(name, cache_diros.path.join(.., data)): #save"""下载…

独立站活动怎么复盘,做独立站需要掌握哪些?-站斧浏览器

独立站的活动形式多种多样&#xff0c;可以通过推出抽奖活动、举办线下活动或者利用社交媒体平台来增加用户互动和参与度。但是要做好一个独立站&#xff0c;除了活动形式&#xff0c;还需要掌握设计能力、编程技术、SEO知识和内容创作能力。 独立站活动怎么复盘&#xff1f; …

学习编程-先改变心态

编程失败的天才 林一和我很久以前就认识了——我从五年级就认识他了。他是班上最聪明的孩子。如果每个人在家庭作业或考试准备方面需要帮助&#xff0c;他们都会去那里。 有趣的是&#xff0c;林一不是那种连续学习几个小时的孩子。 他的聪明才智似乎与生俱来&#xff0c;几乎毫…

Selenium八大定位策略实战,你会了么?

Selenium是一款非常强大的自动化测试工具&#xff0c;支持多种编程语言&#xff0c;如Java、Python等。在使用Selenium进行自动化测试时&#xff0c;定位元素是非常重要的一步&#xff0c;只有正确定位到元素才能进行后续的操作&#xff0c;如输入数据、点击按钮等。在Selenium…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Radio

单选框&#xff0c;提供相应的用户交互选择项。该组件从API Version 8开始支持。无子组件。 一、接口 Radio(options: {value: string, group: string}) 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 参数: 二、属性 除支持通用属性外&#xff0c;还支持以…

springBoot组件注册

springBoot组件注册 前言1、创建组件文件2、写属性3、生成get和set方法4、以前注册的方法5、现在注册的方法6、在启动文件查看7、多实例Scope("prototype")8、注册第三方包导入对应的场景启动器注册组件查看是否存在也可以通过Import(FastsqlException.class)导入但是…

文字雨特效

效果展示 CSS 知识点 简易实现云朵技巧text-shadow 属性的灵活运用filter 属性实现元素自动变色 实现页面布局 <div class"container"><div class"cloud"><h2>Data Clouds Rain</h2></div> </div>实现云朵 实现云…

什么是API网关?——驱动数字化转型的“隐形冠军”

什么是API网关 API网关&#xff08;API Gateway&#xff09;是一个服务器&#xff0c;位于应用程序和后端服务之间&#xff0c;提供了一种集中式的方式来管理API的访问。它是系统的入口点&#xff0c;负责接收并处理来自客户端的请求&#xff0c;然后将请求路由到相应的后端服…

代码随想录第14天 | ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

300.最长递增子序列 /*** param {number[]} nums* return {number}*/ var lengthOfLIS function(nums) {let dp Array(nums.length).fill(1);let result 1;for(let i 1; i < nums.length; i) {for(let j 0; j < i; j) {if(nums[i] > nums[j]) {dp[i] Math.max…

最新开源ThinkPHP6框架云梦卡社区系统源码/亲测可用(全新开发)

源码简介&#xff1a; 最新开源ThinkPHP6云梦卡社区系统源码&#xff0c;它是一款基于ThinkPHP 6框架开发的开源社区系统源码。该系统源码具有强大而稳定的后端架构&#xff0c;和简洁易操作的前端界面&#xff0c;能够给人们提供完整的社区功能和更具体的服务。 全新云梦卡社…

fiddler如何抓模拟器中APP的包

第一步&#xff1a;fiddler配置 1、打开fiddler&#xff0c;依次点击工具&#xff08;tools&#xff09;》选项&#xff08;options&#xff09; 2、进入HTTPS选项&#xff0c;先选中DecryptHTTPStraffic&#xff0c;再选中ignore server certificate errors (unsafe) 3、点击…

【战略合作】新的游戏合作伙伴来袭,CARV 助力 Aavegotchi 发展!

想象这样的一个世界&#xff0c;你的游戏成就不仅仅是徽章&#xff0c;而是你链上声誉的一部分&#xff01;我们的最新游戏合作伙伴 CARV 便遵循这样的愿景。CARV 与 Aavegotchi 达成合作&#xff0c;旨在将下一代游戏玩家引入 Web3 世界。 CARV 正在构建一个以游戏为核心的身…

【云计算】相关解决方案介绍

文章目录 1.1 云服务环境 Eucalyptus1.1.1 介绍1.1.2 开源协议及语言1.1.3 官方网站 1.2 开源云计算平台 abiCloud1.2.1 开源协议及语言1.2.2 官方网站 1.3 分布式文件系统 Hadoop1.3.1 开源协议及语言1.3.2 官方网站 1.4 JBoss云计算项目集 StormGrind1.4.1 开源协议及语言1.4…

C# 图像灰化处理方法及速度对比

图像处理过程中&#xff0c;比较常见的灰化处理&#xff0c;将彩色图像处理为黑白图像&#xff0c;以便后续的其他处理工作。 在面对大量的图片或者像素尺寸比较大的图片的时候&#xff0c;处理速度和性能就显得非常重要&#xff0c;下面分别用3种方式来处理图像数据&#xff0…

紫光同创FPGA实现UDP协议栈网络视频传输,基于YT8511和RTL8211,提供4套PDS工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案紫光同创FPGA精简版UDP方案紫光同创FPGA带ping功能UDP方案 3、设计思路框架OV7725摄像头配置及采集OV5640摄像头配置及采集UDP发送控制视频数据组包数据缓冲FIFOUDP协议栈详解RGMII转GMII动态ARPUDP协议IP地址、端口…

gradle版本是7.1.3加载arr包踩坑

第一次尝试&#xff1a; 将arr包放入到libs中&#xff0c; 在build.gradle中添加 implementation(name:**, ext:aar) Make project报错&#xff1a; Could not find :jdsmart-common-b3593f1-1.2.04:. Required by:project :launcherserver Search in build.gradle files根据…

工业网关都是什么?具体怎么应用?

随着工业自动化的不断发展&#xff0c;各种协议和标准在行业中变得越来越重要。其中&#xff0c;工业网关是实现不同设备之间通信和数据传输的关键设备。本文将以HiWoo Box为例&#xff0c;介绍工业网关的概念、应用场景以及具体的应用方式。 一、工业网关的概念 工业网关是一…