Spring Cloud Alibaba —— Sentinel 详细使用

导航

  • 引言
  • 一、Sentinel的两个基本概念
  • 二、流控规则
    • 2.1 基本选项
    • 2.2 高级选项
  • 三、熔断(降级)规则
  • 四、热点规则
  • 五、授权规则(了解)
  • 六、系统规则(了解)
  • 七、自定义异常返回
  • 八、@SentinelResource
  • 九、Sentinel 规则持久化(待补充)
  • 十、Feign 整合 Sentinel 实现容错

引言

Sentinel 官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html

本文承接《Spring Cloud Alibaba —— Sentinel 入门》,继续深入使用 Sentinel。

本文总结自B站,黑马程序员视频《深入学习Java微服务开发(SpringCloud) 》(P21 - P32)。将介绍 Sentinel 的概念和功能、基本配置、流控模式、熔断降级规则、自定义规则、规则持久化,以及 Feign 整合Sentinel 实现容错降级逻辑等课题。

一、Sentinel的两个基本概念

  1. 资源
    Sentinel 中最基本的概念。资源可以指代任何需要保护的内容,可以是服务、方法,甚至可以是一段代码。例如,/order/message1 ,这个接口受到了 Sentinel 的流控保护,因此它就是一个资源。
  2. 规则
    规则就是用来定义如何进行资源保护的。主要分为三种类型:流量控制规则、熔断降级规则、系统保护规则
    学习 Sentinel 很大程度就是在学习这些规则如何配置。

服务容错的三个核心思想:不被上游压垮、不被下游拖垮、保证外界环境(cpu、内存)良好。(这也是服务雪崩的三个主要成因,见《微服务架构 —— 服务雪崩与容错方案》)
流量控制规则:针对上游请求,由于网络传输是不稳定的,这种不稳定可能导致某时刻涌入大量的请求,但系统的处理能力是有限的,Sentinel 作为调配器,可以根据需要把随机的请求调整成合适的形状。所谓合适的形状,例如漏斗,只允许通过 n 个请求,那么后面的请求就会等待前面的请求通过后才能通过。
熔断降级:当检测到调用链中出现不稳定的情况,如请求时间长或异常比例升高等。就可以针对频繁发生故障的节点的调用进行限制,避免产生级联故障。(两种手段:限制并发线程数、通过响应时间对资源降级)
系统负载保护:提供了系统纬度的自适应能力。当系统负载高时,如果还持续让请求进入,可能导致系统崩溃。在集群环境下,可以分散请求到其他机器上,如果其他机器也处于高负载状态,Sentinel 会采取必要的保护机制,让系统入口的流量和系统的负载达到一个平衡,保证系统在能力范围内处理最多请求。

Sentinel 与 Hystrix 比较
两者的原则都是一致的,都是在发现服务发生故障后,快速失败,避免产生级联故障。
区别是,Sentinel 采用并发线程数和响应时间来进行服务熔断降级,而Hystrix采用线程池隔离的方式,线程池隔离的缺点是增加了线程切换的成本。

二、流控规则

2.1 基本选项

登录 Sentinel 控制台,在簇点链路中找到需要做流控的接口,这里就以 /order/message1 接口为例:
在这里插入图片描述
打开流控规则设置会话框:
在这里插入图片描述
其中,针对来源 为 default 代表不限制来源,在微服务中,如果服务 A 和服务 B 都调用 order 服务这个接口,那么可以通过针对服务A或服务B,分别进行流控限制,如果是 default 就不做来源的区分。

QPS 不多解释,当每秒请求数达到阈值,自然就被限流。这里主要演示下 并发线程数
并发线程数代表统一时间处理请求的线程数量,如果通过一个客户端浏览器发送请求进行测试,是无法模拟的,因为http一次请求和响应只对应一个线程,手动刷新的方式只能模拟一条线程的情况,这时可以使用 jMeter 工具来进行并发线程数的测试(jMeter 参考 《jMeter 模拟 web 高并发请求》)。

首先,设置 Sentinel 流控规则为 并发线程数 = 2:
在这里插入图片描述
然后启动 jMeter,并添加线程组:
在这里插入图片描述
并添加 http 取样器,请求接口就是 http://localhost:8091/order/message1 ,并点击发送:

在这里插入图片描述
因为我们设置了流控规则为两个并发线程数,jMeter 的线程数也是2 个,因此就会占用这个线程名额,当我们另一边手动用浏览器请求接口的时候,就会被流控规则限制:

在这里插入图片描述

2.2 高级选项

在这里插入图片描述
流控模式

  • 直接(默认):接口达到限流条件时,开启限流。

  • 关联:当关联资源达到限流条件时,开启限流(适合做应用让步)。
    例如,关联一个 /order/message2 接口(该资源要确实存在,此处具体代码略),并设置关联限流模式:
    在这里插入图片描述
    它表示这个服务节点(单机)的请求每秒不得超过3个,如果关联资源 /order/message2 的请求超过3,那么就限流掉 /order/message1 的请求,让资源名指定的资源对关联资源做出让步

  • 链路:当从某个接口过来的资源达到限流条件时,开启限流。该方式可以对 服务内部的 service 层方法进行限流,例如两个controller入口都调用了某 service 方法,我们给该方法标记上@SentinelResource注解,配合链路流控模式,就可以针对某个controller进入的请求进行限流操作。它的功能有点类似于“针对来源”的配置,但区别是针对来源是针对上级服务的,而链路流控是针对上级接口的,也就是说它的粒度更细。(具体实现有一些版本问题)

流控效果

流控效果非常简单,意思就是限流掉的请求以什么方式来处理。分为三种:快速失败、预热、排队等待。

  • 快速失败(默认):直接失败,抛出异常。不做任何额外的处理,是最简单的效果。
  • Warm Up:预热,它从开始阈值到最大阈值会有一个缓冲阶段。一开始的阈值是最大阈值的 1/3,然后慢慢增长,直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景
  • 排队等待:单机阈值为每秒通过数量,其他请求排队等待,可设置超时时长,单位ms。当请求超过超时时间还未处理,就会被丢弃。

三、熔断(降级)规则

降级规则就是设置当满足什么条件的时候,对微服务进行熔断降级。
在这里插入图片描述

四、热点规则

Sentinel 可以对接口参数进行限流,以热点规则来配置。

@GetMapping("/message1")
@SentinelResource("params-api")
public String message1(String name, String age) {return "message1";
}

找到资源,设置热点规则:
在这里插入图片描述
在这里插入图片描述
配置好后,点击新增,那么当请求参数含有 name 时,就会受到该热点规则的限制,因为热点规则设置的参数索引是 0,即name:
在这里插入图片描述

五、授权规则(了解)

根据请求来源判断是否放行。
在这里插入图片描述
流控应用

标识具体来源,Sentinel 提供 RequestOriginParser 接口处理来源。只要 Sentinel 保护的接口资源被访问,Sentinel 就会调用 RequestOriginParser 实现类去解析访问来源。

授权类型

  • 若配置白名单,则只有请求来源在白名单内时才通过;
  • 若配置黑名单,则请求来源在黑名单内时不通过,其余请求可以通过。

对于流控应用,需要自定义请求来源解析器。

@Component
public class ServiceNameParser implements RequestOriginParser {/*** 解析请求来源,自定义规则*/@Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {String serviceName = httpServletRequest.getParameter("serviceName");return serviceName;}
}

然后配置授权规则:
在这里插入图片描述
像上图,当Sentinel通过自定义的 parseOrigin() 方法取到的值为 “pc” 时,就放行请求,如果是其他请求就不予通过。若配置的是黑名单,则表示当 parseOrigin() 方法返回的值为 “pc” 时,不予通过,其他请求正常放行。
在这里插入图片描述
在这里插入图片描述

六、系统规则(了解)

系统保护规则是从应用级别的入口流量进行控制的,从单台机器的总体 load 、RT、入口qps、cpu使用率和线程数五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

系统保护规则是应用纬度的,而不是资源纬度的,并且仅对入口流量(进入应用的流量)生效。

  • Load(仅对类 Unix 系统生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时,才触发系统保护。系统容量由系统的maxQps * minRt 计算得出。设定参考值一般是 cpu cores * 2.5.
  • RT:当单台机器上所有入口流量的平均 RT 达到阈值时触发系统保护,单位毫秒。
  • 线程数:当单台机器上所有入口流量的并发线程数达到阈值时触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值时触发系统保护。
  • CPU 使用率:当单台机器上所有入口流量的 CPU 使用达到阈值时触发系统保护。

七、自定义异常返回

默认情况,所有的流控规则返回的错误信息都是一样的,客户端无法通过流控的异常返回执行特定的逻辑。为了解决这个问题,我们可以自定义异常返回信息,帮助请求方区分不同的限流异常。

Sentinel 提供了一个 UrlBlockHandler 接口,只需要实现该接口就可以轻松定义异常返回。其中 BlockException 就是所有限流异常的根接口。

import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.fastjson.JSON;/*** 自定义限流返回信息*/
@Component
public class SentinelFlowLimitConfig implements UrlBlockHandler {@Overridepublic void blocked(HttpServletRequest req, HttpServletResponse resp, BlockException e) throws IOException {// 避免中文乱码问题resp.setContentType("application/json;charset=utf-8");DataResp dataResp = null;if (e instanceof FlowException) {dataResp = new DataResp(-1, "限流异常!");}resp.getWriter().write(JSON.toJSONString(dataResp));}
}@Data
@NoArgsConstructor
@AllArgsConstructor
class DataResp {private Integer code;private String msg;
}

在这里插入图片描述
除了 FlowException 之外,还有其他几种规则的限流异常,可以具体情况具体处理:
在这里插入图片描述

八、@SentinelResource

定义流控资源的注解,一般标记在方法上,常见于 controller 接口上。

除了可以指定资源名称外,@SentinelResource 还可以指定 blockHandler 和 fallback 两个属性,

    @GetMapping("/message1")@SentinelResource(value = "params-api",blockHandler = "message1Block",fallback = "message1Fallback")public String message1(String name, String age) {return "message1";}

blockHandler 指定一个方法名,用于处理当流控规则触发时对应异常需要处理的逻辑;
fallback 指定一个方法名,用于处理资源发生任何异常时需要处理的逻辑,相当于针对该接口特定的异常捕获逻辑。
如果 blockHandler 已经拦截了流控规则产生的异常,就不会再执行 fallback 定义的异常逻辑。有点类似:

try {// 资源逻辑
} catch(BlockException e) {// blockHandler 需要处理的逻辑
} catch(Throwable e) {// fallback 需要处理的逻辑
}

blockHandler 指定的方法要求必须和资源方法具有相同的返回值类型,以及参数列表,但允许参数列表最后一个参数加入一个 BlockException:

public String message1Block(String name, String age, BlockException e) {// 流控触发后需要执行的逻辑
}

同样,fallback 指定的方法也要求必须和资源方法具有相同的返回值类型,以及参数列表,但允许参数列表最后一个参数加入一个 Throwable :

public String message1Fallback(String name, String age, Throwable e) {// 更通用的异常处理逻辑
}

另外,还可以定义具体的处理类来专门针对对应资源维护具体的接口降级逻辑,具体参数是 blockHandlerClass、fallbackClass。

九、Sentinel 规则持久化(待补充)

官方文档:动态规则扩展

Sentinel 采用 c/s 架构,Dashboard 为 s,微服务节点为 c。

Sentinel Dashboard 可以为每个 Sentinel 微服务客户端设置各种限流监控规则,但这些规则默认是存储在客户端内存中,当客户端应用重启后,配置就会消失,极不稳定,所以,将规则持久化的需求是必要的。

本地文件数据源会定时轮询文件的变更,读取规则。这样既可以本地直接修改文件来更新规则,也可以通过 Dashboard 来推送规则:
在这里插入图片描述

十、Feign 整合 Sentinel 实现容错

  1. 引入相关依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 开启 feign 对 sentinel 支持
    启动类添加 @EnableFeignClients 注解,yaml 配置添加如下配置:
feign:sentinel:enabled: true
  1. 编写 FeignClient 的降级处理类
@Slf4j
@Service
public class ProductFeignFallback implements ProductFeignClient {@Overridepublic Product findByPid(Integer pid) {log.error("查询商品信息失败...");Product product = new Product();product.setPid(-100);return product;}
}
  1. 指定 FeignClient 的降级处理类
@FeignClient(value = "service-product",fallback = ProductFeignFallback.class
)
public interface ProductFeignClient {@GetMapping("/product/{pid}")Product findByPid(@PathVariable("pid") Integer pid);
}
  1. 降级逻辑处理
    当 findByPid 方法返回 -100时,就代表走了降级实现,我们可以返回下单失败消息:
    @GetMapping("/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {log.info("接收到{}号商品的下单请求,准备调用商品微服务", pid);// 调用商品微服务,查询商品信息Product product = productService.findByPid(pid);// 下单(即创建订单并保存)Order order = new Order();if (product.getPid() == -100) {order.setUsername("下单失败!");return order;}// ...其他的费降级逻辑...}    

测试:正常调用 order --> product 微服务调用成功,可以返回皮大衣以及订单id:
在这里插入图片描述
当关闭 product 微服务之后,就出现我们的降级响应:
在这里插入图片描述
这样就实现了降级逻辑的处理,和前面 @SentinelResource 有类似的效果。

不过,这种 fallback 还是不理想。我们无法取得 Feign 调用失败的真正异常,最好采用 fallbackFactory 来实现:

@Slf4j
@Service
public class ProductFallbackFactory implements FallbackFactory<ProductFeignClient> {@Overridepublic ProductFeignClient create(Throwable throwable) {return new ProductFeignClient() {@Overridepublic Product findByPid(Integer pid) {log.error("查询商品信息失败...");log.error("{}", throwable);Product product = new Product();product.setPid(-100);return product;}};}
}

当然,FeignClient 接口不要既指定了 fallback 又指定了 fallbackFactory,留一个即可:

@FeignClient(value = "service-product",
//        fallback = ProductFeignFallback.class,fallbackFactory = ProductFallbackFactory.class
)
public interface ProductFeignClient {@GetMapping("/product/{pid}")Product findByPid(@PathVariable("pid") Integer pid);
}

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

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

相关文章

扫地机器人单扫和双扫_小米扫拖机器人体验:再见了,拖把君

小米在2016年首次推出了扫地机器人&#xff0c;凭借产品力和性价比&#xff0c;可以说为中国家庭的智能清洁概念普及&#xff0c;立下一功。不过&#xff0c;近两年因为一直没有推出扫拖一体产品&#xff0c;急得民间高手都开始自己动手给米家扫地机改造拖地功能了&#xff0c;…

Spring Cloud —— Gateway 服务网关

导航一、什么是服务网关二、业界常见网关组件三、Spring Cloud Gateway四、Gateway 快速入门4.1 创建 gateway 服务4.2 添加 gateway 依赖和 nacos 依赖4.3 配置路由信息4.4 测试路由转发五、Gateway 执行流程六、Gateway 断言6.1 内置路由断言工厂6.2 自定义路由断言工厂七、G…

图形显卡_选核芯显卡还是独立显卡?这才是决定笔记本电脑性能的关键

买笔记本电脑的时候&#xff0c;选核芯显卡还是独立显卡是很多朋友纠结的问题。核芯显卡是建立在和处理器同一内核芯片上的图形处理单元&#xff0c;而独立显卡拥有单独的图形核心和独立的显存。那么具体哪个更好呢&#xff1f;这里就来介绍一下。两者各自的特点核芯显卡和传统…

Spring Cloud —— 链路追踪技术

导航一、什么是链路追踪二、Spring Cloud Sleuth2.1 相关概念三、Sleuth 入门案例四、Zipkin 的集成4.1 Zipkin 介绍4.2 Zipkin 服务端安装4.3 Zipkin 客户端安装五、Zipkin 数据持久化5.1 MySQL 数据持久化5.2 Elasticsearch 数据持久化一、什么是链路追踪 在大型系统的微服务…

bool类型数组转换成一个整数_「PHP」常用的数组键值操作函数,面试重点

数组键值操作函数1、array_values ( array $array ) : array返回数组中所有的值的数组$a[name>jikeshiguangji,age>26];print_r(array_values($a));运行结果&#xff1a;$aarray("name">"jikeshiguangji","age">"26");pri…

Spring Cloud —— 消息队列与 RocketMQ

导航一、什么是 MQ二、常见的 MQ 产品三、RocketMQ 概念与架构设计3.1 基本概念1、消息模型&#xff08;Message Model&#xff09;2、生产者与消费者&#xff08;Producer & Consumer&#xff09;3、主题&#xff08;Topic&#xff09;4、代理服务器与名称服务&#xff08…

惠普打印机只打印一半_惠普打印机如何安装 惠普打印机加墨方法【介绍】

对于多数上班族和学生党来说&#xff0c;平时办公和学习不仅仅离不开 电脑 &#xff0c;与此同时还需要 打印机 起到辅助作用。目前市场上的打印机品牌较多&#xff0c;惠普就是其中知名度较高的一个牌子&#xff0c;拥有大批的消费群体。但是有些人在将打印机买回来之后&#…

Spring Cloud —— RocketMQ 的消息类型

导航引言一、普通消息1.1 可靠同步发送1.2 可靠异步发送1.3 单向发送二、顺序消息三、事务消息3.1 什么是事务消息3.2 事务消息示例1、编写本地事务逻辑2、发送半事务消息3、注册本地事务监听器4、测试引言 本文承接《Spring Cloud —— 消息队列与 RocketMQ》 RocketMQ 提供…

城市运行一网统管_全国率先!“一屏观天下、一网管全城”,临港城市运行“一网统管”平台启动建设...

景区里是否出现了大客流&#xff1f;渣土车是否有违规&#xff1f;工地上有没有安全隐患&#xff1f;……8月12日&#xff0c;临港新片区城市运行“一网统管”平台正式启动建设&#xff0c;临港新片区城市运行“一网统管”中长期规划也正式发布&#xff0c;通过构建具有临港新片…

Spring Cloud Alibaba —— Nacos Config 配置中心

导航引言一、什么是配置中心二、常见的配置中心组件三、Nacos Config 入门四、Nacos Config 动态配置4.1 硬编码方式&#xff08;默认支持动态生效&#xff09;4.2 属性注入五、配置共享5.1 相同微服务不同环境间共享5.2 不同微服务配置共享六、Nacos Config 的几个概念总结引言…

codesys com库_CODESYS在线库,酷德网镜像站启用

近期由于国内网络问题&#xff0c;造成 stroe.codesys.com 网站无法访问。在线库无法下载。为了不影响广大CODESYS用户的正常使用&#xff0c;酷德网建立stroe.codesys.com的国内镜像站:主站&#xff1a; https://store.hicodesys.com:8421/CODESYSLibs/备用站&#xff1a; …

分布式事务的解决思路与方案

导航一、事务的种类与场景二、分布式事务解决方案2.1 全局事务2.2 可靠消息事务2.3 最大努力通知2.4 TCC 事务三、TCC 模式常见问题3.1 二阶段幂等3.2 空回滚3.3 资源悬挂一、事务的种类与场景 本地事务实际上就是指数据库的事务&#xff0c;参考《MySQL —— 事务与隔离级别总…

css3 下边框缓缓划过_干货来袭!web前端开发工程师必看之如何使用CSS3实现瀑布流效果?...

首先,我们来看一下什么是瀑布流布局效果,比如电商网站 蘑菇街原理图:在一个大盒子里&#xff0c;放置多个小盒子&#xff0c;小盒子的大小可以不一致&#xff0c;长短不一样&#xff0c;呈现一种瀑布流的效果。使用CSS3S实现只需要如下4步:1. 准备图片素材2. 书写相应HTML结构3…

Spring Cloud Alibaba —— Seata 分布式事务框架

导航一、Seata 介绍二、Seata 的工作原理2.1 三个角色2.2 工作流程三、Seata AT 工作机制3.1 一阶段3.2 二阶段四、案例演示&#xff08;待补充&#xff09;一、Seata 介绍 官网&#xff1a;Seata 官网 Seata 是2019 年阿里巴巴中间件团队发起的开源项目&#xff0c;其前身是…

云麦体脂秤华为体脂秤_华为、小米和有品体脂秤哪个品牌好?三款智能体脂秤横评结果排行...

如今生活水平的提高&#xff0c;也让更多人开始关注健康问题。由于大部分时间都忙于工作&#xff0c;本身就运动少、体重超标等等。如果长期得不到控制的话&#xff0c;会造成日后脂性肝炎、肝纤维化、肝癌&#xff0c;想想都可怕&#xff0c;在意识到这样的严重性&#xff0c;…

idea 调用c#接口_Dubbo 接口测试方法

一.直接通telnet然后用dubbo协议调用方法&#xff08;1&#xff09;在项目的配置文件中可以看到dubbo.protocol.port10022说明dubbo对外暴漏的端口为10022&#xff0c;直接用telnet访问此端口。telnet lcoalhost 10022然后就能看到说明连接成功。用ls查看服务查看服务下有那些方…

MySQL 面试问答

导航一、什么是回表查询&#xff1f;如何避免回表查询&#xff1f;二、为什么MySQL建议使用自增主键&#xff1f;什么是代理主键、业务主键&#xff1f;三、为什么MySQL建议单表不超过2000W数据&#xff1f;四、MySQL自增id用完了怎么办&#xff1f;五、MySQL自增主键是连续的吗…

tcs标准编写软件_【公益培训】知你所需 | 标准编写格式及TCS模板应用线上公益培训...

企业标准编写的水平及TCS工具使用的能力是实施企业标准化工作的基础。TCS标准编写软件是辅助标准编写的工具性软件&#xff0c;方便标准编写人员快捷准确的编写标准草案&#xff0c;有效提升标准供给质量。为贯彻落实疫情防控和助力企业复工复产工作&#xff0c;山东标准化协会…

Linux进阶之路——常用命令总结

一、帮助命令 help man type区分内建、外建命令 【扩展】关于内建命令与外建命令。 内建命令属于shell程序的一部分&#xff0c;包含一些比较简单的Linux命令。这些命令被写在/bin/bash 文件的 builtins 里面&#xff0c;由shell程序识别并在shell程序内部完成运行。通常在Li…

bios设置 联想m8000t_怎么进bios设置硬盘启动顺序

操作说明&#xff1a;1、不同电脑进BIOS按键不一样&#xff0c;常见的有del、F1、F2、Esc、enter、F8、F9等2、在电脑启动时&#xff0c;不停按Del、F2等按键会进入BIOS设置界面&#xff0c;开机按哪个键进BIOS设置BIOS类型一&#xff1a;CMOS Setup Utility1、启动时按Del进入…