Sentinel与Nacos强强联合,构建微服务稳定性基石的重要实践

一、简介

Sentinel 作为一款强大的流量控制组件,能够对系统入口流量进行精准控制,有效防止服务因突发流量冲击引起服务雪崩,进而导致服务瘫痪,确保服务的稳定性和可靠性。

Nacos 作为配置管理和服务发现平台,实现了配置的集中化存储和管理,使得微服务的配置变更更为灵活、高效,减少了了因配置错误导致的故障。

Sentinel 与 Nacos的整合后可以从 Nacos 获取限流规则等配置信息,实现配置动态更新,无需重启服务即可调整流量控制策略,提高了运维效率和和灵活性,

总而言之,Sentinel 与 Nacos的整合不仅强化了微服务的流量控制能力,还实现了配置的集中化、动态化管理,是提升系统稳定性和运维效率的关键措施,对于构建高可用、易维护的微服务架构具有深远的意义。

关于 Sentinel 与 Nacos 的详细介绍已经在在往期的文章中介绍过,这篇文章介绍如何将二者整合,构建稳定的微服务,增强服务稳定性。

sentinel 主要特性

二、集成 Sentinel 与 Nacos

项目结构如下

2.1 依赖添加

添加相关依赖,这里只添加需要的依赖,关于 SpringBoot 与 SpringCloud 的依赖可自行添加,添加 sentinel 与 Nacos 依赖。

java 复制代码
<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 配置中通常会添加数据库等配置,这些数据库配置用于初始化其他组件,所以必须保证在其他组件启动之前就获取到这些基础配置,随后才能初始。

具体的配置如下:

java 复制代码
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 配置文件内容为:

java 复制代码
  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 配置文件内容为:

java 复制代码
[
  {
    "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 接口编写

这仅是一个测试接口,比较简单

java 复制代码
@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博客

相关推荐
Yan.love36 分钟前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶39 分钟前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥39 分钟前
java提高正则处理效率
java·开发语言
智慧老师1 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm1 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
V+zmm101342 小时前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob2 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-13142 小时前
常用的缓存技术都有哪些
java
AiFlutter3 小时前
Flutter-底部分享弹窗(showModalBottomSheet)
java·前端·flutter
J不A秃V头A3 小时前
IntelliJ IDEA中设置激活的profile
java·intellij-idea