Java之QPS控制

 

什么是QPS 
QPS:queries per second :每秒的请求数

QPS控制的目的 
防止恶意请求,增加服务端负载

以下代码可以保证在任意时间段(1s)内,请求数不超过100。


import java.util.Arrays;
import java.util.concurrent.TimeUnit;

/**
 *使用数组存储每个请求到来的时间,前10次请求顺利通过,并填满数组。
 * 后续请求到来时,判断当前时间是否比数组中最早的时间晚1s,未晚,则打回,
 * 晚则替换数组中最早的值。循环。
 */
public class QpsControlUtil {
    /**
     * 接受请求窗口
     */
    private Long[] accessWindow;
    /**
     * qps限制次数
     */
    private static final int limit = 10;
    /**
     * 指针位置
     */
    private int curPosition;
    /**
     * 时间间隔
     */
    private static final long period = TimeUnit.SECONDS.toMillis(1);

    private final Object lock = new Object();

    private static class SingletonHolder {
        private static final QpsControlUtil SINGLETON = new QpsControlUtil();
    }

    /**
     * 单例方法入口
     * @return 单例类
     */
    public
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Sentinel是一款针对分布式系统的高可用流量控制框架,可以在多个维度上实现流量控制,包括QPS、线程数、CPU使用率等。在Java项目中使用Sentinel需要以下步骤: 1. 引入Sentinel依赖 在pom.xml中引入Sentinel依赖: ``` <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>x.y.z</version> </dependency> ``` 其中,x.y.z表示版本号,可以根据需要选择最新的版本。 2. 配置Sentinel规则 在Java项目中使用Sentinel需要定义规则,可以在项目中通过代码或配置文件定义规则。例如,使用注解方式定义规则: ``` @SentinelResource("hello") public String hello() { return "Hello World"; } ``` 这里定义了一个名为“hello”的Sentinel规则,表示对“hello”接口进行流量控制。可以根据需要修改规则的参数,例如设置QPS阈值、异常比例等。 3. 配置Sentinel数据源 Sentinel的流量控制规则需要存储在数据源中,可以选择本地文件或Nacos等云原生平台中存储规则。在Java项目中需要配置数据源,例如: ``` -Dcsp.sentinel.dashboard.server=localhost:8080 -Dcsp.sentinel.api.port=8080 -Dproject.name=my-project ``` 其中,csp.sentinel.dashboard.server表示Sentinel的控制台地址,csp.sentinel.api.port表示Sentinel的API端口号,project.name表示项目名称。 4. 启动Sentinel 在Java项目中启动Sentinel需要进行以下步骤: 1. 创建Sentinel配置类,例如: ``` @Configuration public class SentinelConfig { @PostConstruct public void init() { // 初始化Sentinel initFlowRules(); } private void initFlowRules() { // 定义Sentinel规则 List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(); rule.setResource("hello"); rule.setCount(10); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rules.add(rule); // 加载Sentinel规则 FlowRuleManager.loadRules(rules); } } ``` 这里定义了一个名为“hello”的Sentinel规则,表示对“hello”接口进行流量控制。 2. 启动Spring Boot应用程序。在启动时,Sentinel会自动加载规则并启动流量控制。 以上是Java项目使用和配置Sentinel的基本步骤。需要注意的是,Sentinel的使用和配置需要根据实际情况进行调整和优化,以达到最佳的流量控制效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值