主题
简介
主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
introduction | Sentinel (sentinelguard.io)
服务端部署
版本 1.8.6
规则持久化—基于nacos
- 控制台推送规则:
- 将规则推送到Nacos或其他远程配置中心
- Sentinel客户端链接Nacos,获取规则配置;并监听Nacos配置变化,如发生变化,就更新本地缓存(从而让本地缓存总是和Nacos一致)
- 控制台监听Nacos配置变化,如发生变化就更新本地缓存(从而让控制台本地缓存总是和Nacos一致)
二进制包
配置文件
注意修改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 | 指定应用的名称 | String | null | 否 | |
csp.sentinel.app.type | 指定应用的类型 | int | 0 (APP_TYPE_COMMON) | 否 | 1.6.0 引入 |
csp.sentinel.metric.file.single.size | 单个监控日志文件的大小 | long | 52428800 (50MB) | 否 | |
csp.sentinel.metric.file.total.count | 监控日志文件的总数上限 | int | 6 | 否 | |
csp.sentinel.metric.flush.interval | Sentinel metric log 任务的时间频率,单位为秒(s) | int | 1 | 否 | 若配置0,则代表不打印 metric log。该配置项于 1.8.x 版本引入 |
csp.sentinel.spi.classloader | SPI 加载时使用的 ClassLoader,默认为给定类的 ClassLoader | String | default | 否 | 若配置context则使用 thread context ClassLoader。1.7.0 引入 |
csp.sentinel.log.dir | Sentinel 日志文件目录 | String | ${user.home}/logs/csp/ | 否 | 1.3.0 引入 |
---|---|---|---|---|---|
csp.sentinel.log.use.pid | 日志文件名中是否加入进程号,用于单机部署多个应用的情况 | boolean | false | 否 | 1.3.0 引入 |
csp.sentinel.log.output.type | Record 日志输出的类型,file代表输出至文件,console代表输出至终端 | String | file | 否 | 1.6.2 引入 |
csp.sentinel.dashboard.server | 控制台的地址,指定控制台后客户端会自动向该地址发送心跳包。地址格式为:hostIp:port | String | null | 是 |
---|---|---|---|---|
csp.sentinel.heartbeat.interval.ms | 心跳包发送周期,单位毫秒 | long | null | 非必需,若不进行配置,则会从相应的HeartbeatSender中提取默认值 |
csp.sentinel.api.port | 本地启动 HTTP API Server 的端口号 | int | 8719 | 否 |
csp.sentinel.heartbeat.client.ip | 指定心跳包中本机的 IP | String | - | 若不指定则通过HostNameUtil解析;该配置项多用于多网卡环境 |
登陆控制台
账号: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.name | Sentinel项目名 | |
spring.cloud.sentinel.enabled | Sentinel自动化配置是否生效 | true |
spring.cloud.sentinel.eager | 是否提前触发 Sentinel 初始化 | false |
spring.cloud.sentinel.transport.port | 应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer | 8719 |
spring.cloud.sentinel.transport.dashboard | Sentinel 控制台地址 | |
spring.cloud.sentinel.transport.heartbeat-interval-ms | 应用与Sentinel控制台的心跳间隔时间 | |
spring.cloud.sentinel.transport.client-ip | 此配置的客户端IP将被注册到 Sentinel Server 端 | |
spring.cloud.sentinel.filter.order | Servlet Filter的加载顺序。Starter内部会构造这个filter | Integer.MIN_VALUE |
spring.cloud.sentinel.filter.url-patterns | 数据类型是数组。表示Servlet Filter的url pattern集合 | /* |
spring.cloud.sentinel.filter.enabled | Enable to instance CommonFilter | true |
spring.cloud.sentinel.metric.charset | metric文件字符集 | UTF-8 |
spring.cloud.sentinel.metric.file-single-size | Sentinel metric 单个文件的大小 | |
spring.cloud.sentinel.metric.file-total-count | Sentinel metric 总文件数量 | |
spring.cloud.sentinel.log.dir | Sentinel 日志文件所在的目录 | |
spring.cloud.sentinel.log.switch-pid | Sentinel 日志文件名是否需要带上pid | false |
spring.cloud.sentinel.servlet.block-page | 自定义的跳转 URL,当请求被限流时会自动跳转至设定好的 URL | |
spring.cloud.sentinel.flow.cold-factor | 冷启动因子 | 3 |
spring.cloud.sentinel.scg.fallback.mode | Spring Cloud Gateway 熔断后的响应模式(选择redirect or response) | |
spring.cloud.sentinel.scg.fallback.redirect | Spring Cloud Gateway 响应模式为 'redirect' 模式对应的重定向 URL | |
spring.cloud.sentinel.scg.fallback.response-body | Spring Cloud Gateway 响应模式为 'response' 模式对应的响应内容 | |
spring.cloud.sentinel.scg.fallback.response-status | Spring Cloud Gateway 响应模式为 'response' 模式对应的响应码 | 429 |
spring.cloud.sentinel.scg.fallback.content-type | Spring Cloud Gateway 响应模式为 'response' 模式对应的 content-type | application/json |
配置规则
- @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..";
}
- spring.cloud.sentinel.eager默认为false,先对微服务发起一次请求,在sentinel控制台左侧菜单栏看见微服务被管理
- 配置限流规则,nacos自动生成配置文件,保存规则信息
- 规则配置
- 接口降级
- nacos配置文件 文件不存在,会自动生成
- 微服务重启后,限流规则自动加载
注意
Q:使用@SentinelResource,sentinel异常无法捕获 A:使用@SentinelResource,必须配置value,blockHandler
Q:熔断规则-异常策略无效 A:异常被底座捕获,需要使用@SentinelResource配上blockHandler
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.name | Sentinel项目名 | |
spring.cloud.sentinel.enabled | Sentinel自动化配置是否生效 | true |
spring.cloud.sentinel.eager | 是否提前触发 Sentinel 初始化 | false |
spring.cloud.sentinel.transport.port | 应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer | 8719 |
spring.cloud.sentinel.transport.dashboard | Sentinel 控制台地址 | |
spring.cloud.sentinel.transport.heartbeat-interval-ms | 应用与Sentinel控制台的心跳间隔时间 | |
spring.cloud.sentinel.transport.client-ip | 此配置的客户端IP将被注册到 Sentinel Server 端 | |
spring.cloud.sentinel.filter.order | Servlet Filter的加载顺序。Starter内部会构造这个filter | Integer.MIN_VALUE |
spring.cloud.sentinel.filter.url-patterns | 数据类型是数组。表示Servlet Filter的url pattern集合 | /* |
spring.cloud.sentinel.filter.enabled | Enable to instance CommonFilter | true |
spring.cloud.sentinel.metric.charset | metric文件字符集 | UTF-8 |
spring.cloud.sentinel.metric.file-single-size | Sentinel metric 单个文件的大小 | |
spring.cloud.sentinel.metric.file-total-count | Sentinel metric 总文件数量 | |
spring.cloud.sentinel.log.dir | Sentinel 日志文件所在的目录 | |
spring.cloud.sentinel.log.switch-pid | Sentinel 日志文件名是否需要带上pid | false |
spring.cloud.sentinel.servlet.block-page | 自定义的跳转 URL,当请求被限流时会自动跳转至设定好的 URL | |
spring.cloud.sentinel.flow.cold-factor | 冷启动因子 | 3 |
spring.cloud.sentinel.scg.fallback.mode | Spring Cloud Gateway 熔断后的响应模式(选择 redirect or response) | |
spring.cloud.sentinel.scg.fallback.redirect | Spring Cloud Gateway 响应模式为 'redirect' 模式对应的重定向 URL | |
spring.cloud.sentinel.scg.fallback.response-body | Spring Cloud Gateway 响应模式为 'response' 模式对应的响应内容 | |
spring.cloud.sentinel.scg.fallback.response-status | Spring Cloud Gateway 响应模式为 'response' 模式对应的响应码 | 429 |
spring.cloud.sentinel.scg.fallback.content-type | Spring Cloud Gateway 响应模式为 'response' 模式对应的 content-type | application/json |
配置规则
- @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..";
}
- spring.cloud.sentinel.eager默认为false,先对网关发起一次请求,在sentinel控制台左侧菜单栏看见微服务被管理
- 配置限流规则,nacos自动生成配置文件,保存规则信息
- 规则配置
- 接口降级
- nacos配置文件
文件不存在,会自动生成
- 网关重启后,限流规则不会消失
注意
- Q:系统规则无效,熔断规则-异常策略无效 A: 不支持