一、简介
Sentinel 作为一款强大的流量控制组件,能够对系统入口流量进行精准控制,有效防止服务因突发流量冲击引起服务雪崩,进而导致服务瘫痪,确保服务的稳定性和可靠性。
Nacos 作为配置管理和服务发现平台,实现了配置的集中化存储和管理,使得微服务的配置变更更为灵活、高效,减少了了因配置错误导致的故障。
Sentinel 与 Nacos的整合后可以从 Nacos 获取限流规则等配置信息,实现配置动态更新,无需重启服务即可调整流量控制策略,提高了运维效率和和灵活性,
总而言之,Sentinel 与 Nacos的整合不仅强化了微服务的流量控制能力,还实现了配置的集中化、动态化管理,是提升系统稳定性和运维效率的关键措施,对于构建高可用、易维护的微服务架构具有深远的意义。
关于 Sentinel 与 Nacos 的详细介绍已经在在往期的文章中介绍过,这篇文章介绍如何将二者整合,构建稳定的微服务,增强服务稳定性。
sentinel 主要特性
二、集成 Sentinel 与 Nacos
项目结构如下
2.1 依赖添加
添加相关依赖,这里只添加需要的依赖,关于 SpringBoot 与 SpringCloud 的依赖可自行添加,添加 sentinel 与 Nacos 依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- sentinel 为扩展 Nacos 添加的数据源依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2.2 服务配置添加
首先在 bootstrap.yml 中添加依赖,在 Spring Boot 规范中,bootstrap 文件通常被用于应用上下文引导,bootstrap.yml 文件加载的优先级要高于 application.yml。而在 Nacos 配置中通常会添加数据库等配置,这些数据库配置用于初始化其他组件,所以必须保证在其他组件启动之前就获取到这些基础配置,随后才能初始。
具体的配置如下:
spring:
application:
name: sentinel-demo # 服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
namespace: public # 这里简化一下,直接在public中添加配置,没有区分环境
file-extension: yaml
group: DEFAULT_GROUP
server-addr: localhost:8848
server:
port: 8081
2.3 Nacos 配置文件添加
在 Nacos 中添加相应的配置文件,Nacos 的配置文件默认命名规则为:{spring.application.name}-{profile}.yaml,其中 {profile}
是 Spring 的环境配置,这里没有区分环境变量,默认在 public 命名空间下。
除了系统的配置文件外,还需要配置一个 sentinel 的配置文件,用来设置限流规则,具体内容如下
sentinel-demo 配置文件内容为:
spring:
cloud:
sentinel:
eager: true
transport:
dashboard: localhost:8080 # 指定 sentinel dashboard 地址
datasource:
flow:
nacos:
server-addr: localhost:8848
data-id: ${spring.application.name}-flow-rules # 指定限流配置文件
group-id: DEFAULT_GROUP
data-type: json # 规则数据格式
rule-type: flow # 规则类型
sentinel-demo-flow-rules 配置文件内容为:
[
{
"resource": "/sentinel/test",
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
- resource:资源名称,这是限流规则所针对的资源标识符,可以是任何字符串,但通常建议使用与业务相关的、具有明确语义的名称,如服务名、接口路径等。
- count:限流阈值,即在单位时间内允许通过的请求数量。例如,如果设置为10,那么在指定的统计时间窗口内最多允许10个请求通过。
- grade:流量控制的等级,决定限流规则的触发条件。
- 0 代表 QPS 的流控
- 1 代表基于线程数的流控,即同时允许执行的线程数不超过设定值
- limitApp:流控针对的应用,用于指定规则针对于哪个应用,如果是 default 则表示所有的应用都生效。
- strategry:流控模式,决定如何进行流控控制
- 0 代表直接模式,达到限流条件后,新的请求直接被拒绝
- 1 代表关联模式,当关联资源达到限流条件后出发本资源的流控
- 2 代表链路模式,仅对指定的调用链路生效
- controlBehavior:流控效果,定义了达到限流条件时的具体处理方式。
- 0 表示快速失败,直接拒绝请求
- 1 表示 warm up,即预热模式,逐步增加允许的请求量知道达到设定的阈值
- 2 表示匀速排队,请求被放入队列中以匀速处理,超出队列容量的请求被拒绝
- clusterMode:是否开启集群流控,当设置为 true 时,表示这时一个集群限流规则,需要与其他 Sentinel 客户端协作进行流量控制。
2.4 接口编写
这仅是一个测试接口,比较简单
@RestController
public class TestController {
@RequestMapping(value = "/sentinel/test")
public String testController() {
return "ok";
}
}
三、流控验证
启动服务,登录 Sentinel 控制台,可以看到如下界面
在浏览器快速访问测试接口,可以看到实时监控如下
3.1 sentinel 控制面板
实现监控:展示服务实时流量指标,如每秒请求数(QPS)、通过请求数、被拒绝的请求数。
簇点链路:显示服务中各个 API 或资源的调用链路,可以查看每个链路的流量、响应时间和异常比例,有助于快速定位问题所在。
流控规则:创建、编辑、删除流量控制规则,包括设置资源的限流规则、限流模式(直接拒绝、预热模型、排队模型)、时间窗口等。
熔断规则:配置熔断策略,包括调用比例、异常比例、RT 阈值等出发条件,以及熔断后的恢复策略。
热点规则:针对特定参数值进行流量控制,可以设置参数的阈值和限流策略。
系统规则:设置系统级别的保护规则,如CPU使用率、线程数等阈值,以保护系统免受过载影响。
授权规则:管理访问权限,定义那些客户端或 IP 可以访问特定规则 。
四、总结
Sentinel 与 Nacos的整合不仅强化了微服务的流量控制能力,还实现了配置的集中化、动态化管理,是提升系统稳定性和运维效率的关键措施,对于构建高可用、易维护的微服务架构具有深远的意义。
往期经典推荐
云原生:Kubernetes下的Java应用部署实战详解_kubernetes 创建java微服务-CSDN博客
微服务拆分:打造高性能、高扩展的未来架构-CSDN博客
微服务韧性工程:利用Sentinel实施有效服务容错与限流降级_sentinel限流容错-CSDN博客
一文看懂Nacos如何实现高效、动态的配置中心管理_nacos 动态配置-CSDN博客
Spring Cloud + Nacos 引领服务治理新航向_nacous服务治理-CSDN博客