gateway sentinel 熔断 不起作用_Sentinel实现熔断与限流 - 魔笔钨丝浣
学习地址:https://www.bilibili.com/video/BV18E411x7eT?p=111
Sentinel
官网地址:
中文文档:/wiki/介绍
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
解决服务使用中的各种问题:服务雪崩、服务降级、服务熔断、服务限流。
主要特性
相关配置:
安装
下载地址:/releases
演示版本:
前提:java8
8080端口不能被占用
Sentinel分为两个部分:
核心库(Java客户端)不依赖任何框架/库,能够运行于所有Java运行时环境,同时对Dubbo / Spring Cloud等框架也有较好的支持。
控制台(Dashboard) 基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。
运行
java -jar .jarhttp://localhost:8080
登录账号密码均为sentinel
初始化演示工程
启动Nacos8848成功
http://localhost:8848/nacos/#/login
cloudalibaba-sentinel-service8401
建module
写POM
<?xml version="" encoding="UTF-8"?>
<project xmlns=""xmlns:xsi=""xsi:schemaLocation=" http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud2020</artifactId><groupId>com.nuc.springcloud</groupId><version>-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-sentinel-service8401</artifactId><dependencies><dependency><groupId>com.nuc.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${}</version></dependency><dependency><groupId>com.nuc.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${}</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.6.3</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
- 写YML
server:port: 8401spring:application:name: cloudalibaba-sentinel-servicecloud:nacos:discovery:#Nacos服务注册中心server-addr: localhost:8848sentinel:transport:#配置Sentinel dashboard 地址dashboard: localhost:8080port: 8719 #默认8719,假如被占用了会自动从8719开始依次+1扫描。直至找到未被占用的端口management:endpoints:web:exposure:include: '*'
- 主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class MainApp8401 {public static void main(String[] args) {();}
}
- 业务类
@RestController
@Slf4j
public class FlowLimitController {@GetMapping("/testA")public String testA() {return "------testA";}@GetMapping("/testB")public String testB() {return "------testB";}
}
- 测试
启动8401微服务后查看sentienl控制台
Sentinel采用的懒加载:执行一次访问即可
流控规则
资源名:唯一名称,默认请求路径
针对来源:Sentine可以针对调用者进行限流,填写微服务名,默认default (不区分来源)
阈值类型/单机阈值:
QPS (每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流
线程数:当调用该api的线程数达到阈值的时候,进行限流
是否集群:不需要集群
流控模式:
直接:api达到限流条件时,直接限流
关联:当关联的资源达到阈值时,就限流自己
链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)[api级别的针对来源]
流控效果:
快速失败:直接失败,抛异常
Warm Up:根据codeFactor (冷加载因子,默认3)的值,从阈值 / codeFactor,经过预热时长,才达到设置的QPS阈值
排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,则无效
流控模式
直接(默认)--> 快速失败
表示一秒内查询1次就OK,若超过次数1,就直接--快速失败,报默认错误
思考:需要一个类似fallback的兜底方法
关联
当关联的资源达到阈值时,就限流自己
当与A关联的资源B达到阈值后,就限流自己
B惹事,A挂了
当关联资源/testB的qps阈值超过1时,就限流/testA的Rest访问地址,当关联资源到阈值后限制配置好的资源名
手动测试
postman测试线程数访问
访问testB成功
postman里新建多线程集合组
将访问地址添加进新线程组
20个线程每次间隔秒访问一次
大批量线程高并发访问B,导致A失效了
链路
多个请求调用了同一个微服务
NodeSelectorSlot
中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。这棵树的根节点是一个名字为 machine-root
的虚拟节点,调用链的入口都是这个虚节点的子节点。
上图中来自入口 Entrance1
和 Entrance2
的请求都调用到了资源 NodeA
,Sentinel 允许只根据某个入口的统计信息对资源限流。比如我们可以设置 strategy
为 ,同时设置 refResource
为 Entrance1
来表示只有从入口 Entrance1
的调用才会记录到 NodeA
的限流统计当中,而不关心经 Entrance2
到来的调用。
流控效果
直接->快速失败(默认的流控处理)
直接失败,抛出异常Blocked by Sentinel (flow limiting)
预热
官网地址:/wiki/限流---冷启动
公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值
案例:阈值为10 + 预热时长设置5秒
系统初始化的阈值为10 / 3 约等于3,即阈值刚开始为3;然后过了5秒后阈值才慢慢恢复到10
测试:
多次点击http://localhost:8401/testB
刚开始不行,后续慢慢OK
应用:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值
排队等待
匀速排队()方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。
该方式的作用如下图所示:
这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
注意:匀速排队模式暂时不支持 QPS > 1000 的场景。
设置含义:/testA每秒一次请求,超过的话就排队,等待的超时时间为20000毫秒
降级规则
官网地址:/wiki/熔断降级
模式
- RT (平均响应时间,秒级)
平均响应时间超出阈值且在时间窗口内通过的请求>=5,两个条件同时满足后触发降级
窗口期过后关闭断路器
RT最大4900 (更大的需要通过才能生效)
- 异常比列(秒级)
- QPS>= 5且异常比例(秒级统计)超过阈值时,触发降级;时间窗门结束后,关闭降级
- 异常数(分钟级)
- 异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级
Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高), 对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。
当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出DegradeException)。
Sentinel的断路器是没有半开状态的
半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。具体可以参考Hystrix。
慢调用比例
慢调用比例(SLOW_REQUEST_RATIO
):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
@GetMapping("/testD")
public String testD() {try {(1);} catch (InterruptedException e) {();}("testD 测试RT");return "------testD";
}
配置线程组
配置HTTP请求
jmeter测试
恢复
按照上述配置,永远一秒钟打进来10个线程(大于5个了)调用testD,我们希望200毫秒处理完本次任务,如果超过200毫秒还没处理完,在未来1秒钟的时间窗口内,断路器打开(保险丝跳闸)微服务不可用。
后续停止jmeter,没有这么大的访问最了,断路器关闭(保险丝恢复),微服务恢复OK
异常比例
异常比例 (ERROR_RATIO
):当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, ]
,代表 0% - 100%。
@GetMapping("/testD")
public String testD() {("testD 异常比例");int age = 10/0;return "------testD";
}
使用Jmeter
单独访问一次
单独访问一次,必然来一次报错一 次(int age = 10/0), 调一次错一次;
开启jmeter后,直接高并发发送请求,多次调用达到我们的配置条件了。断路器开启(保险丝跳闸),微服务不可用了,不再报错error而是服务降级了。
异常数
异常数 (ERROR_COUNT
):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
@GetMapping("/testD")
public String testD() {("testD 异常数");int age = 10 / 0;return "------testD 测试异常数";
}
访问5次
第6次进入熔断降级
第一次访问绝对报错,因为除数不能为零到error窗口,但是到达5次后,进入熔断降级
热点key限流
官网地址:/wiki/热点参数限流
兜底方法
分为系统默认和客户自定义两种,之前的case,限流出问题后,都是用sentinel系统默认的提示: Blocked by Sentinel (flow limiting)
从HystrixCommand到@SentinelResource
@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey", blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1", required = false) String p1,@RequestParam(value = "p2", required = false) String p2) {//int age = 10/0;return "------testHotKey";
}//兜底方法
public String deal_testHotKey(String p1, String p2, BlockException exception) {return "------deal_testHotKey,o(╥﹏╥)o";
}
http://localhost:8401/testHotKey?p1=abchttp://localhost:8401/testHotKey?p1=abc&p2=33http://localhost:8401/testHotKey?p2=abc
包含参数索引0的p1,当QPS超过1秒1次点击后马上被限流
特例设置
我们期望p1参数当它是某个特殊值时,它的限流值和平时不一样
假如当p1的值等于5时,它的阈值可以达到200
热点参数的注意点,参数必须是基本类型或者String
异常
@Sent inelResource
处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理;
RuntimeException
int age = 10/0, 这个是java运行时报出的运行时异常RunTimeException,@SentinelResource不管
总结
@SentinelResource主管配置出错,运行出错该走异常走异常
解决:稍后
系统自适应限流
官方地址:/wiki/系统自适应限流
系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。
系统规则支持以下的模式:
- Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的
maxQps * minRt
估算得出。设定参考值一般是CPU cores *
。 - CPU usage( 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-),比较灵敏。
- 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
@SentinelResource
按资源名称限流+后续处理
业务类
@RestController
public class RateLimitController {@GetMapping("/byResource")@SentinelResource(value = "byResource", blockHandler = "handleException")public CommonResult byResource() {return new CommonResult(200, "按资源名称限流测试OK", new Payment(2020L, "serial001"));}public CommonResult handleException(BlockException exception) {return new CommonResult(444, ().getCanonicalName() + "\t 服务不可用");}
}
配置流控规则
1秒钟点击1下,OK
疯狂点击,返回了自己定义的限流处理信息,限流发送
此时关闭微服务8401看看
Sentinel控制台,流控规则消失了?????临时 --> 下文持久化解决
按照Url地址限流+后续处理
通过访问的URL来限流,会返回Sentinel自带默认的限流处理信息
业务类
@GetMapping("/rateLimit/byUrl")
@SentinelResource(value = "byUrl")
public CommonResult byUrl() {return new CommonResult(200, "按url限流测试OK", new Payment(2020L, "serial002"));
}
配置流控规则
一次
系统默认的,没有体现我们自己的业务要求。
依照现有条件,我们自定义的处理方法又和业务代码耦合在一块,不直观。
每个业务方法都添加一个兜底的,那代码膨胀加剧。
全局统一的处理方法没有体现。
客户自定义限流处理逻辑
创建customerBlockHandler类用于自定义限流处理逻辑
业务层
public class CustomerBlockHandler {public static CommonResult handlerException(BlockException exception) {return new CommonResult(4444, "按客戶自定义,global handlerException----1");}public static CommonResult handlerException2(BlockException exception) {return new CommonResult(4444, "按客戶自定义,global handlerException----2");}
}
@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "handlerException2")
public CommonResult customerBlockHandler()
{return new CommonResult(200,"按客戶自定义",new Payment(2020L,"serial003"));
}
Sentinel主要有三个核心API
SphU定义资源
Tracer定义统计
ContextUtil定义了上下文
服务熔断功能
sentinel整合ribbon+openFeign+fallback
cloudalibaba-provider-payment9003/9004
建module
写POM
<?xml version="" encoding="UTF-8"?>
<project xmlns=""xmlns:xsi=""xsi:schemaLocation=" http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud2020</artifactId><groupId>com.nuc.springcloud</groupId><version>-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-provider-payment9003</artifactId><dependencies><!--SpringCloud ailibaba nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><groupId>com.nuc.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${}</version></dependency><!-- SpringBoot整合Web组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--日常通用jar包配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
- 写YML
server:port: 9003spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: localhost:8848 #配置Nacos地址management:endpoints:web:exposure:include: '*'
- 主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9003 {public static void main(String[] args) {();}
}
- 业务类
@RestController
public class PaymentController {@Value("${}")private String serverPort;public static HashMap<Long, Payment> hashMap = new HashMap<>();static {(1L, new Payment(1L, "28a8c1e3bc2742d8848569891fb42181"));(2L, new Payment(2L, "bba8c1e3bc2742d8848569891ac32182"));(3L, new Payment(3L, "6ua8c1e3bc2742d8848569891xt92183"));}@GetMapping(value = "/paymentSQL/{id}")public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id) {Payment payment = (id);CommonResult<Payment> result = new CommonResult(200, "from mysql,serverPort: " + serverPort, payment);return result;}}
- 测试
类似的新建9004,注意修改port
cloudalibaba-consumer-nacos-order84
建module
写POM
<?xml version="" encoding="UTF-8"?>
<project xmlns=""xmlns:xsi=""xsi:schemaLocation=" http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud2020</artifactId><groupId>com.nuc.springcloud</groupId><version>-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-consumer-nacos-order84</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.nuc.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
- 写YML
server:port: 84spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848sentinel:transport:dashboard: localhost:8080port: 8719service-url:nacos-user-service: http://nacos-payment-provider
- 主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain84 {public static void main(String[] args) {();}
}
- 业务类
@Configuration
public class ApplicationContextConfig {@Bean@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}
@RestController
@Slf4j
public class CircleBreakerController {public static final String SERVICE_URL = "http://nacos-payment-provider";@Resourceprivate RestTemplate restTemplate;@RequestMapping("/consumer/fallback/{id}")//@SentinelResource(value = "fallback") //没有配置//@SentinelResource(value = "fallback",fallback = "handlerFallback") //fallback只负责业务异常//@SentinelResource(value = "fallback",blockHandler = "blockHandler") //blockHandler只负责sentinel控制台配置违规@SentinelResource(value = "fallback", fallback = "handlerFallback", blockHandler = "blockHandler",exceptionsToIgnore = {})public CommonResult<Payment> fallback(@PathVariable Long id) {CommonResult<Payment> result = (SERVICE_URL + "/paymentSQL/" + id, CommonResult.class, id);if (id == 4) {throw new IllegalArgumentException("IllegalArgumentException,非法参数异常....");} else if (() == null) {throw new NullPointerException("NullPointerException,该ID没有对应记录,空指针异常");}return result;}//fallbackpublic CommonResult handlerFallback(@PathVariable Long id, Throwable e) {Payment payment = new Payment(id, "null");return new CommonResult<>(444, "兜底异常handlerFallback,exception内容 " + (), payment);}//blockHandlerpublic CommonResult blockHandler(@PathVariable Long id, BlockException blockException) {Payment payment = new Payment(id, "null");return new CommonResult<>(445, "blockHandler-sentinel限流,无此流水: blockException " + (), payment);}}
Ribbon系列
controller
fallback管运行异常
blockHandler管配置违规
无任何配置
@RequestMapping("/consumer/fallback/{id}")
@SentinelResource(value = "fallback")
public CommonResult<Payment> fallback(@PathVariable Long id){}
只配置fallback
@RequestMapping("/consumer/fallback/{id}")
@SentinelResource(value = "fallback",fallback = "handlerFallback") //fallback只负责业务异常
public CommonResult<Payment> fallback(@PathVariable Long id) {}//fallback
public CommonResult handlerFallback(@PathVariable Long id, Throwable e) {Payment payment = new Payment(id, "null");return new CommonResult<>(444, "兜底异常handlerFallback,exception内容 " + (), payment);
}
只配置blockHandler
@RequestMapping("/consumer/fallback/{id}")
@SentinelResource(value = "fallback",blockHandler = "blockHandler") //blockHandler只负责sentinel控制台配置违规
public CommonResult<Payment> fallback(@PathVariable Long id) {}//blockHandler
public CommonResult blockHandler(@PathVariable Long id, BlockException blockException) {Payment payment = new Payment(id, "null");return new CommonResult<>(445, "blockHandler-sentinel限流,无此流水: blockException " + (), payment);
}
第一次
fallback和blockHandler都配置
@RequestMapping("/consumer/fallback/{id}")
@SentinelResource(value = "fallback", fallback = "handlerFallback", blockHandler = "blockHandler")
public CommonResult<Payment> fallback(@PathVariable Long id){}//fallback
public CommonResult handlerFallback(@PathVariable Long id, Throwable e) {Payment payment = new Payment(id, "null");return new CommonResult<>(444, "兜底异常handlerFallback,exception内容 " + (), payment);
}//blockHandler
public CommonResult blockHandler(@PathVariable Long id, BlockException blockException) {Payment payment = new Payment(id, "null");return new CommonResult<>(445, "blockHandler-sentinel限流,无此流水: blockException " + (), payment);
}
若blockHandler和fallback 都进行了配置,则被限流降级而抛出BlockException时只会进入blockHandler处理逻辑。
忽略属性
@RequestMapping("/consumer/fallback/{id}")
@SentinelResource(value = "fallback", fallback = "handlerFallback", blockHandler = "blockHandler",exceptionsToIgnore = {})
public CommonResult<Payment> fallback(@PathVariable Long id) {}
Feign系列
84
POM
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
改YML
#对Feign的支持
feign:sentinel:enabled: true
业务类
@FeignClient(value = "nacos-payment-provider", fallback = )
public interface PaymentService {@GetMapping(value = "/paymentSQL/{id}")public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id);
}
@Component
public class PaymentFallbackService implements PaymentService {@Overridepublic CommonResult<Payment> paymentSQL(Long id) {return new CommonResult<>(44444, "服务降级返回,---PaymentFallbackService", new Payment(id, "errorSerial"));}
}
public class CircleBreakerController {// OpenFeign@Resourceprivate PaymentService paymentService;@GetMapping(value = "/consumer/paymentSQL/{id}")public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id) {return paymentService.paymentSQL(id);}
}
主启动类
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class OrderNacosMain84{}
测试
关闭9003/9004,自动降级
熔断框架比较
Sentinel | Hystrix | resilience4j | |
---|---|---|---|
隔离策略 | 信号量隔离(并发线程数限流) | 线程池隔离/信号量隔离 | 信号量隔离 |
信号量隔离 | 基于响应时间、异常比率、异常数 | 基于异常比率 | 基于异常比率、响应时间 |
实时统计实现 | 滑动窗口(LeapArray) | 滑动窗口(基于RxJava) | Ring Bit Buffer |
动态规则配置 | 支持多种数据源 | 支持多种数据源 | 有限支持 |
动态规则配置 | 支持多种数据源 | 支持多种数据源 | 有限支持 |
扩展性 | 多个扩展点. | 插件的形式 | 接口的形式. |
基于注解的支持 | 支持 | 支持 | 支持 |
限流 | 基于QPS.支持基于调用关系的限流 | 有限的支持 | Rate Limiter |
流量整形 | 支持预热模式、匀速器模式、预热排队模式 | 不支持 | 简单的Rate Limiter模式 |
系统自适应保护 | 支持 | 不支持 | 不支持 |
控制台 | 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 | 简单的监控查看 | 不提供控制台,可对接其它监控系统 |
规则持久化
一旦我们重启应用,Sentinel规则将消失,生产环境需要将配置规则进行持久化
将限流配置规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上Sentinel上的流控规则持续有效。
8401
POM
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
YML
server:port: 8401spring:application:name: cloudalibaba-sentinel-servicecloud:nacos:discovery:#Nacos服务注册中心server-addr: localhost:8848sentinel:transport:#配置Sentinel dashboard 地址dashboard: localhost:8080port: 8719 #默认8719,假如被占用了会自动从8719开始依次+1扫描。直至找到未被占用的端口datasource:ds1:nacos:server-addr: localhost:8848dataId: cloudalibaba-sentinel-servicegroupId: DEFAULT_GROUPdata-type: jsonrule-type: flowmanagement:endpoints:web:exposure:include: '*'feign:sentinel:enabled: true # 激活Sentinel对Feign的支持
[{"resource": "/rateLimit/byUrl","limitApp": "default","grade": 1,"count": 1,"strategy": 0,"controlBehavior": 0,"clusterMode": false }
]
测试
http://localhost:8401/rateLimit/byUrl
重启8401,依旧生效,持久化成功。
gateway sentinel 熔断 不起作用_Sentinel实现熔断与限流 - 魔笔钨丝浣相关推荐
- gateway sentinel 熔断 不起作用_Sentinel 的一些概念与核心类介绍
了解 Sentinel 的一些概念 资源:资源是 Sentinel 的关键概念.资源,可以是一个方法.一段代码.由应用提供的接口,或者由应用调用其它应用的接口. 规则:围绕资源的实时状态设定的规则,包 ...
- gateway sentinel 熔断 不起作用_Sentinel 1.8.0 年度版本发布,熔断降级重构升级
简介:在经过数月的打磨后,Sentinel 1.8.0 版本正式发布!该版本是本年度最重要的版本之一,包含大量特性改进与 bug 修复,尤其是针对熔断降级特性的完善升级(支持任意统计时长.慢调用比例降 ...
- Sentinel服务熔断Ribbon环境预说_客户自定义限流处理_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0048
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们看服务熔断功能 然后这里我们要说上面的内容 首先我们准备环境,服务提供者是,9003,90 ...
- Sentinel热点Key降级上_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0042
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们再看看这里的这个热点规则的配置 可以看看sentinel上,这个热点规则配置的页面 这个热 ...
- Sentinel降级_异常数_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0041
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们再说最后一个通过异常数来降级 异常数是说,当资源近1分钟的异常数目超过阈值,以后进行熔断, ...
- Sentinel一键下载安装运行_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0030
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们去看看怎么安装这个sentinel 可以看到这个网址可以下载去官网下载 2019年12月9 ...
- Sentinel热点Key降级下_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0043
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 先复习一下 可以看到我们配置的是testHotKey,这个资源名,就是 @SentinelReso ...
- Sentinel降级_异常比例_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0040
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们再看异常比例 这里就是说,当QPS,每秒请求数要大于5,并且每秒异常的总数占通过量的,比率 ...
- 1命名规则 sentinel_SpringCloud Gateway高阶之Sentinel限流、熔断
享学特邀作者:老顾 头条号id:老顾聊技术 前言 为什么需要服务熔断和降级?微服务是当前业界的一大趋势,原理就是将单一职责的功能模块独立化为子服务,降低服务间的耦合,服务间互相调用.但是这样也会出现一 ...
最新文章
- 另一个git进程似乎在这个存储库中运行
- QT导入libcurl
- NeurIPS 2020 | 没有乘法的神经网络,照样起飞?
- 2021双十一电商行业研究报告:重塑消费决策链条,内容种草成电商新标配
- [高性能javascript笔记]1-加载和执行
- 【SQL】利用HAVING取众数和中位数
- QT编译项目错误:转换到coff期间失败文件无效或损坏
- 浏览器无法下载PDF文件怎么办
- 移动机器人路径规划方法概览
- c语言编程的头文件是什么,C语言头文件到底是什么?
- 20171205_Matlab求方差,均值,均方差,协方差的函数
- 浩辰ICAD电气软件IDq2003i.rar
- Mixly-数位计及1602屏亮度显示
- Acute Angle Cloud与Achain达成战略合作,共促区块链系统发展
- [复现论文程序图]High Speed Continuous Variable Source-Independent Quantum Random Number Generation...
- 产品经理实践【四川省地震需求分析】
- 设计模式-大话设计模式学习笔记
- Python collections模块之Counter()详解
- kibana异常 License information from the X-Pack plugin could not be obtained from Elasticsearch
- git master、origin master 与 origin/master 的区别