限流
目的:限制系统处理请求的速率,确保系统不会因为过载而崩溃。
实现:通过对单位时间内允许通过的请求数量进行限制,比如使用令牌桶或漏桶算法。当请求超过设定的阈值时,超出的请求会被拒绝、排队或返回错误信息。
应用场景:一般是被调用方对调用方进行限流。举个例子,我提供了一个查询用户信息的服务,给集团内外的很多个调用方使用,但是我为了保证我的可用性,我会对每个调用方做限流,防止某个调用方不守规矩,把我的服务打挂了。
降级
目的:在资源紧张或关键服务不稳定时,暂时降低系统的服务质量或功能,以保证核心服务的正常运行。
实现:可能包括关闭非核心功能、使用简化逻辑处理请求、返回缓存数据而非实时数据等。
应用场景:举个例子,双十一大促期间,淘宝上面会把退款功能关闭,这就是一种降级手段,通过把一些非核心功能降级掉来保证核心功能可用。或者在某次腾讯视频挂了的时候,用户名称默认显示腾讯用户,这也是一种降级方式,用兜底名称做展示.
熔断
目的:防止系统中某个服务的故障导致连锁反应,影响整个系统稳定,类似于电路中的保险丝。
实现:通过监控服务间的调用成功率和响应时间,当检测到一个服务调用失败率过高或响应过慢时,触发熔断状态,之后对该服务的调用不再真正执行,而是直接返回错误或默认结果,直到服务恢复健康后再尝试重新建立连接。
应用场景:适用于微服务架构中,当依赖的服务出现问题时,能够快速响应并隔离故障,防止故障扩散。一般发生在调用方,举个例子,当电商平台上用户支付时,收银台发现某个支付渠道,如微信支付失败率突增,超时严重,那么就可以临时把这个支付方式熔断掉。
基于sentile做服务的熔断
@SentinelResource(value = "myServiceMethod",
blockHandler = "handleMyServiceBlock")
public String myServiceMethod() {
// 业务逻辑
}
public String handleMyServiceBlock(BlockException ex) {
// 降级逻辑,例如返回默认值或错误信息
return "Service is busy, please try again later!";
}
基于sentile做服务的降级
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
public class MyService {
@SentinelResource(
value = "myServiceMethod",
blockHandler = "handleMyServiceBlock"
)
public String myServiceMethod() {
// 业务逻辑
return "Hello from myServiceMethod";
}
public String handleMyServiceBlock(BlockException ex) {
// 降级逻辑
return "Service is busy, please try again later!";
}
}
基于sentile做服务的限流
@SentinelResource(value = "myServiceMethod", blockHandler = "handleFlowException")
public String myServiceMethod() {
// 业务逻辑
return "Hello from myServiceMethod";
}
public String handleFlowException(BlockException ex) {
// 限流后的处理逻辑,比如返回友好提示
return "Too many requests, please try again later!";
}
以上只是简单的示例, 具体的要根据实际业务场景设计, 记得要有兜底!!