1.Sentinel安装:
Sentinel-dashboard限流
官方下载地址: https://github.com/alibaba/Sentinel/releases
服务启动命令: java -jar -Dserver.port=1111 sentinel-dashboard-1.6.0.jar
浏览器访问控制台: http://localhost:1111
登录名和密码未指定,默认为 sentinel 和 sentinel
注意:只有1.6.0及以上版本才有这个登录页面。默认用户名和密码都是sentinel。对于用户登录的相关配置可以在启动命令中增加下面的参数来进行配置:
- Dsentinel.dashboard.auth.username=sentinel: 用于指定控制台的登录用户名为 sentinel;
- Dsentinel.dashboard.auth.password=123456: 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel
- Dserver.servlet.session.timeout=7200: 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;
- Dserver.port=1111:配置端口
2.sentinel使用
2.1、在pom.xml配置文件中加入sentinel依赖
<!-- sentinel 服务限流 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.2、修改yml配置文件,添加sentinel服务控制台地址
spring:
clound:
sentinel: # 服务限流
transport:
dashboard: localhost:1111 #sentinel限流服务地址
2.3、资源限流
//Sentinel为我们提供了 @sentinelResource 注解标记需要限流的资源,修改UserController,代码如下:
//提示:这里通过@SentinelResource的value属性为资源取名为 “getById” ,后续我们可以根据该资源名来进行限流。
//同时这里通过 blockHandler 属性我配置了一个限流降级方法,即当“getById”资源触发限流了会调用blockHandler指向的降级方法返回拖地数据,
//不至于抛出默认的限流异常信息给客户端(一串英文用户也看不懂) ,需要注意的是:降级方法要和被限流的方法参数一致,然后加上 BlockException异常对象。
@GetMapping(“user/{id}”)
@SentinelResource(value = "getById" ,blockHandler = "exceptionHanlder")
public User getById(@PathVariable Long id){
System.out.println("读取到云端配置:notify = " + notify);
return new User(id, "zs:" + id ,"我是zs");
}
//限流与阻塞处理:参数要和被降级的方法参数一样,后面多一个BlockException参数;返回值也一样
public User exceptionHanlder(@PathVariable Long id, BlockException ex){
ex.printStackTrace();
System.out.println("限流了.....");
return new User(-1L,"限流了","限流了");
}
//当然,也可以通过 blockHandlerClass 属性把降级方法写在一个专门的类中,如:
//@SentinelResource(value="user",blockHandler="exceptionHandler",blockHandlerClass=BlockExceptionUtils.Class)
public User getById(@PathVariable Long id){
}
2.4、在sentinel-dashboar控制台 进行 流量规则 配置
启动应用 springcloudalibaba-user-server-1010 ,然后通过浏览器访问 http://localhost:1010/user/11 ,
然后登录Sentinel控制台,在“实时监控”列表中可以看到资源的相关监控信息的
QPS (Query Pre Second): 每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。
1.QPS说明:
QPS即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
2.每秒查询率
因特网上,经常用每秒查询率来衡量域名系统服务器的机器的性能,即为QPS。
对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。
3.计算关系:
QPS = 并发量 / 平均响应时间
并发量 = QPS * 平均响应时间
**4.原理:**每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间。
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS) 。
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器 。
5.qps举例分析:
每天300w PV 的在单台机器上,这台机器需要多少QPS?
( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)。
一般需要达到139QPS,因为是峰值。
问:如果一台机器的QPS是58,需要几台机器来支持?
答:139 / 58 = 3
3.Sentinel流控模式
3.1.直接:
Sentinel默认的流控处理就是【直接->快速失败】,QPS达到阈值,当前资源直接失败。在流控规则中配置如下:
3.2.关联
关联的资源达到某个阈值,限流自己, 如:限流的资源是/user/delete ,关联的资源是/user/list,当/user/list达到阈值,限流user/delete ,举例: 支付并发太高,可以限制下单的流量
3.3.链路
限流线路调用链路的入口,如 /user/list 资源中 调用了 /dept/list ,对/dept/list添加限流,当/dept/list达到阈值,其实限流的是/user/list,因为他是访问的入口
关联和链路的区别:
关联:关联的资源达到某个阈值,限流自己;当别人达到峰值,限制自己
当/dept/list达到阈值,其实限流的是/user/list,因为他是访问的入口
关联和链路的区别:
关联:关联的资源达到某个阈值,限流自己;当别人达到峰值,限制自己
链路:限流线路调用链路的入口,限流别人,当自己达到峰值,限制别人
|