一篇搞定Sentinel-搭建Spring Cloud Alibaba服务组件Sentinel实现服务资源控制

发布时间 2023-11-01 10:38:38作者: sowler

1、Sentinel介绍

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
官网地址

https://sentinelguard.io/zh-cn/

GitHub地址

https://github.com/alibaba/Sentinel

新手指南

https://github.com/alibaba/Sentinel/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97

2、首先下载Sentinel控制台

Sentinel下载地址

https://github.com/alibaba/Sentinel/releases

选择合适的Sentinel版本进行下载。下载版本需要和Spring Cloud Alibaba版本进行对比,以防下载的版本和其他组件不兼容。这里附加版本说明地址

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E#2021x-%E5%88%86%E6%94%AF

我使用的Spring Cloud Alibaba Version为2.2.6.RELEASE版本,通过版本关系对比需要下载的Sentinel版本为1.8.1,找到该版本进行下载:

这里直接选择jar包下载,也可以自己下载源码进行编译。

3、启动Sentinel控制台

由于下载的为jar包所以需要有JDK安装环境,安装环境是学习java必备的技能这里不做介绍,直接启动jar包:

java  -jar sentinel-dashboard-1.8.1.jar

这里启动的默认端口号为8080。访问IP:8080登录sentinel,默认账号密码:sentinel

登录成功我们会发现控制台只有一个首页其他的什么的没有。因为目前没有服务程序接入,所以sentinel检测不到服务。我们可以修改启动命令,添加参数,让sentinel也能检测到自己。命令:

java -Dserver.port=8820 -Dcsp.sentinel.dashboard.server=localhost:8820 -Dcsp.sentinel.api.port=8719 -Dproject.name=spring-cloud -jar sentinel-dashboard-1.8.1.jar

-Dserver.port=8820 #指定控制台端口,不使用默认端口
-Dcsp.sentinel.dashboard.server=localhost:8820 #指定控制台地址和端口。
-Dcsp.sentinel.api.port=8719 #客户端监控 API 的端口默认是 8719,如果该端口占用,会在默认端口+1。如果+1后8020端口也被占用,则还会持续+1,直到发现没有占用的端口为止。
-Dproject.name=spring-cloud #指定应用的名称

这里只设置这几个参数。如果想要配置更多参数,可以查看官网启动配置项,文档地址

https://sentinelguard.io/zh-cn/docs/startup-configuration.html

执行上面Java命令,启动Sentinel。访问IP:8820登录sentinel,默认账号密码:sentinel

登录成功,我们会发现控制台多个一个应用程序,这个就是通过上面Java启动命令修改的应用名称,sentinel检测到的自己的服务。

4、客户端接入控制台

通过上面三步骤,Sentinel控制台就安装并启动成功了,接下来我们该通过代码接入客户端。首先打开我们的SpringCloud项目,在模块module的pom中添加sentinel依赖,这里我加到我项目的订单模块中order-module:

        <!--服务熔断降级-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

如果之前没有搭建过SpringCloud项目,可以查看我之前写的随笔进行搭建。点击文章链接

https://www.cnblogs.com/eternality/p/17757310.html

jar包引入成功后,就可以在配置文件中加入配置信息了。配置如下:

spring:
  profiles:
    active: dev
  application:
    # 服务名称
    name: order-service-model
  cloud:
    sentinel:
      enabled: true #开启Sentinel
      eager: true # 取消控制台懒加载,项目启动即连接Sentinel
      transport:
        dashboard: localhost:8080 #控制台地址

启动项目,查看sentinel控制台:

这里我启动了两个订单模块服务,可以发现,sentinel中显示了订单模块,说明在order-module中成功接入控制台了。

注意:

如果在配置文件中没有配置取消懒加载spring.cloud.sentinel.eager: true 则项目启动成功在sentinel控制台不会显示模块信息。需要访问一次接口才会显示,因为默认为懒加载模式。

接下来就可以测试Sentinel是否连接成功了,访问接口在实时监控和簇点链路中查看是否有接口信息。

如果想要对外暴露更多信息,我们可以集成SpringBoot的Actuator,对外暴露端点endpoint。Actuator可以了解服务的各种情况,健康检查,服务状态之类。

        <!--监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

在配置文件中加入暴露端点信息:

#暴露端点
management:
  endpoints:
    web:
      exposure:
        include: '*'

5、规则配置

控制规则、降级规则、热点规则、系统规则、授权规则本次不做相关介绍,可以在官方上面学习。点击链接进行查看

https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8

6、Sentinel配置规则持久化

Sentinel配置的规则默认不是真实存在的,只要重新启动微服务项目,之前添加的规则都会消失,需要重新添加。所以需要配置规则持久化,将配置信息保存在注册中心nacos中,这样不管重启多少次项目,最初创建的规则还在。

首先在pom中加入依赖:

        <!-- Sentinel规则持久化至Nacos配置 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

依赖加入成功后,就可以在项目配置文件中加入配置信息了:

spring:
  profiles:
    active: dev
  application:
    # 服务名称
    name: order-service-model
  cloud:
    sentinel:
      enabled: true
      eager: true # 取消控制台懒加载,项目启动即连接Sentinel
      transport:
        dashboard: localhost:8080 #控制台地址
        #port: 8722
      datasource:
        #五种规则持久化到Nacos中 authority(授权规则)、degrade(降级规则)、flow(流控规则)、param-flow(热点规则)、system(系统规则)
        #sentinel 数据持久化-控流
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848 # 配置nacos server 注册中心地址
            dataId: order-service-model-sentinel  # 和nacos中保持对应
            groupId: DEFAULT_GROUP # 和 nacos中保持对应
            data-type: json  # 规则类型:流控
            namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
            # 对于 nacos 数据类型 注意网关流控规则对应 gw-flow
            rule-type: flow #表示流控规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
        #sentinel 数据持久化-降级
        ds2:
          nacos:
            server-addr: 127.0.0.1:8848 # 配置nacos server 注册中心地址
            dataId: order-service-model-sentinel-demotion  # 和nacos中保持对应
            groupId: DEFAULT_GROUP # 和 nacos中保持对应
            data-type: json  # 规则类型:流控
            namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
            # 对于 nacos 数据类型
            rule-type: degrade #表示降级规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
        #sentinel 数据持久化-热点
        ds3:
          nacos:
            server-addr: 127.0.0.1:8848 # 配置nacos server 注册中心地址
            dataId: order-service-model-sentinel-hotspot  # 和nacos中保持对应
            groupId: DEFAULT_GROUP # 和 nacos中保持对应
            data-type: json  # 规则类型:流控
            namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
            # 对于 nacos 数据类型
            rule-type: PARAM_FLOW #表示降级规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group

在nacos的配置列表中添加相关配置文件:

控流文件:order-service-model-sentinel
降级文件:order-service-model-sentinel-demotion
热点规则文件:order-service-model-sentinel-hotspot

order-service-model-sentinel配置信息:

[
    {
       "resource": "redis",
       "limitApp": "default",
       "grade": 1,
       "count": 1,
       "strategy": 0,
       "controlBehavior": 0,
       "clusterMode": false
   }
]

控流规则说明

https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E8%A7%84%E5%88%99-flowrule

order-service-model-sentinel-demotion配置信息:

[
  {
    "resource": "com.itmy.user.service.IUserExternalService:selectUserAll()",
    "grade": 0,
    "count": 100.0,
    "passCount": 0,
    "timeWindow": 20,
    "minRequestAmount":1,
    "statIntervalMs":2002,
    "slowRatioThreshold":0.1
  } 
]

降级规则说明

https://github.com/alibaba/Sentinel/wiki/熔断降级

order-service-model-sentinel-hotspot配置信息:

[
  {
    "resource": "sentinelTest",
    "count": 2,
    "paramIdx":0,
   "durationInSec":1000
  }
]

热点参数限流规则说明:

https://github.com/alibaba/Sentinel/wiki/热点参数限流

上面配置成功后,重新启动项目进行测试。我们可以看到不管重新启动多少次,配置的规则依然在。持久化规则就配置成功了。

注意:

如果后面需要更改配置规则,则需要在nacos的配置中进行修改。在Sentinel中更改如果重新启动项目则还会恢复原来的配置规则。