基本操作
1.pom及yml配置
父级工程
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
consumer
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
</dependencies>
server:
port: 8090
spring:
application:
name: nacos-consumer
cloud:
sentinel:
transport:
port: 8099 #跟sentinel控制台交流的端口,随意指定一个未使用的端口即可
dashboard: localhost:8180 # 指定sentinel控制台地址
eager: true #默认为false (当前服务启动时,是否与sentinel进行建立连接)
web-context-unify: false
datasource:
ds:
nacos:
server-addr: localhost:8848
group-id: DEFAULT_GROUP
rule-type: flow
data-id: nacos-consumer
data-type: json
nacos:
discovery:
server-addr: localhost:8848 #从哪里去查找服务
provider
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
server:
port: 8081
spring:
application:
name: nacos-provider
cloud:
nacos:
server-addr: localhost:8848
2.Sentinel 1.8.0启动命令
java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
3.Sentinel登录
账号: sentinel
密码: sentinel
4.主要功能
1. 限流
设置阈值类型QPS
设置单机阈值数
选择监控模式
- 直接→ 直接对服务进行流控
- 关联→ 保证重要服务的正常调用, QPS激增时对次要服务控流降级
(资源名是被限流的服务, 关联资源是较重要的服务) - 链路→ 对服务调用的资源限流, 在服务中针对方法添加@SentinelResource注解指定资源名,
(由于Sentinel版本问题, 可能服务会出现在Sentinel资源列表下, 需要配置yml中的web-context-unify, 或者将资源名写为Sentinel服务)
选择流控效果
- 直接失败→ 失败返回异常
- Warn→ 在设置的时间内QPS逐渐达到峰值, 减轻服务器压力, 如设置阈值100, 时间10s, 会在10秒后达到最大流量
- 排队等待→ 匀速排队
2. 降级
对不稳定的资源进行熔断
设置熔断策略
- 慢调用比例
- 异常比例
- 异常数
设置最大RT, 即调用阻塞等待的最大时长
设置比例阈值, 即最小请求数中调用超时比例
设置熔断时间
设置最小请求数, 规定请求达到的数量
返回Degrade异常
3. 热点
对某个调用频率高的资源进行限制, 比如经常用于增删改查的参数id
设置参数索引, @SentinelResource注解的第一个参数下标为0
设置单机阈值
设置窗口时长, 时间段内调用达到阈值即被限流
可选择配置高级设置, 针对具体参数值设置阈值, 灵活度高
返回Flow异常
4. 授权
设置要授权的服务
设置应用名, 多个用逗号隔开
创建RequestOriginParser接口的实现类, 重写ParserOrigin方法, 通过HttpServerlet类get参数/请求头等信息, 返回origin, 调用资源的应用名会传入origin进行判断
参数显式请求方式: http://ip:port/xxx?param=xx&origin=appName
设置白名单/黑名单
白名单意为只有输入的应用名可以调用资源
黑名单意为除了输入的应用名之外都可以调用资源
返回Authority异常
5.系统规则
5.持久化
由于服务先前一直运行在内存中, 每次重启关闭都要重新访问显示列表, 可以使用持久化操作将配置保存
配置pom依赖
打开nacos添加json配置, 如
[
{
"resource": "/consumer/doRestEcho",
"controlBehavior": 0,
"count": 1.0,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
- resource:资源名,即限流规则的作用对象
- limitApp:流控针对的调用来源,若为 default 则不区分调用来源
- grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
- count:限流阈值
- strategy:调用关系限流策略
- controlBehavior:流量控制效果(快速失败、Warm Up、匀速排队)
- clusterMode:是否为集群模式
此时重启服务, Sentinel中会保持这些配置