SpringCloud-Alibaba-Sentinel服务降级,热点限流,服务熔断

前言:
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用

熔断策略
Sentinel 提供以下几种熔断策略:

慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断、

慢调用比例:
最大 RT:200意思是 在200毫秒处理完这个请求
比例阀值:1 意思是是 在200毫秒处理一个请求 你设置几就就200毫秒处理几个

熔断时长:1意思是一秒内不可用
最小请求数:5 意思是 一秒5次请求


异常比例:
比例阀值:官网:(异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%)0.3意思错误的达到了百分之30的时候 触发熔断

熔断时间:1的意思是一秒之间不可用
最小请求数:5一秒5个

异常数
异常数:3意思是超过3个异常,就是第4次进入熔断服务降级,当第五次请求是对的就会恢复
熔断时长:1秒

热点参数限流
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

示例:
这里有两个 参数一个是A 一个是B热点限流是根据设置参数的下标设置的,下表是从0开始的,
@SentinelResource注解设置要限流的id, blockHandler设置返回可预知的响应体

 @GetMapping(value = "select/test")
 @SentinelResource(value = "test",blockHandler = "teat1")
 public String test(@RequestParam(value = "a",required = false) Integer a,@RequestParam(value = "b",required = false) Integer b){

 return "我是:Sentinel";

 }

设置的可预知的响应体这个的BlockException是必须的参数

 public String teat1(@RequestParam(value = "a",required = false) Integer a,@RequestParam(value = "b",required = false)Integer b, BlockException e){

 return "没错我就是我了";

 }

配置
test是@SentinelResource(value = "test",blockHandler = "teat1")
参数索引:0就是0下标
单机阀值:1处理的个数
统计窗口时长 1是一秒处理完成

高级选项

参数类型:选择参数的数据类型
参数值:1就参数如果等于1就限流
限流阀: 3就是3次

这些可以自己测试

服务熔断

Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。

@SentinelResource 注解

@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource 注解包含以下属性:

value:资源名称,必需项(不能为空)
entryType:entry 类型,可选项(默认为 EntryType.OUT)
blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
fallback / fallbackClass:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
1.8.0 版本开始,defaultFallback 支持在类级别进行配置。

注:1.6.0 之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。

特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandler、fallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出(若方法本身未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException)。

示例:

1,fallback处理java异常

@SentinelResource(value = "select",fallback = "ErrorFallback")

代码

 @GetMapping(value = "select/{id}")
 @SentinelResource(value = "select",fallback = "ErrorFallback")
 public CommonResult getid(@PathVariable Long id){

  if(id>3) {
  throw new NullPointerException(id+"没有记录");
  }else {
  return restTemplate.getForObject(URL + "/select/" + id, CommonResult.class);
  }

 }

fallback 处理方法

public CommonResult ErrorFallback(@PathVariable Long id,Throwable e){

 return new CommonResult<>(500,"不好意,没有此记录");
 }

处理结果

blockHandler 处理sentinel配置异常 java的异常无法处理

@SentinelResource(value = "select",blockHandler = "ErrorFallback")

 public CommonResult ErrorFallback(@PathVariable Long id, BlockException e){

 return new CommonResult<>(500,"不好意,没有此记录"+e.getMessage());
 }

测试
这设置的是异常比例 异常达到百分之30进行熔断


两个注解同时用

 @SentinelResource(value = "select",blockHandler = "ErrorFallback",fallback = "ErrorFallback1")
public CommonResult ErrorFallback1(@PathVariable Long id, Throwable e){

 return new CommonResult<>(500,"fallback:不好意,没有此记录"+e.getMessage());
 }
 public CommonResult ErrorFallback(@PathVariable Long id, BlockException e){

 return new CommonResult<>(500,"blockHandler:不好意,没有此记录"+e.getMessage());
 }

但是 要是blockHandler 和fallback 同时配置则被限流降级抛出异常BlockException 处理

exceptionsToIgnore 
 @SentinelResource(value = "select",blockHandler = "ErrorFallback",fallback = "ErrorFallback1"
   ,exceptionsToIgnore = {IllegalAccessException.class})
blockHandlerClass=定义返回统一返回方法.class

业务

@GetMapping(value = "select/test")
 @SentinelResource(value = "test",blockHandlerClass= MySentinel.class,blockHandler = "a")
 public String test(@RequestParam(value = "a",required = false) Integer a,@RequestParam(value = "b",required = false) Integer b){

 return "我是:Sentinel";

 }

熔断降级

package com.tang.cloud.mysentinel;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import jdk.nashorn.internal.ir.Block;
import org.bouncycastle.crypto.engines.BlowfishEngine;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 统一返回降级处理
 */
public class MySentinel {

 //返回的的类型和调用的方法的类型一致,参数的类型和个数相同
 public static String a(@RequestParam(value = "a",required = false) Integer a, @RequestParam(value = "b",required = false) Integer b, BlockException excep){

 return "我在在另一个类中定义的方法";
 }
 }

到此这篇关于SpringCloud-Alibaba-Sentinel服务降级热点限流服务熔断的文章就介绍到这了,更多相关SpringCloud-Alibaba-Sentinel-服务降级内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringCloud-Alibaba-Nacos启动失败解决方案

    下载及启动 Nacos 下载地址:https://github.com/alibaba/nacos/releases 在Windows下,进入bin目录,双击 startup.cmd 即可运行 启动出现问题 问题:双击 startup.cmd 启动失败,窗口一闪而过 你需要先去试试你的 Tomcat 能否启动:进入 Tomcat 安装目录 bin 文件夹,双击 startup.bat 如果能正常启动,出门右转,下面的不用看了

  • springcloud使用Hystrix进行微服务降级管理

    前言:目前我们的项目是微服务架构,基于dubbo框架,服务之间的调用是通过rpc调用的.刚开始没有任何问题,项目运行健康.良好.可是过了一段时间,线上总有人反应查询订单失败,等过了一段时间才能查到.这是怎么回事呢?打开后台的日志一看出现了一些RpcException和TimeOutException,原来是远程调用超时了,可能某个服务在请求的高发期访问数据库异常,IO阻塞,返回接口异常了.后来这个问题越来越频繁,如何解决这个棘手的问题呢? 一:Hystrix是什么? 1.1:基本解释 Hystr

  • springcloud alibaba nacos linux配置的详细教程

    首先从github上下载nacos的压缩包:https://github.com/alibaba/nacos/releases 下载完成之后,通过WinSCP把文件传到linux服务器上 接着通过tar -zxvf命令将此压缩包解压 解压完成之后,进入conf目录下的 clusmter.conf文件打开并在里面加上 通过:wq命令保存退出 接着通过vim命令进入startup.sh 此处修改完成之后,找到这个文件最下面的位置 添加红框中的相关配置,保存退出 接着进入nginx的conf文件中 找

  • springcloud 服务降级的实现方法

    1 .简介 什么是服务降级?当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作. 如果还是不理解,那么可以举个例子:假如目前有很多人想要给我付钱,但我的服务器除了正在运行支付的服务之外,还有一些其它的服务在运行,比如搜索.定时任务和详情等等.然而这些不重要的服务就占用了JVM的不少内存与CPU资源,为了能把钱都收下来(钱才是目标),我设计了一个动态开关,把这些不重要的服务直接在最外层拒掉,这样处

  • SpringCloud微服务之Hystrix组件实现服务熔断的方法

    一.熔断器简介 微服务架构特点就是多服务,多数据源,支撑系统应用.这样导致微服务之间存在依赖关系.如果其中一个服务故障,可能导致系统宕机,这就是所谓的雪崩效应. 1.服务熔断 微服务架构中某个微服务发生故障时,要快速切断服务,提示用户,后续请求,不调用该服务,直接返回,释放资源,这就是服务熔断. 熔断生效后,会在指定的时间后调用请求来测试依赖是否恢复,依赖的应用恢复后关闭熔断. 2.服务降级 服务器高并发下,压力剧增的时候,根据当业务情况以及流量,对一些服务和页面有策略的降级(可以理解为关闭不必

  • 浅析SpringCloud Alibaba-Nacos 作为注册中心示例代码

    文档地址 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md 1. 下载nacos-server https://github.com/alibaba/nacos/releases 2.启动nacos-server 默认使用nacos nacos 登录 Linux/Un

  • Springcloud hystrix服务熔断和dashboard如何实现

    服务在经过一定负荷之后,如果达到一定上限之后会中断进行报错,而服务调用的方法也会报错等等,一旦整体服务停下,别的客户端再来访问就会无法调用.对此需要进行另外一种服务熔断模式. 不同于现实中的熔断保险丝,服务熔断是在系统服务达到一定错误之后,自动熔断降级,采取备用方法,但是在一定时间后客户端再次调用成功后,一定时间内成功率上去,系统的熔断机制会慢慢的关闭,恢复到正常请求的状态. 本篇接上一章直接改动. 1.主启动类加上新的注解. @EnableCircuitBreaker 2.service写入新

  • SpringCloud Alibaba Seata (收藏版)

    一.简介 官网地址: http://seata.io/zh-cn/ 1,概念 Seata是一款开源的分布式事务解决方案,致力于在微服务架构在提供高性能和简单一样的分布式事务服务. 2,处理过程 Transaction ID XID:全局唯一的事务ID Transaction Coordinator(TC) :维护全局和分支事务的状态,驱动全局事务提交或回滚. Transaction Manager™ :定义全局事务的范围:开始全局事务.提交或回滚全局事务. Resource Manager(RM

  • SpringCloud-Alibaba-Sentinel服务降级,热点限流,服务熔断

    前言: 除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一.一个服务常常会调用别的模块,可能是另外的一个远程服务.数据库,或者第三方 API 等.例如,支付的时候,可能需要远程调用银联提供的 API:查询某个商品的价格,可能需要进行数据库查询.然而,这个被依赖服务的稳定性是不能保证的.如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用 熔断策略 Sentin

  • sentinel 整合spring cloud限流的过程解析

    spring cloud基于http进行服务调用,大致过程如下: 服务提供端:提供http接口,并向服务中心注册服务信息 服务消费端:将服务端的http接口作为本地服务,从注册中心读取服务提供端信息,使用feign发起远程调用 相关依赖 <!-- 服务注册与发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibab

  • Spring Cloud Alibaba微服务组件Sentinel实现熔断限流

    目录 Sentinel简介 Sentinel具有如下特性: 安装Sentinel控制台 创建sentinel-service模块 限流功能 创建RateLimitController类 根据URL限流 自定义限流处理逻辑 熔断功能 与Feign结合使用 使用Nacos存储规则 原理示意图 功能演示 Sentinel简介 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案,Sentinel 作为其核心组件之一,具有熔断与限流等一系列服务保护功能,本文将对其用法进行详细介

  • SpringCloud中使用Sentinel实现限流的实战

    目录 前言 正文 Sentinel Sentinel的限流原理 第一步:部署sentinel-dashboard 第二步:在项目中整合sentinel 前言 在分布式的项目中经常会遇到那种高并发的场景,为了保证系统不会被突然激增的请求导致宕机,我们常常会使用一种服务降级的手段来保护我们的系统,本篇博客将介绍如何使用SpringCloud中使用Sentinel实现限流,从而达到服务降级的目的. 正文 Sentinel Sentinel 是面向微服务的轻量级流量控制框架,从流量控制.熔断降级.系统负

  • Spring Cloud Alibaba使用Sentinel实现接口限流

    最近管点闲事浪费了不少时间,感谢网友 libinwalan 的留言提醒.及时纠正路线,继续跟大家一起学习Spring Cloud Alibaba. Nacos作为注册中心和配置中心的基础教程,到这里先告一段落,后续与其他结合的内容等讲到的时候再一起拿出来说,不然内容会有点跳跃.接下来我们就来一起学习一下Spring Cloud Alibaba下的另外一个重要组件:Sentinel. Sentinel是什么 Sentinel的官方标题是:分布式系统的流量防卫兵.从名字上来看,很容易就能猜到它是用来

  • zuul集成Sentinel,完成对path映射的限流操作

    zuul集成Sentinel完成对path映射的限流 前面我们讲过了对单体应用的Sentinel限流,以及使用zookeeper对规则的持久化.通过前面的工作,我们可以完成单个实例的细粒度的限流.熔断操作. 譬如有一个服务User,在分布式环境下,开启了多个实例,那么每个实例都可以获得如每秒限制10个登录的限流功能.但是有些场景下,我们想要另外一种限流方式,譬如在网关zuul层,想限制对User服务的限流,而不去关心具体它有多少个实例.这时,就需要用到网关限流了. Sentinel 1.6.0

  • Sentinel热门词汇限流的实现详解

    目录 热点参数限流 基本使用 热点参数限流 何为热点?热点即经常访问的数据.很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制.比如: 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制 热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流.热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效. 基本使用 1.引

  • 浅谈Koa服务限流方法实践

    最近接了一个需求,很简单,就是起一个server,收到请求时调用某个提供好的接口,然后把结果返回.因为这个接口的性能问题,同时在请求的不能超过特定数目,要在服务中进行限流. 限流的要求是,限制同时执行的数目,超出这个数目后要在一个队列中进行缓存. koa 中间件不调用 next 最初的想法是在 koa 中间件中进行计数,超过6个时将next函数缓存下来.等正在进行中的任务结束时,调用next继续其他请求. 之后发现 koa 中间件中,不执行next函数请求并不会停下,而是不再调用之后的中间件,直

  • Spring Cloud Gateway整合sentinel 实现流控熔断的问题

    目录 一.什么是网关限流: 二.gateway 整合 sentinel 实现网关限流: 三.sentinel 网关流控规则的介绍: 3.1.网关流控规则: 3.2.API 分组管理: 四.sentinel 网关流控实现的原理: 五.网关限流了,服务就安全了吗? 六.自定义流控异常消息: 一.什么是网关限流: 在微服务架构中,网关层可以屏蔽外部服务直接对内部服务进行调用,对内部服务起到隔离保护的作用,网关限流,顾名思义,就是通过网关层对服务进行限流,从而达到保护后端服务的作用. Sentinel

  • kubernetes实现分布式限流

    目录 一.概念 1.1 使用场景 1.2 维度 1.3 分布式限流 二.分布式限流常用方案 三.基于kubernetes的分布式限流 3.1 kubernetes中的副本数 3.2 rateLimiter的创建 3.3 rateLimiter的获取 3.4 filter里的判断 四.性能压测 无限流 使用redis限流 自研限流 五.其他问题 5.1 对于保证qps限频准确的时候,应该怎么解决呢? 5.2 服务从1个节点动态扩为4个节点,这个时候新节点识别为4,但其实有些并没有启动完,会不会造成

随机推荐