雪崩问题:微服务调用中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩
解决雪崩问题的常见方式有四种:
超时处理:设定超时事件,请求超过一定时间没有响应就返回错误消息,不会无休止等待(但是当释放的速度没有请求的速度快则还是会引发雪崩)
舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离
熔断降级:由断路器统计业务执行的异常比例:如果超出阈值则会熔断该业务,拦截访问该业务的一切请求
流量控制:限制业务访问的QPS,避免服务因流量过高而故障(预防雪崩)
下载:sentinel-dashboard-1.8.1.jar
安装到非中文目录
运行:java -jar sentinel-dashboard-1.8.1.jar
打开浏览器访问:localhost:8080
账号密码都是sentinel
如果要修改Sentinel的默认端口
java -jar sentinel-dashboard-1.8.1.jar --server.port=8090
例子:使用之前的项目cloud-demo
1、引入依赖:
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
2、配置地址
cloud:
sentinel:
transport:
dashboard: localhost:8090 #sentinel控制台地址
3、多次访问order-service返回控制台查看

设置QPS不能超过5

使用:Jmeter测试每秒发送10个请求

在添加限流规则时,点击高级选项,可以选择三种流控模式:
使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是有限支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流
案例:添加接口
@GetMapping("/query")
public String queryOrder(){
return "查询订单成功";
}
@GetMapping("/update")
public String updateOrder(){
return "修改订单成功";
}
当update的QPS超过5时,对queue做限流


此时update没有影响,而queue受到影响
例如有两条请求链路:
只希望统计从/test2进入到/common的请求
案例:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流
在OrderService中添加方法
public void queryGoods(){
System.out.println("查询商品");
}
@GetMapping("/query")
public String queryOrder(){
orderService.queryGoods();
System.out.println("查询订单");
return "查询订单成功";
}
@GetMapping("/save")
public String saveOrder(){
orderService.queryGoods();
System.out.println("新增订单");
return "查询订单成功";
}
这样就形成了两条链路
Sentinel默认只标记Controlller中的方法为资源,如果要标记其他方法,需要利用注解@SentinelResource
@SentinelResource("goods")
public void queryGoods(){
System.err.println("查询商品");
}
Sentinel默认会将Controlller方法做context整合,导致链路模式失效,需要修改配置文件
sentinel:
transport:
dashboard: localhost:8090 #sentinel控制台地址
web-context-unify: false #关闭context整合
给good添加流控规则

设置每秒发送4个请求
query中受到限制只能有2个请求

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
快速失败:达到阈值后,新的 请求会被立即拒绝并抛出FlowException异常。是默认的处理方式
warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。
排队等待:让所有请求按照先后次序排队执行,两个请求的间隔不能小于指定时长
给order-service添加warm-up

QPS=5,意味着每200ms处理一个队列的请求,timeout=2000ms,意味着预期等待超过2000ms的请求会被拒绝
给/order/{order}这个资源设置QPS为10,最大等待时间为5秒

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值
案例:给/order/{orderId}这个资源添加热点参数限流,规则如下:
默认的热点参数规则是每1秒请求量不超过2
给102这个参数设置例外:每1秒请求量不超过4
给103这个参数设置例外:每1秒请求量不超过10
热点参数限流对默认的SpringMVC资源无效
需要使用 @SentinelResource注解
@SentinelResource("hot")
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单并返回
return orderService.queryOrderById(orderId);
}
