Sptring cloud Alibaba Sentinel 实现熔断与限流
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。
Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
作用:
服务雪崩
服务降级
服务熔断
服务限流
1.cmd java -jar sentinel-dashboard-1.6.3.jar
2.打开nacos
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot整合Web组件+actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
server:
port: 8401 spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080 #配置sentinel dashbord地址
port: 8719 management:
endpoints:
web:
exposure:
include: "*"
这里的spring.cloud.sentinel.transport.port
端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。
比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。
package com.etc.cloudalibaba.controller; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.TimeUnit; @RestController
@Slf4j
public class FlowLimitController {
@GetMapping("/testA")
public String testA(){
return "------ testA -----";
} @GetMapping("/testB")
public String testB(){
return "------ testB -----";
}
/**
* 主要测试降级 ---- RT
* @return
*/
@GetMapping("/testC")
public String testC(){
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "------ testC -----" ;
} /**
* 主要测试降级 ---- 异常占比 异常数
* @return
*/
@GetMapping("/testD")
public String testD(){
System.out.println(10/0);
return "------ testD -----" ;
}
}
package com.etc.cloudalibaba; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @Slf4j
@SpringBootApplication
@EnableDiscoveryClient
public class SentinelServiceMain8401 {
public static void main(String[] args) {
SpringApplication.run( SentinelServiceMain8401.class,args);
log.info("****************SentinelServiceMain8401 启动 ************ ");
}
}
sentinel 采用懒加载方式 。
流控规则
资源名 唯一名称 默认请求路径
针对来源 Sentinel 可以针对调用者限流 填写微服务名 默认 default 不区分来源
阈值类型 /单机阈值
QPS (每秒请求的数量) 当调用该api的qps 达到阈值的时候进行限流
线程数 : 当调用该api的线程数达到阈值的时候 进行限流
流控模式
直接 api达到限流的直接限流
关联 当关联的资源达到阈值时。 就限流自己,当A关联了B , B 达到阈值的之后就限流自己
链路 只记录链路上的流量指定资源从入口资源进来的流量。 如果达到阈值就限流 api级别针对来源
流控效果
快速失败 直接失败。 抛异常
Warm up 冷加载因子。 默认时3,公式阈值除3(默认3), 经过预热时长后才会达到的阈值。 100 /3 = 33 慢慢升上来 预热时长我们配置 4秒
排队等待 匀速排队让请求 匀速通过。 这个阈值类型只能是qps,阈值必须是设置为qps 均匀排队 方式会严格控制请求的时间间隔。 让请求以均匀的速度通过 。 对应漏斗算法。
降级规则
RT
平均响应时间: 当1s内持续进入5个请求,对应时刻的平均响应时间均超过阈值 毫秒那么在接下来的时间窗口 之内。 对这个方法的调用都自动熔断。
/**
* 主要测试降级 ---- RT
* @return
*/
@GetMapping("/testC")
public String testC(){
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "------ testC -----" ;
}
配置:类型 RT RT 200毫米 时间窗 4 s
如果QPS大于5, 并且平均响应时间大于200ms, 在接下来4s钟无法访问,之后恢复。
异常比例
当资源的每秒请求量>=5,并且每秒异常总数占通过率的比值超过阈值。 就引入降级状态在接下来的时间窗口之内对这个方法都进行自动返回。 异常比例 0.0 1.0 代表 0% 100%
异常数
当资源近1分钟的异常超过我们设定阈值之后进行熔断。 注意统计时间窗口分钟级别。 若 小60s 择结果熔断后仍可能在进入熔断。
热点key限流
异常数据可以不可自定义 Blocked by Sentinel (flow limiting)
@GetMapping("/testHotykey")
@SentinelResource(value = "testHotykey",blockHandler = "deal_testHotykey")
public String testHotykey(
@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value = "p2",required = false) String p2){ return "------- testHotykey ------- "; } public String deal_testHotykey(String p1, String p2, BlockException e){
return "-------- deal_testHotykey 兜底了---------";
}
系统规则
LOAD 自适应 : 系统的load 1 作为一个启发的指标。 进行自适应系统保护。 当系统load1 超过设定的其法制。 cpu cores * 2.5
RT 当单台机器上所有入口流量的平均rt 达到阈值触发系统保护。 单位是毫米。
线程数 当单台机器上所有的入口的流量的并发线程达到我们阈值的时候触发系统保护
入口 QPS 当单台机器的素偶u的入口的流量达到qps 触发系统保护
CPU 使用率 当系统cpu使用率超过阈值就马上触发系统保护
不合适 使用危险 一个竹竿打死了一片人
规则持久化
一旦我们重新启动机器。 sentinel规则消息。 生成环境种需要配置的规则进行持久化。
将限流的规则保存在nacos上
引入pom
<!-- sentinel-datasource-nacos 后续持久化用 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
改yml
编写json
[
{
"resource": "/rateLimit/byUrl",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
resource 资源名
limitApp 来源应用
grade 阈值类型 0 线程数 1 qps
count 阈值数量
strategy 流控模式 0 直接 1 关联 2 链路
controlBehavior 流控效果 0 快速失败 1 预热 2 排队等待
clusterMode 是否是集群
最新文章
- Ehlib安装方法有窍门
- sql语句查询数据库表结构信息
- JDK和Tomcat的安装与配置
- 同时连接多台Android设备进行Monkey Test
- iOS常见内存泄漏解决
- HTML与CSS入门——第十章 创建用于Web上的图像
- 【MongoDB数据库】MongoDB 命令入门初探
- 【LeetCode】Flatten Binary Tree to Linked List
- 测试word 2013发布blog
- ZOJ1654 Place the Robots
- 简单了解下java中的堆、栈和方法区。
- vs2013安装及opencv3.0的配置
- django,flask接口初试
- Android app 性能优化的思考--性能卡顿不好的原因在哪?
- MVVM 简化的Messager类
- CentOS7安装OpenStack(Rocky版)-02.安装Keyston认证服务组件(控制节点)
- torch7入门(安装与使用)
- Spyder clear variable explorer from memory
- 2018.07.03 POJ 2653 Pick-up sticks(简单计算几何)
- oracl中的大数据类型clob
热门文章
- pycharm恢复删除文档与查询修改前数据
- Django批量插入(自定义分页器)
- 关于ckPlayer 视频加密那些事
- 使用.NET开发搭建OpenAI模型的中间服务端
- uniapp 微信小程序-点击图片放大图片
- Spring IOC官方文档学习笔记(一)之IOC容器概述
- vue3学习第一天
- 主题 1 The Shell
- npm 启动项目报错 Cannot find module &#39;\@babel\compat-data\data\corejs3-shipped-proposals&#39;,解决办法
- 通过this引用成员方法-类的构造器