Skip to content

简介

主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

introduction | Sentinel (sentinelguard.io)

服务端部署

版本 1.8.6

控制台说明

规则持久化—基于nacos

源码修改参考

  • 控制台推送规则:
    • 将规则推送到Nacos或其他远程配置中心
    • Sentinel客户端链接Nacos,获取规则配置;并监听Nacos配置变化,如发生变化,就更新本地缓存(从而让本地缓存总是和Nacos一致)
  • 控制台监听Nacos配置变化,如发生变化就更新本地缓存(从而让控制台本地缓存总是和Nacos一致)

二进制包

sentinel-dashboard.zip

配置文件

注意修改nacos配置

properties
#spring settings
server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true

#cookie name setting
server.servlet.session.cookie.name=sentinel_dashboard_cookie

#logging settings
logging.level.org.springframework.web=INFO
logging.file.name=${user.home}/logs/csp/sentinel-dashboard.log
logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
#logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n

#auth settings
auth.filter.exclude-urls=/,/auth/login,/auth/logout,/registry/machine,/version
auth.filter.exclude-url-suffixes=htm,html,js,css,map,ico,ttf,woff,png
# If auth.enabled=false, Sentinel console disable login
auth.username=sentinel
auth.password=sentinel

# Inject the dashboard version. It's required to enable
# filtering in pom.xml for this resource file.
sentinel.dashboard.version=@project.version@

nacos.server-addr=127.0.0.1:8848
nacos.namespace=dev
nacos.group=jiegou
nacos.username=nacos
nacos.password=nacos

启动脚本

注意修改IP地址

shell
#!/bin/bash

nohup java -Dserver.port=8080 \
-Dcsp.sentinel.dashboard.server=172.16.27.61:8080 \
-Dcsp.sentinel.heartbeat.client.ip=172.16.27.61 \
-Dcsp.sentinel.log.dir=/Users/archie/mydata/MyTools/sentinel-dashboard/logs/ \
-Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar &

启动脚本说明

名称含义类型默认值是否必需备注
project.name指定应用的名称Stringnull
csp.sentinel.app.type指定应用的类型int0 (APP_TYPE_COMMON)1.6.0 引入
csp.sentinel.metric.file.single.size单个监控日志文件的大小long52428800 (50MB)
csp.sentinel.metric.file.total.count监控日志文件的总数上限int6
csp.sentinel.metric.flush.intervalSentinel metric log 任务的时间频率,单位为秒(s)int1若配置0,则代表不打印 metric log。该配置项于 1.8.x 版本引入
csp.sentinel.spi.classloaderSPI 加载时使用的 ClassLoader,默认为给定类的 ClassLoaderStringdefault若配置context则使用 thread context ClassLoader。1.7.0 引入
csp.sentinel.log.dirSentinel 日志文件目录String${user.home}/logs/csp/1.3.0 引入
csp.sentinel.log.use.pid日志文件名中是否加入进程号,用于单机部署多个应用的情况booleanfalse1.3.0 引入
csp.sentinel.log.output.typeRecord 日志输出的类型,file代表输出至文件,console代表输出至终端Stringfile1.6.2 引入
csp.sentinel.dashboard.server控制台的地址,指定控制台后客户端会自动向该地址发送心跳包。地址格式为:hostIp:portStringnull
csp.sentinel.heartbeat.interval.ms心跳包发送周期,单位毫秒longnull非必需,若不进行配置,则会从相应的HeartbeatSender中提取默认值
csp.sentinel.api.port本地启动 HTTP API Server 的端口号int8719
csp.sentinel.heartbeat.client.ip指定心跳包中本机的 IPString-若不指定则通过HostNameUtil解析;该配置项多用于多网卡环境

登陆控制台

sentinel-1 账号:sentinel/sentinel

基础底座使用

微服务

导入依赖

xml
<dependency>
    <groupId>cn.zjtele.pubinfo.cloud</groupId>
    <artifactId>pubinfo-cloud-starter-sentinel</artifactId>
</dependency>

配置文件

注意修改控制台地址

yaml
# 开 启feign降级策略,优先级高于全局异常处理
feign:
  sentinel:
    enabled: true

spring:
  cloud:
    sentinel:
      enabled: true
      eager: true
      # 开 启sentinel全局异常处理
      except-handler-enabled: true
      transport:
        dashboard: 172.16.27.61:8080
        # 客 户端与控制台的通信地址
        port: 8719
        client-ip: 172.16.27.61
      datasource:
        # 流 控规则
        flow:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            username: ${spring.cloud.nacos.username}
            password: ${spring.cloud.nacos.password}
            namespace: ${spring.cloud.nacos.discovery.namespace}
            groupId: ${spring.cloud.nacos.discovery.group}
            dataId: ${spring.application.name}-flow-rules
            data-type: json
            rule-type: flow
          # 授 权规则
        authority:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            username: ${spring.cloud.nacos.username}
            password: ${spring.cloud.nacos.password}
            namespace: ${spring.cloud.nacos.discovery.namespace}
            groupId: ${spring.cloud.nacos.discovery.group}
            dataId: ${spring.application.name}-authority-rules
            data-type: json
            rule-type: authority
          # 降级规则
        degrade:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            username: ${spring.cloud.nacos.username}
            password: ${spring.cloud.nacos.password}
            namespace: ${spring.cloud.nacos.discovery.namespace}
            groupId: ${spring.cloud.nacos.discovery.group}
            dataId: ${spring.application.name}-degrade-rules
            data-type: json
            rule-type: degrade
          # 热点规则
        param-flow:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            username: ${spring.cloud.nacos.username}
            password: ${spring.cloud.nacos.password}
            namespace: ${spring.cloud.nacos.discovery.namespace}
            groupId: ${spring.cloud.nacos.discovery.group}
            dataId: ${spring.application.name}-param-flow-rules
            data-type: json
            rule-type: param-flow
          # 系统规则
        system:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            username: ${spring.cloud.nacos.username}
            password: ${spring.cloud.nacos.password}
            namespace: ${spring.cloud.nacos.discovery.namespace}
            groupId: ${spring.cloud.nacos.discovery.group}
            dataId: ${spring.application.name}-system-rules
            data-type: json
            rule-type: system

配置项

配置项含义默认值
spring.application.name or project.nameSentinel项目名
spring.cloud.sentinel.enabledSentinel自动化配置是否生效true
spring.cloud.sentinel.eager是否提前触发 Sentinel 初始化false
spring.cloud.sentinel.transport.port应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer8719
spring.cloud.sentinel.transport.dashboardSentinel 控制台地址
spring.cloud.sentinel.transport.heartbeat-interval-ms应用与Sentinel控制台的心跳间隔时间
spring.cloud.sentinel.transport.client-ip此配置的客户端IP将被注册到 Sentinel Server 端
spring.cloud.sentinel.filter.orderServlet Filter的加载顺序。Starter内部会构造这个filterInteger.MIN_VALUE
spring.cloud.sentinel.filter.url-patterns数据类型是数组。表示Servlet Filter的url pattern集合/*
spring.cloud.sentinel.filter.enabledEnable to instance CommonFiltertrue
spring.cloud.sentinel.metric.charsetmetric文件字符集UTF-8
spring.cloud.sentinel.metric.file-single-sizeSentinel metric 单个文件的大小
spring.cloud.sentinel.metric.file-total-countSentinel metric 总文件数量
spring.cloud.sentinel.log.dirSentinel 日志文件所在的目录
spring.cloud.sentinel.log.switch-pidSentinel 日志文件名是否需要带上pidfalse
spring.cloud.sentinel.servlet.block-page自定义的跳转 URL,当请求被限流时会自动跳转至设定好的 URL
spring.cloud.sentinel.flow.cold-factor冷启动因子3
spring.cloud.sentinel.scg.fallback.modeSpring Cloud Gateway 熔断后的响应模式(选择redirect or response)
spring.cloud.sentinel.scg.fallback.redirectSpring Cloud Gateway 响应模式为 'redirect' 模式对应的重定向 URL
spring.cloud.sentinel.scg.fallback.response-bodySpring Cloud Gateway 响应模式为 'response' 模式对应的响应内容
spring.cloud.sentinel.scg.fallback.response-statusSpring Cloud Gateway 响应模式为 'response' 模式对应的响应码429
spring.cloud.sentinel.scg.fallback.content-typeSpring Cloud Gateway 响应模式为 'response' 模式对应的 content-typeapplication/json

配置规则

  1. @SentinelResource(配置资源、降级方法)
java
@GetMapping("/testHotKeyRule")
@SentinelResource(value = "testHotKeyRule", blockHandler = "testHotKeyRule_blockHandler")
public String testHotKeyRule(@RequestParam(value = "username", required = false) String username,
                             @RequestParam(value = "password", required = false) String password) {
    return "[热点限流规则]testHotKeyRule..";
}
public String testHotKeyRule_blockHandler(@RequestParam(value = "username", required = false) String username,
                                          @RequestParam(value = "password", required = false) String password,
                                          BlockException exception) {
    return "[热点限流规则-兜底方法]testHotKeyRule_blockHandler..";
}
  1. spring.cloud.sentinel.eager默认为false,先对微服务发起一次请求,在sentinel控制台左侧菜单栏看见微服务被管理 sentinel-2
  2. 配置限流规则,nacos自动生成配置文件,保存规则信息
  • 规则配置 sentinel-3sentinel-4
  • 接口降级 sentinel-5
  • nacos配置文件 文件不存在,会自动生成 sentinel-6
  1. 微服务重启后,限流规则自动加载

注意

  1. Q:使用@SentinelResource,sentinel异常无法捕获 A:使用@SentinelResource,必须配置value,blockHandler

  2. Q:熔断规则-异常策略无效 A:异常被底座捕获,需要使用@SentinelResource配上blockHandler

  3. Q:系统规则、授权规则无效 A: 经过测试,不支持

网关

导入依赖

xml
<dependency>
    <groupId>cn.zjtele.pubinfo.cloud</groupId>
    <artifactId>pubinfo-cloud-starter-sentinel</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

配置文件

注意修改控制台地址

yaml
spring:
  cloud:
    sentinel:
      scg:
        fallback:
          response-status: 429
          mode: response
          response-body: '{"code": 429,"msg": "请求被限流","success": false}'
      enabled: true
      eager: true
      transport:
        dashboard: 172.16.27.61:8080
        port: 8719
        client-ip: 172.16.27.61
      datasource:
        # 流 控规则
        gw-flow:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            username: ${spring.cloud.nacos.username}
            password: ${spring.cloud.nacos.password}
            namespace: ${spring.cloud.nacos.discovery.namespace}
            groupId: ${spring.cloud.nacos.discovery.group}
            dataId: ${spring.application.name}-gw-flow-rules
            data-type: json
            rule-type: gw-flow
          # 授 权规则
        gw-api-group:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            username: ${spring.cloud.nacos.username}
            password: ${spring.cloud.nacos.password}
            namespace: ${spring.cloud.nacos.discovery.namespace}
            groupId: ${spring.cloud.nacos.discovery.group}
            dataId: ${spring.application.name}-gw-api-group-rules
            data-type: json
            rule-type: gw-api-group
        # 降级规则
        degrade:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            username: ${spring.cloud.nacos.username}
            password: ${spring.cloud.nacos.password}
            namespace: ${spring.cloud.nacos.discovery.namespace}
            groupId: ${spring.cloud.nacos.discovery.group}
            dataId: ${spring.application.name}-degrade-rules
            data-type: json
            rule-type: degrade
          # 系统规则
        system:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            username: ${spring.cloud.nacos.username}
            password: ${spring.cloud.nacos.password}
            namespace: ${spring.cloud.nacos.discovery.namespace}
            groupId: ${spring.cloud.nacos.discovery.group}
            dataId: ${spring.application.name}-system-rules
            data-type: json
            rule-type: system

配置项

配置项含义默认值
spring.application.name or project.nameSentinel项目名
spring.cloud.sentinel.enabledSentinel自动化配置是否生效true
spring.cloud.sentinel.eager是否提前触发 Sentinel 初始化false
spring.cloud.sentinel.transport.port应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer8719
spring.cloud.sentinel.transport.dashboardSentinel 控制台地址
spring.cloud.sentinel.transport.heartbeat-interval-ms应用与Sentinel控制台的心跳间隔时间
spring.cloud.sentinel.transport.client-ip此配置的客户端IP将被注册到 Sentinel Server 端
spring.cloud.sentinel.filter.orderServlet Filter的加载顺序。Starter内部会构造这个filterInteger.MIN_VALUE
spring.cloud.sentinel.filter.url-patterns数据类型是数组。表示Servlet Filter的url pattern集合/*
spring.cloud.sentinel.filter.enabledEnable to instance CommonFiltertrue
spring.cloud.sentinel.metric.charsetmetric文件字符集UTF-8
spring.cloud.sentinel.metric.file-single-sizeSentinel metric 单个文件的大小
spring.cloud.sentinel.metric.file-total-countSentinel metric 总文件数量
spring.cloud.sentinel.log.dirSentinel 日志文件所在的目录
spring.cloud.sentinel.log.switch-pidSentinel 日志文件名是否需要带上pidfalse
spring.cloud.sentinel.servlet.block-page自定义的跳转 URL,当请求被限流时会自动跳转至设定好的 URL
spring.cloud.sentinel.flow.cold-factor冷启动因子3
spring.cloud.sentinel.scg.fallback.modeSpring Cloud Gateway 熔断后的响应模式(选择 redirect or response)
spring.cloud.sentinel.scg.fallback.redirectSpring Cloud Gateway 响应模式为 'redirect' 模式对应的重定向 URL
spring.cloud.sentinel.scg.fallback.response-bodySpring Cloud Gateway 响应模式为 'response' 模式对应的响应内容
spring.cloud.sentinel.scg.fallback.response-statusSpring Cloud Gateway 响应模式为 'response' 模式对应的响应码429
spring.cloud.sentinel.scg.fallback.content-typeSpring Cloud Gateway 响应模式为 'response' 模式对应的 content-typeapplication/json

配置规则

  1. @SentinelResource(配置资源、降级方法)
java
@GetMapping("/test1")
@SentinelResource(value = "test1", blockHandler = "test1_blockHandler")
public String test1(){
    return "----this is test1";
}

public String test1_blockHandler(BlockException exception) {
    return "test1_blockHandler..";
}
  1. spring.cloud.sentinel.eager默认为false,先对网关发起一次请求,在sentinel控制台左侧菜单栏看见微服务被管理 sentinel-7
  2. 配置限流规则,nacos自动生成配置文件,保存规则信息
  • 规则配置 sentinel-8
  • 接口降级 sentinel-9
  • nacos配置文件 sentinel-10 文件不存在,会自动生成
  1. 网关重启后,限流规则不会消失

注意

  1. Q:系统规则无效,熔断规则-异常策略无效 A: 不支持