学习笔记—微服务—技术栈实践(5)—网关+Nacos+Sentinel的动态服务容错

服务容错

服务容错概述

  服务容错是确保系统在出现故障或异常时仍然能够继续提供服务的能力。它包括对服务的各种保护措施,以提高系统的可靠性和稳定性。通过合理的容错设计,可以避免系统崩溃或性能下降,从而提高用户体验和系统的健壮性。

服务容错手段

限流

  限流是控制系统负载的一种方法,通过限制请求的数量或频率来保护系统免受过高负载的影响。常见的限流策略包括令牌桶算法和漏桶算法,这些策略可以帮助防止系统因过多请求而过载。

熔断

  熔断是对系统服务调用失败的响应机制。它通过检测到服务失败的情况,自动中断对该服务的请求,从而避免因某个服务的问题影响到系统的其他部分。熔断器会根据预设的规则决定何时进行熔断和恢复操作。

降级

  降级是指当系统负载过高或出现故障时,系统会自动提供一个简化或有限的服务版本。降级可以有效地保护系统,防止全局故障,从而保持系统的基本功能。

Sentinel

Sentinel简介

  Sentinel 是一个流量控制和熔断降级的开源组件,由阿里巴巴开发。它主要用于服务的容错保护,通过监控系统的流量、响应时间等指标,来实现服务的保护和自动恢复。

  之所以选用sentinel,是因为之前常用的熔断器早就已经停止维护了。

Sentinel特性

  Sentinel 具备以下主要特性:

    1. 流量控制:提供流量控制的功能,包括限流和熔断。

    2. 熔断降级:支持熔断和降级策略来处理系统故障。

    3. 系统监控:提供实时的监控功能,帮助了解系统运行状态。

    4. 高可用性:支持集群部署和高可用性配置。

Sentinel核心概念

  Sentinel 的核心概念包括:

    1. 资源:Sentinel 监控和控制的核心单位,通常是一个服务或功能模块。

    2. 规则:定义了流量控制、熔断和降级的策略。

    3. 降级:根据设定的规则对系统进行降级处理。

    4. 监控:实时监控系统的流量和指标,帮助进行决策。

Sentinel功能

  Sentinel 提供以下功能:

    1. 流量控制:限制请求的数量和频率,防止系统过载。

    2. 熔断器:自动中断失败的服务调用,保护系统稳定性。

    3. 降级处理:在系统负载过高时,自动提供降级服务。

    4. 实时监控:提供流量、响应时间等实时监控数据。

Sentinel使用

  使用 Sentinel 主要包括以下步骤:

    1. 引入依赖:在项目中引入 Sentinel 的相关依赖。

    2. 配置规则:定义流量控制、熔断和降级的规则。

    3. 监控系统:配置 Sentinel 的监控功能,实时查看系统状态。

    4. 实施保护:在应用中实施 Sentinel 的流量控制和熔断降级功能。

Sentinel规则

  Sentinel 规则包括:

    1. 流量控制规则:设置请求的 QPS(每秒请求数)限制。

    2. 熔断规则:设置熔断条件,如失败率或响应时间。

    3. 降级规则:设置系统负载或资源限制时的降级策略。

Sentinel整合网关

Sentinel整合Nacos实现规则持久化

  在此,以限流为例,介绍一种基于Nacos配置中心的网关服务限流规则动态实现方法。首先,自然是要引入sentinel的相关依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2023.0.1.0</version>
</dependency>

<!-- SpringCloud Alibaba Sentinel Gateway -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
<version>2023.0.1.0</version>
</dependency>

  接着,实现基于Nacos配置的限流规则仓库NacosFlowDefinitionRepository

  NacosFlowDefinitionRepository 类用于从 Nacos 获取并管理限流规则,并将这些规则应用到 Sentinel。类似于前文中的动态路由配置的仓库。

  initializeRules的方法:

1
2
3
4
5
6
7
8
9
private void initializeRules() {
try {
String content = nacosConfigManager.getConfigService().getConfig(dataId, groupId, 5000);
Set<GatewayFlowRule> rules = parseRules(content);
GatewayRuleManager.loadRules(rules);
} catch (NacosException e) {
log.error("Failed to initialize rules from Nacos config", e);
}
}

  从 Nacos 获取限流规则的配置,并将其解析为 GatewayFlowRule 对象集合,随后通过 GatewayRuleManager 加载这些规则。

  添加监听器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void addListener() {
try {
nacosConfigManager.getConfigService().addListener(dataId, groupId, new Listener() {
@Override
public Executor getExecutor() {
return null;
}

@Override
public void receiveConfigInfo(String configInfo) {
try {
Set<GatewayFlowRule> rules = parseRules(configInfo);
GatewayRuleManager.loadRules(rules);
publisher.publishEvent(new RefreshRoutesEvent(this));
} catch (Exception e) {
log.error("Failed to parse and load rules from Nacos config", e);
}
}
});
} catch (NacosException e) {
log.error("nacos-addListener-error", e);
}
}

  当配置发生变化时,重新解析并加载规则,并发布 RefreshRoutesEvent 事件通知系统。

  parseRules 方法,解析从 Nacos 获取的 JSON 字符串,将其转换为 GatewayFlowRule 对象集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private Set<GatewayFlowRule> parseRules(String configInfo) {
JSONArray array = JSON.parseArray(configInfo);
Set<GatewayFlowRule> rules = new HashSet<>();
for (int i = 0; i < array.size(); i++) {
JSONObject jsonObject = array.getJSONObject(i);
GatewayFlowRule rule = new GatewayFlowRule();
rule.setResource(jsonObject.getString("resource"));
rule.setCount(jsonObject.getLong("count"));
rule.setIntervalSec(jsonObject.getInteger("intervalSec"));
rules.add(rule);
System.out.println("rule:"+rule);
}
return rules;
}

  值得一提的是,sentinel的功能是强大的,除了限流还可以以类似的方式做相应的熔断降级,对于限流来说,还可以进一步采用令牌桶等算法来实现更为平滑的限流行为。

  于此,主要介绍的还是通过Nacos+Sentinel来实现动态容错,详细实现可见:https://github.com/gagaducko/springcloud-microservice-security/tree/main/gateway-service


学习笔记—微服务—技术栈实践(5)—网关+Nacos+Sentinel的动态服务容错
https://gagaducko.github.io/2024/09/12/学习笔记—微服务—技术栈实践-5-—网关-Nacos-Sentinel的动态服务容错/
作者
gagaduck
发布于
2024年9月12日
许可协议