java web 限流_Javaweb应用使用限流处理大量的并发请求详解

在web应用中,同一时间有大量的客户端请求同时发送到服务器,例如抢购、秒杀等。这个时候如何避免将大量的请求同时发送到业务系统。

第一种方法:在容器中配置最大请求数,如果大于改请求数,则客户端阻塞。该方法有效的阻止了大量的请求同时访问业务系统,但对用户不友好。

第二种方法:使用过滤器,保证一定数量的请求能够正常访问系统,多余的请求先跳转到排队页面,由排队页面定时发起请求。过滤器实现如下:

public class ServiceFilter implements Filter {

private static final int MAX_COUNT = 20;

private AtomicInteger filterCount = 0;

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

System.out.println("before"+filterCount);

if(filterCount > MAX_COUNT) {

//请求个数太多,跳转到排队页面

request.getRequestDispatcher("index.jsp").forward(request, response);

} else {

//请求个数加1

filterCount.incrementAndGet();

chain.doFilter(request, response);

//访问结束,请求个数减1

filterCount.decrementAndGet();

}

}

此种方式的实现就是限流。可以参考RateLimiter的令牌桶限流策略的实现。

public class RateLimiterUtils {

private static Logger logger = LoggerFactory.getLogger(RateLimiterUtils.class);

private static final ConcurrentHashMap resourceLimitMap =

new ConcurrentHashMap();

/**

* 限流

* @param resource 需要限流的对象的标识

* @return true表示得到了许可,没有达到限流阀值,false表示得不到许可,达到了限流阀值。

* @author: hejinen

* @date:2016年10月19日 上午11:08:49

*/

public static boolean rateLimit(String resource) {

RateLimiter limit = getRateLimit(resource);

return limit.tryAcquire();

}

/**

* 获取某个需限流对象的RateLimiter,如不存在则创建新的

* @param resouce 需要限流的对象标识

*/

public static RateLimiter getRateLimit(String resource) {

RateLimiter limit = resourceLimitMap.get(resource);

if(limit == null) {

synchronized(RateLimiterUtils.class) {

limit = resourceLimitMap.get(resource);

double qps = getQpsByResource(resource);

if(limit == null) {

limit = RateLimiter.create(qps);

resourceLimitMap.put(resource, limit);

LoggerUtil.info(RateLimiterUtils.class, "create rate limiter for key:{0},QPS:{1}", resource,qps);

}

}

}

return resourceLimitMap.get(resource);

}

}

总结

以上就是本文关于Javaweb应用使用限流处理大量的并发请求详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:javaweb设计中filter粗粒度权限控制代码示例、Javaweb项目session超时解决方案、Javaweb使用cors完成跨域ajax数据交互等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Java Web计算器的实现过程: 1. 首先创建一个JSP页面,用于显示计算器界面。在该页面中,需要有一些按钮,如数字、运算符、清除、等于等。 2. 创建一个JavaBean类,用于处理计算器的逻辑。在该类中,需要定义一些成员变量,如操作数1、操作数2、运算符等,以及一些方法,如加、减、乘、除等。 3. 在JSP页面中,使用`<jsp:useBean>`指令引用JavaBean类,并通过`<jsp:setProperty>`指令设置JavaBean类的属性。 4. 在JSP页面中,使用`<% %>`标签引用JavaBean类中的方法,用于处理用户的操作。例如,当用户点击加号按钮时,调用JavaBean类中的加法方法。 5. 最后,使用`<%= %>`标签输出计算结果。 下面是一个简单的Java Web计算器的代码实现: Calculator.jsp: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.example.bean.CalculatorBean" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Calculator</title> </head> <body> <h1>Calculator</h1> <form method="post"> <table> <tr> <td colspan="4"><input type="text" name="result" value="${calculatorBean.getResult()}" /></td> </tr> <tr> <td><input type="button" value="7" onclick="document.forms[0].result.value += '7'" /></td> <td><input type="button" value="8" onclick="document.forms[0].result.value += '8'" /></td> <td><input type="button" value="9" onclick="document.forms[0].result.value += '9'" /></td> <td><input type="button" value="+" onclick="document.forms[0].operator.value = '+'" /></td> </tr> <tr> <td><input type="button" value="4" onclick="document.forms[0].result.value += '4'" /></td> <td><input type="button" value="5" onclick="document.forms[0].result.value += '5'" /></td> <td><input type="button" value="6" onclick="document.forms[0].result.value += '6'" /></td> <td><input type="button" value="-" onclick="document.forms[0].operator.value = '-'" /></td> </tr> <tr> <td><input type="button" value="1" onclick="document.forms[0].result.value += '1'" /></td> <td><input type="button" value="2" onclick="document.forms[0].result.value += '2'" /></td> <td><input type="button" value="3" onclick="document.forms[0].result.value += '3'" /></td> <td><input type="button" value="*" onclick="document.forms[0].operator.value = '*'" /></td> </tr> <tr> <td><input type="button" value="0" onclick="document.forms[0].result.value += '0'" /></td> <td><input type="button" value="C" onclick="document.forms[0].result.value = ''" /></td> <td><input type="submit" value="=" /></td> <td><input type="button" value="/" onclick="document.forms[0].operator.value = '/'" /></td> </tr> <tr> <td colspan="4"><input type="hidden" name="operator" /></td> </tr> </table> </form> </body> </html> ``` CalculatorBean.java: ```java package com.example.bean; public class CalculatorBean { private double operand1; private double operand2; private String operator; private double result; public CalculatorBean() { } public double getOperand1() { return operand1; } public void setOperand1(double operand1) { this.operand1 = operand1; } public double getOperand2() { return operand2; } public void setOperand2(double operand2) { this.operand2 = operand2; } public String getOperator() { return operator; } public void setOperator(String operator) { this.operator = operator; } public double getResult() { return result; } public void setResult(double result) { this.result = result; } public void add() { result = operand1 + operand2; } public void subtract() { result = operand1 - operand2; } public void multiply() { result = operand1 * operand2; } public void divide() { result = operand1 / operand2; } } ``` 在以上代码中,我们通过`<jsp:useBean>`指令引用了CalculatorBean类,并使用`<jsp:setProperty>`指令设置了CalculatorBean类的属性。在表单提交时,我们通过JavaScript获取到用户的操作数和运算符,然后调用相应的JavaBean方法处理计算逻辑,最后通过`<%= %>`标签输出计算结果。 希望这篇文章能够帮助你实现一个简单的Java Web计算器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值