在现代微服务架构中,服务治理面临着两大核心挑战:服务实例的动态管理和流量控制的有效实施。传统方案通常将这两部分割裂处理,导致运维复杂度呈指数级增长。我们通过将Sentinel与Nacos深度集成,构建了一套完整的服务治理解决方案。
Nacos 在这个体系中承担着两大关键角色:
Sentinel 则专注于:
当服务实例启动时,会向Nacos注册服务信息(包括IP、端口、健康状态等)。Sentinel客户端通过订阅Nacos的服务列表,可以动态感知服务实例的变化。同时,Sentinel会定期从Nacos配置中心拉取最新的规则配置,实现规则的动态更新。
这种架构带来了三个显著优势:
推荐使用以下环境配置:
在pom.xml中需要特别注意以下关键依赖:
xml复制<!-- Sentinel核心依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2021.0.5.0</version>
</dependency>
<!-- Nacos服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.5.0</version>
</dependency>
<!-- Sentinel-Nacos适配器 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.6</version>
</dependency>
bootstrap.yml中需要配置的核心参数:
yaml复制spring:
cloud:
nacos:
discovery:
server-addr: nacos-cluster:8848
namespace: prod
group: APP_GROUP
sentinel:
transport:
dashboard: sentinel-dashboard:8080
datasource:
flow:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
data-id: ${spring.application.name}-flow-rules
rule-type: flow
服务实例启动时会自动向Nacos注册,关键日志如下:
code复制2023-08-20 14:30:22 INFO Registering service with nacos server...
2023-08-20 14:30:23 INFO Register service DEFAULT_GROUP@@user-service success
Sentinel通过NacosDiscoveryClient获取服务实例列表:
java复制@Autowired
private NacosDiscoveryClient discoveryClient;
public List<ServiceInstance> getInstances(String serviceId) {
return discoveryClient.getInstances(serviceId);
}
Sentinel通过NacosDataSource监听配置变更:
java复制ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(
nacosConfigService,
dataId,
groupId,
parser
);
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
当Nacos中配置变更时,整个过程平均在200ms内完成规则更新。
Nacos中配置的流控规则(JSON格式):
json复制[
{
"resource": "getUserById",
"limitApp": "default",
"grade": 1,
"count": 100,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
各字段含义:
json复制[
{
"resource": "slowQuery",
"grade": 0,
"count": 2000,
"timeWindow": 10,
"minRequestAmount": 5,
"statIntervalMs": 1000,
"slowRatioThreshold": 0.5
}
]
通过Nacos的Group和Namespace实现多环境隔离:
配置示例:
yaml复制spring:
cloud:
nacos:
discovery:
namespace: ${spring.profiles.active}
group: ORDER_GROUP
结合Nacos的配置版本历史功能,可以实现:
Nacos客户端缓存 :适当调整缓存更新时间(默认1秒)
yaml复制spring.cloud.nacos.discovery.watch-delay: 3000
Sentinel统计采样 :高并发场景下调大采样窗口
java复制System.setProperty("csp.sentinel.statistic.max.rt", "5000");
连接池配置 :优化Nacos客户端连接参数
yaml复制spring.cloud.nacos.discovery.ribbon.NacosServerListRefreshInterval: 10000
推荐监控指标:
可通过Prometheus配置告警规则:
yaml复制- alert: SentinelRuleLoadFailed
expr: increase(sentinel_datasource_load_failed_total[1m]) > 0
for: 1m
检查Nacos配置是否正确推送
bash复制curl -X GET "http://nacos:8848/nacos/v1/cs/configs?dataId=user-service-flow-rules&group=APP_GROUP"
验证Sentinel是否成功加载规则
java复制FlowRuleManager.getRules().forEach(System.out::println);
检查资源名称是否匹配(注意大小写)
当出现高延迟时,重点检查:
在Spring Cloud Gateway中集成:
yaml复制spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 100
redis-rate-limiter.burstCapacity: 200
通过组合多种规则实现精细控制:
配置示例:
json复制{
"systemRules": [
{
"highestSystemLoad": 0.7,
"highestCpuUsage": 0.8
}
]
}
在实际项目落地时,我们发现当服务实例数超过50个时,建议采用Nacos集群模式并调整客户端缓存策略,可以将规则生效延迟控制在500ms以内。对于关键业务接口,推荐设置Warm Up参数,避免冷启动时被流量打垮。