Sentinel SphU API
介绍
Sentinel 是阿里巴巴开源的一款轻量级流量控制组件,主要用于保护应用系统的稳定性。SphU
是 Sentinel 提供的一个核心 API,用于定义资源点并进行流量控制。通过 SphU
,开发者可以轻松地在代码中标记需要保护的资源,并为其配置相应的流量控制规则。
SphU
是 Sentinel Protection Hotspot Util
的缩写,它提供了一种简单的方式来定义资源点,并通过 Sentinel 的规则引擎对这些资源进行保护。
基本用法
定义资源点
在 Sentinel 中,资源点是流量控制的基本单位。通过 SphU.entry()
方法,我们可以定义一个资源点,并在其周围包裹需要保护的代码逻辑。
try (Entry entry = SphU.entry("resourceName")) {
// 被保护的业务逻辑
doSomething();
} catch (BlockException e) {
// 处理被限流或降级的逻辑
handleBlockException(e);
}
在上面的代码中,resourceName
是资源的名称,SphU.entry()
方法会尝试进入该资源点。如果资源点被限流或降级,SphU.entry()
会抛出 BlockException
异常,开发者可以在 catch
块中处理这些异常。
配置规则
在定义资源点后,我们可以通过 Sentinel 的规则管理 API 来配置流量控制规则。例如,我们可以为 resourceName
配置一个 QPS(每秒查询率)限流规则:
FlowRule rule = new FlowRule();
rule.setResource("resourceName");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(10); // 每秒最多允许 10 个请求
FlowRuleManager.loadRules(Collections.singletonList(rule));
在这个例子中,我们为 resourceName
配置了一个 QPS 限流规则,限制每秒最多允许 10 个请求。如果请求超过这个限制,Sentinel 会触发限流逻辑。
实际应用场景
场景 1:保护关键业务逻辑
假设我们有一个电商系统,其中有一个关键的业务逻辑是下单操作。为了保护这个操作不被过多的请求压垮,我们可以使用 SphU
来定义资源点并进行限流。
public void placeOrder(Order order) {
try (Entry entry = SphU.entry("placeOrder")) {
// 下单逻辑
orderService.processOrder(order);
} catch (BlockException e) {
// 处理限流逻辑
throw new ServiceException("系统繁忙,请稍后再试");
}
}
在这个例子中,我们为 placeOrder
资源点配置了一个限流规则,确保下单操作不会因为过多的请求而崩溃。
场景 2:保护外部服务调用
在微服务架构中,服务之间的调用非常频繁。为了保护外部服务不被过多的请求压垮,我们可以使用 SphU
来保护这些调用。
public String callExternalService(String url) {
try (Entry entry = SphU.entry("externalService")) {
// 调用外部服务
return httpClient.get(url);
} catch (BlockException e) {
// 处理限流逻辑
return "服务不可用,请稍后再试";
}
}
在这个例子中,我们为 externalService
资源点配置了一个限流规则,确保外部服务的调用不会因为过多的请求而失败。
总结
SphU
是 Sentinel 提供的一个核心 API,用于定义资源点并进行流量控制。通过 SphU
,开发者可以轻松地在代码中标记需要保护的资源,并为其配置相应的流量控制规则。在实际应用中,SphU
可以用于保护关键业务逻辑、外部服务调用等场景,确保系统的稳定性。
附加资源
练习
- 尝试在你的项目中引入 Sentinel,并使用
SphU
定义一个资源点。 - 为定义的资源点配置一个 QPS 限流规则,并测试其效果。
- 思考在你的项目中还有哪些场景可以使用
SphU
进行流量控制。