微服务之间的通讯安全(六)-Sentinel入门之注解及熔断降级

1、Sentinel注解支持

  在学习熔断降级之前,我们先来看一下Sentinel的注解支持,我们使用spring-cloud-starter-alibaba-sentinel依赖,无需额外配置即可使用@SentinelResource注解定义资源。

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

  value:资源名称,必需项(不能为空);

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

1.1、改造之前的资源定义方式,使用注解定义。

1.2、启动项目,快速访问控制台打印如下,异常类型为FlowException,流控异常。

2、熔断器

前面我们说过,如果依赖的服务不可用,导致服务自身被拖垮,并将不可用逐渐放大的过程叫做服务雪崩。为了防止雪崩效应,必须有一个强大的容错机制。试想一下,如果家里没有熔断器,当电流过载时,电路不断开,可能会引发烧断电路、引发火灾。使用熔断器,电路一旦过载就会跳闸,从而可以保护电路的安全。当电路过载的问题解决后,只须关闭熔断器,电路就可以恢复正常。

同样,如果某个微服务不可用时,再去让新的请求去访问该服务已经没有任何意义,只会无谓消耗资源。所以我们要在需要的地方加上熔断器,熔断器有三种状态,状态转换如下:

a、正常情况下,熔断器关闭,可正常请求依赖的服务。

b、当一段时间内,请求失败率达到一定阈值(例如调用超时或异常比例升高),熔断器就会打开。此时,不会在去请求依赖的服务。

c、熔断器打开一段时间后,会自动进入“半打开”状态。此时,熔断器可允许一个请求访问依赖的服务。如果该请求能够成功调用,则关闭熔断器;否则继续保持打开状态。、

3、Sentinel熔断降级

  Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时,对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

  Sentinel中有以下降级策略:

  平均响应时间 (RuleConstant.DEGRADE_GRADE_RT):当1s内持续进入5个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意Sentinel默认统计的RT上限是4900ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。

  异常比例 (RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

  异常数 (RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT):当资源近1分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

3.1、为createOrder资源添加降级规则,我们使用平均响应时间来作测试

  

3.2、现在如果一秒内有5个请求超时了的话,熔断器就会打开,走blockHandler 方法,异常为DegradeException,间隔十分钟后,在请求会通过,但如果再次出发降级规则,还是会进行同样的处理。

项目源码:https://github.com/caofanqi/study-security/tree/dev-sentinel2

原文地址:https://www.cnblogs.com/caofanqi/p/12299147.html

时间: 2024-07-30 20:34:56

微服务之间的通讯安全(六)-Sentinel入门之注解及熔断降级的相关文章

Spring Cloud微服务安全实战_6-1_微服务之间的通讯安全之概述

到目前为止已经实现了一个基于微服务的,前后端分离(这里我用的jquery做的,并不是真的前后端分离,因为我不会vue和angular所以没用)的架构.在网关上做了限流.认证.审计.授权等安全机制,在前端应用上也做了SSO单点登录, 现在的架构存在的问题是: 1,在网关做限流. 在网关上做限流是有问题的,比如订单服务限流是100,库存服务限流也是100,订单服务又调了库存服务.如果网关上给订单转了100个请求,给库存转了100个请求,订单又调了库存,这时候库存就同时接到了200个请求,库存服务就可

微服务之间的通讯安全(四)-JWT优化之日志、错误处理、限流及JWT改造后执行流程梳理

前面我们已经完成了通过JWT的认证和授权的改造,可以看到我们的代码中没有认证和授权的过滤器(Filter)了,基本上由SpringSecurity的过滤器来接管了,接下来我们来看一下怎么在SpringSecurity的过滤器链上加上我们自己的逻辑,比如日志和限流. 1.在SpringSecurity过滤器链上添加审计过滤器 1.1.创建日志过滤器,因为我们根据我们之前审计机制的位置,要把日志过滤器放到认证之后,授权之前.认证的过滤器会把JWT令牌转化为Authentication,然后放到安全上

JHipster技术栈定制 - 基于UAA的微服务之间安全调用

本文通过代码实例演示如何通过UAA实现微服务之间的安全调用. uaa: 身份认证服务,同时也作为被调用的资源服务.服务端口9999. microservice1: 调用uaa的消费者服务,服务端口8081. 1 准备工作 1.1 工程目录 --| appstack |-- uaa |-- microservice1 1.2 启动相关组件 为了简单起见,这里都使用容器启动相关组件,需要2个镜像,最好提前下载好. jhipster/jhipster-registry:v4.0.0 mysql:5 a

2.解决服务之间的通讯

作者 微信:tangy8080 电子邮箱:[email protected] 更新时间:2019-06-28 14:25:40 星期五 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程中的编写的文章 如您在阅读过程中发现文章错误,可添加我的微信 tangy8080 进行反馈.感谢您的支持. 文章主题 介绍多个服务之间进行通讯 前置条件 [无] 正文 服务之间应该尽量较少调用.以减少耦合度,如果彼此调用链过于频繁.可能会引起整个调用链的异常. https://docs.micro

Spring Cloud Stream 进行服务之间的通讯

Spring Cloud Stream Srping cloud Bus的底层实现就是Spring Cloud Stream,Spring Cloud Stream的目的是用于构建基于消息驱动(或事件驱动)的微服务架构.Spring Cloud Stream本身对Spring Messaging.Spring Integration.Spring Boot Actuator.Spring Boot Externalized Configuration等模块进行封装(整合)和扩展,下面我们实现两个

spring cloud实战与思考(三) 微服务之间通过fiegn上传一组文件(下)

需求场景: 用户调用微服务1的接口上传一组图片和对应的描述信息.微服务1处理后,再将这组图片上传给微服务2进行处理.各个微服务能区分开不同的图片进行不同处理. 上一篇博客已经讨论了在微服务之间传递一组图片和对应参数的解决方案.现在来看看如何对组内文件进行区分.当前项目中使用了"commons-fileupload"和"feign-form"两个库进行文件传输. "commons-fileupload"库可以将http request转换成&quo

Spring Cloud下使用Feign Form实现微服务之间的文件上传

背景 ? Spring Cloud现在已经被越来越多的公司采用了,微服务架构比传统意义上的单服务架构从复杂度上多了很多,出现了很多复杂的场景.比如,我们的产品是个app,支持第三方登录功能,在手机端调用第三方授权接口之后,返回了用户的相关信息,比如open_id,性别,头像等.这些信息我们需要保存在我们服务器上,当时针对头像是应该保存图片的url还是图片本身发生了歧义,在一番讨论之后,得出的结果是,我们需要通过url将图片下载到我们本地,然后调用我们自己的文件微服务中上传功能保存起来. 工具 I

用Token令牌维护微服务之间的通信安全的实现

原文:用Token令牌维护微服务之间的通信安全的实现 在微服务架构中,如果忽略服务的安全性,任由接口暴露在网络中,一旦遭受攻击后果是不可想象的. 保护微服务键安全的常见方案有:1.JWT令牌(token) 2.双向SSL 3.OAuth 2.0 等 本文主要介绍使用Token的实现方式 源码地址:https://github.com/Mike-Zrw/TokenApiAuth 基本流程: 上图中有两个服务,服务A和服务B,我们模拟的是服务A来调用服务B的过程,也可以反过来让服务B来调用服务A.

spring cloud实战与思考(二) 微服务之间通过fiegn上传多个文件1

需求场景: 微服务之间调用接口一次性上传多个文件. 上传文件的同时附带其他参数. 多个文件能有效的区分开,以便进行不同处理. Spring cloud的微服务之间接口调用使用Feign.原装的Feign不支持文件的传输.需要借助"Feign-form"库才行.但是貌似"Feign-form"库(至少是3.0.3版本)只支持单文件上传.在接口中使用多文件参数时会报异常: feign.codec.EncodeException: class [Lorg.springfr