何为熔断?
服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,
暂时停止对该服务的调用。
服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现
负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback
(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。
SpringCloud中提供Hystirx服务熔断组件 SpringCloudAlibaba当中则采用Sentinel给服务加上限流熔断功能,防止异常情况拖垮应用服务。熔断配置
Sentinel中的熔断降级有3个级别
- RT(平均响应时间)当资源的平均响应时间超过阈值之后,资源进入淮降级状态。接下来如果持续进入5个请求,它们的RT都持续超过这个阈值,那么接下来的时间窗口之内,对这个方法的调用会自动抛出DegradeException 异常。再下一个时间窗口到来时,会接着再放5个请求。
- 异常比例 当资源的每秒异常占总数的通过两比值超过阈值之后,资源进行降级状态,即在接下来的时间窗口之内,对这个方法的调用都会自动地抛出DegradeException异常。
- 异常数 当资源1分钟的异常数目超过阈值之后会进行熔断。
1.需要使用的server模块添加依赖
<!--Sentinel-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置sentinel的服务端地址依赖
spring:
application:
name: server-provider
cloud:
nacos:
discovery:
server-addr: 192.168.174.135:8848
sentinel:
transport:
#sentinel服务端地址
dashboard: 192.168.174.135:8849
#取消延迟加载
eager: true
在server-provider使用Sentinel进行测试
@RestController
public class ConsumerController {
@GetMapping("/hello")
@SentinelResource(value = "getByCode")
public String hello() {
return "hello World";
}
}
打开sentinel界面查看
sentinel可以查看到已经把服务注册到sentinel控制台当中去了,右边进行手动可以设置该接口的阈值,包括降级等。
流控
可以设置参数为2 然后快速请求接口 然后进行测试 查看效果
阈值测试
对于返回的注解我们可以采用自定义返回信息
@SentinelResource(value = "hello",blockHandler = "handlerException")
@GetMapping("/hello")
@SentinelResource(value = "hello", blockHandler = "handleException")
public String hello() {
return "hello World";
}
//自定义异常的返返回值和参数要跟目标方法一样
public String handleException(BlockException exception) {
return "达到阈值了,不要再访问了!";
}
自定义返回参数
持久化
因为sentinel的注册信息都存放在内存当中,所以重启之后会丢失数据。可以使用nacos中心持久化数据
1. 引入配置pom依赖
<!--引入nacos配置文件-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2. 编写配置文件
spring:
application:
name: server-provider
cloud:
nacos:
discovery:
server-addr: 192.168.174.135:8848
sentinel:
transport:
#sentinel服务端地址
dashboard: 192.168.174.135:8849
eager: true
datasource:
ds:
nacos:
server-addr: 192.168.174.135:8848 #nacos的地址
data-id: ${spring.application.name}-sentinel#nacos的data-id
group-id: DEFAULT_GROUP#分组名称
rule-type: flow
3. 在nacos中建立配置文件
nacos配置中心
nacos新增配置
配置熔断详情配置
resources:资源名称
limitapp:流控针对的调用来源 default不区分
grade:限流阈值的类型 0表示根据并发数量 1表示根据QPS来进行流量控制
count: 限流阈值
strategy:调用关系限流策略
controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
clusterMode:是否为集群模式
网友评论