请求限流
新增限流规则,单机的QPS限制为6,1000次请求100s完成,只有60%通过,符合预期
响应的错误信息为,
线程隔离
限流可以降低服务器压力,尽量减少因并发流量引起的服务故障的概率,但并不能完全避免服务故障。一旦某个服务出现故障,我们必须隔离对这个服务的调用,避免发生雪崩。
比如,查询购物车的时候需要查询商品,为了避免因商品服务出现故障导致购物车服务级联失败
现在测试当cart查询请求过多,查询item商品模拟耗时慢,导致cart服务tomcat资源耗尽了
需要注意的是,默认情况下SpringBoot项目的tomcat最大线程数是200,允许的最大连接是8492,单机测试很难打满。
所以我们需要配置一下cart-service模块的application.yml文件,修改tomcat连接:
server:
port: 8082
tomcat:
threads:
max: 50 # 允许的最大线程数
accept-count: 50 # 最大排队等待数量
max-connections: 100 # 允许的最大连接
1.在查询items,sleep(500ms),模拟耗时,此时调用cart修改服务耗时正常
查询item异常(耗时久)
2.此时开启并发,对购物车进行查询,修改购物车和查询也变得很慢了
3.对get:/carts线程访问数量减少到5,减少tomcat压力。
这样限制完后对其他请求服务提供了保护,但是查询的效果变差了。
Fallback
fallback就是线程隔离后,失败的请求进行友好响应,直接把商品信息返回null
1.创建ItemClientFallbackFactory,实现FallbackFactory接口
@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {
@Override
public ItemClient create(Throwable cause) {
return new ItemClient() {
@Override
public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
log.error("查询商品失败!",cause);
return CollUtils.emptyList();
}
@Override
public void deductStock(List<OrderDetailDTO> items) {
log.error("扣减商品失败!",cause);
throw new RuntimeException(cause);
}
};
}
}
2.注册到spring中管理
@Bean
public ItemClientFallbackFactory itemClientFallbackFactory(){
return new ItemClientFallbackFactory();
}
3.配置到Feign客户端
进行测试,添加流控规则
此时就没有错误请求了,是直接给调用item客户端返回的异常修改为返回emptyList。
服务熔断
这个的作用是给一个规则,判断这个服务是否正常,如果不正常,就直接不调用这个服务直接熔断。从而减少资源的浪费。
思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
对于商品服务这种不太健康的接口,我们应该停止调用,直接走降级逻辑,避免影响到当前服务。也就是将商品查询接口熔断。当商品服务接口恢复正常后,再允许调用。这其实就是断路器的工作模式了。