当前位置: 首页 > wzjs >正文

违规网站开发 开发者如何规避风险英文seo公司

违规网站开发 开发者如何规避风险,英文seo公司,珠海百度seo,php网页开发我们在java项目开发中,如何设置服务器最大负载,过了服务器承受范围之后,提示用户稍后重试,避免 服务器无法提供正常服务 如何设置服务器负载比如:最大线程数,等待数量等,请看:springtomcat 用户…

我们在java项目开发中,如何设置服务器最大负载,过了服务器承受范围之后,提示用户稍后重试,避免
服务器无法提供正常服务
如何设置服务器负载比如:最大线程数,等待数量等,请看:spring+tomcat 用户每次发请求,tomcat 站在线程的角度是如何处理用户请求的,spinrg的bean 是共享的吗?

在Spring Boot微服务中,可以通过监控Tomcat线程池状态实现流量控制,当请求数超过阈值时通知用户等待情况。

1. 核心实现类 - Tomcat线程池监控与响应

import org.apache.tomcat.util.threads.ThreadPoolExecutor;
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;@Component
public class RequestThrottlingFilter extends OncePerRequestFilter implements ApplicationListener<ContextRefreshedEvent> {// 配置参数(可放入application.properties)private static final int MAX_THREADS = 200;       // Tomcat最大线程数private static final int QUEUE_CAPACITY = 100;    // 等待队列容量private static final int ALERT_THRESHOLD = 80;    // 触发通知的阈值(%)private ThreadPoolExecutor tomcatThreadPool;private final AtomicInteger waitingRequests = new AtomicInteger(0);@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {// 获取Tomcat线程池实例Optional.ofNullable(event.getApplicationContext().getWebServer()).filter(ws -> ws instanceof TomcatWebServer).map(ws -> (TomcatWebServer) ws).map(ws -> ws.getTomcat().getConnector().getProtocolHandler().getExecutor()).filter(exec -> exec instanceof ThreadPoolExecutor).ifPresent(exec -> tomcatThreadPool = (ThreadPoolExecutor) exec);}@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {waitingRequests.incrementAndGet(); // 进入等待计数try {// 检查线程池状态if (isSystemOverloaded()) {int queuePosition = waitingRequests.get();sendBusyResponse(response, queuePosition);return;}filterChain.doFilter(request, response);} finally {waitingRequests.decrementAndGet(); // 完成处理,减少计数}}private boolean isSystemOverloaded() {if (tomcatThreadPool == null) return false;int activeThreads = tomcatThreadPool.getActiveCount();int queueSize = tomcatThreadPool.getQueue().size();// 计算系统负载率double loadFactor = (activeThreads + queueSize) * 100.0 / MAX_THREADS;return loadFactor >= ALERT_THRESHOLD || queueSize >= QUEUE_CAPACITY;}private void sendBusyResponse(HttpServletResponse response, int queuePosition) throws IOException {response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());response.setContentType("application/json");String jsonResponse = String.format("{\"status\": 429, \"message\": \"系统繁忙,当前等待人数:%d,请稍后重试\"}", queuePosition);response.getWriter().write(jsonResponse);response.getWriter().flush();}
}

2. 配置Tomcat参数(application.yml)

server:tomcat:max-threads: 200     # 最大工作线程数max-connections: 1000 # 最大连接数accept-count: 100    # 等待队列长度

3. 注册过滤器(可选,Spring Boot自动注册)

@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<RequestThrottlingFilter> throttlingFilter(RequestThrottlingFilter filter) {FilterRegistrationBean<RequestThrottlingFilter> registration = new FilterRegistrationBean<>(filter);registration.setOrder(Ordered.HIGHEST_PRECEDENCE); // 最高优先级return registration;}
}

工作原理解释:

  1. 线程池监控

    • 通过ContextRefreshedEvent获取Tomcat线程池实例
    • 实时监控:activeCount(活跃线程) + queue.size()(等待请求)
  2. 流量控制逻辑

    系统负载率 = (活跃线程数 + 等待队列长度) / 最大线程数 * 100%
    触发条件:负载率 ≥ 阈值 或 等待队列满
    
  3. 用户通知机制

    • 使用AtomicInteger计数器跟踪实时等待人数
    • 返回429状态码(Too Many Requests)
    • 响应示例:{"status":429, "message":"系统繁忙,当前等待人数:85,请稍后重试"}

4. 高级优化建议:

// 在sendBusyResponse方法中添加重试建议
private void sendBusyResponse(HttpServletResponse response, int queuePosition) throws IOException {// 计算建议重试时间(按每请求50ms估算)long waitTimeMs = queuePosition * 50;String suggestTime = waitTimeMs > 1000 ? (waitTimeMs/1000) + "秒后" : "片刻后";String jsonResponse = String.format("{\"status\":429, \"message\":\"系统繁忙,您前面还有%d人等待\", " +"\"suggestion\":\"建议%s重试\", \"retry_after\":%d}", queuePosition, suggestTime, waitTimeMs);// 添加标准重试头response.setHeader("Retry-After", String.valueOf(waitTimeMs/1000));response.getWriter().write(jsonResponse);
}

5. 客户端处理建议:

  1. 前端收到429响应时:
    • 显示友好提示:系统繁忙,您前面还有XX人等待
    • 根据retry_after字段设置倒计时重试按钮
    • 使用指数退避策略:首次2秒后重试,失败则4秒、8秒…

注意事项:

  1. 性能影响

    • 使用AtomicInteger计数器无锁竞争,性能损耗可忽略
    • 避免在过滤器中执行阻塞操作
  2. 阈值设置建议

    • 生产环境推荐值:ALERT_THRESHOLD = 75-85
    • 公式:max_threads = (平均响应时间(ms) * QPS) / 1000
  3. 集群环境扩展

    • 需结合Redis分布式计数器
    • 使用Redisson的RAtomicLong替代AtomicInteger

此方案能在不影响核心业务的情况下,当系统压力过大时提供友好的用户提示,有效防止服务雪崩。

http://www.dtcms.com/wzjs/768627.html

相关文章:

  • 网站设计集团腾讯广告投放平台官网
  • 无锡网站制作启航建立企业网站价格
  • 怎么看国外设计网站西安网站seo诊断
  • 可以看设计的网站有哪些网站建设教学廊坊
  • 上海信息技术做网站网页美工软件
  • 网站首页 如何设置网址短链接在线生成免费
  • 重庆营销网站建设提高网站排名
  • 农业服务网站建设方案网站建设动态页面修改删除
  • 济南网站建设外包公司哪家好施工企业如何节约人力成本
  • 阿里指数官方网站微信小程序云开发收费标准
  • 企业名录网站 优帮云免费空间凡科
  • 服装商城网站建设方案做网站大图片
  • 天津网站优化哪家好连云港关键字优化预订
  • 电子商务网站设计原则重庆市招标投标综合网
  • 鲜花网站建设方案网站规划与建设课程
  • 数字资产交易网站开发wordpress媒体库现实不全
  • 电子商务网站开发 微盘下载常州网站建设要多少钱
  • 喀什住房和城乡建设局网站如何做国际网站首页
  • 邢台移动网站建设公司天桥网站建设
  • 启动门户网站建设传奇一条龙
  • 哪个公司的网站做得好河南省建筑劳务信息网
  • 企业为什么做网站系统长沙麓谷网站建设
  • c2c网站的特点及主要功能软文投稿平台有哪些
  • 如何布置网站想自己在家做外贸网站
  • 网站设计建设合同网站定制建设公司
  • 怀化网站建设设计比较好的源码网站
  • 有哪些是做二手的网站与pos平台互补和集成的企业解决方案
  • 山东省建设教育集团网站首页装饰工程公司排名
  • 上小学网站建设淘宝网首页
  • 网站建设销售技巧做茶叶网站的目的和规划