熟悉 Tomcat与Netty,请求处理流程,NIO 底层原理,线程池优化。掌握Nginx基本配置,进行流量限制与转移分发,配合OpenResty编写Lua脚本实现业务极高并发。并熟练掌握JMeter

发布时间:2026/9/16 11:35:44

熟悉 Tomcat与Netty,请求处理流程,NIO 底层原理,线程池优化。掌握Nginx基本配置,进行流量限制与转移分发,配合OpenResty编写Lua脚本实现业务极高并发。并熟练掌握JMeter Tomcatserver对应整体tomcat服务内置一个叫 卡特玲娜的 service 。会有多个connector连接负责处理不同的服务端口如http80 s 443。在向里面会有多个host 、 每个虚拟host对应一个文件夹默认webapps每个host里有又会有多个servlet处理不同的post和get请求内置filter过滤器所以request里面可以拿到不同的host和servleturi。默认server.tomcat.max-threads200server.tomcat.max-connections8912server.tomcat.accept-count100server.tomcat.max-http-form-post-size2MBserver.tomcat.min-spare-threads10server.tomcat.connection-timeout60000maxConnections、maxThreads、acceptCount 参数accept-count最大等待数官方文档的说明为当所有的请求处理线程都在使用时所能接收的连接请求的队列的最大长度。当队列已满时任何的连接请求都将被拒绝。accept-count的默认值为100。详细的来说当调用HTTP请求数达到tomcat的最大线程数时还有新的HTTP请求到来这时tomcat会将该请求放在等待队列中这个acceptCount就是指能够接受的最大等待数默认100。如果等待队列也被放满了这个时候再来新的请求就会被tomcat拒绝connection refused。maxThreads最大线程数每一次HTTP请求到达Web服务tomcat都会创建一个线程来处理该请求那么最大线程数决定了Web服务容器可以同时处理多少个请求。maxThreads默认200肯定建议增加。但是增加线程是有成本的更多的线程不仅仅会带来更多的线程上下文切换成本而且意味着带来更多的内存消耗。JVM中默认情况下在创建新线程时会分配大小为1M的线程栈所以更多的线程异味着需要更多的内存。线程数的经验值为1核2g内存为200线程数经验值2004核8g内存线程数经验值800。maxConnections最大连接数官方文档的说明为这个参数是指在同一时间tomcat能够接受的最大连接数。对于Java的阻塞式BIO默认值是maxthreads的值如果在BIO模式使用定制的Executor执行器默认值将是执行器中maxthreads的值。对于Java 新的NIO模式maxConnections 默认值是10000。对于windows上APR/native IO模式maxConnections默认值为8192这是出于性能原因如果配置的值不是1024的倍数maxConnections 的实际值将减少到1024的最大倍数。如果设置为-1则禁用maxconnections功能表示不限制tomcat容器的连接数。maxConnections和accept-count的关系为当连接数达到最大值maxConnections后系统会继续接收连接但不会超过acceptCount的值。我们可以把tomcat比做一个火锅店流程是取号、入座、叫服务员可以做一下三个形象的类比acceptCount 最大等待数可以类比为火锅店的排号处能够容纳排号的最大数量排号的数量不是无限制的火锅店的排号到了一定数据量之后服务往往会说已经客满。maxConnections 最大连接数可以类比为火锅店的大堂的餐桌数量也就是可以就餐的桌数。如果所有的桌子都已经坐满则表示餐厅已满已经达到了服务的数量上线不能再有顾客进入餐厅了。maxThreads最大线程数可以类比为厨师的个数。每一个厨师在同一时刻只能给一张餐桌炒菜就像极了JVM中的一条线程ToB tomcat不用调总共也没几个qps会从前端页面访问tomcat最小10 最大200白天用的繁忙的时候扩容最大值200。晚上就10节约cpu资源也没请求不用考虑并发。ToC 业务一定要动最大200太小了一般配置为4c8g 放到800而且最小最大都一样不要让它扩缩容因为本来服务接口就是专门给Toc接口调用的没有闲置队列设置5000以上连接数5w。当然这个800需要压测得出来就是压最核心的一系列业务场景接口请求的qps压力直接拉满1wqps请求去压开始的时候最大默认200之后得出一个平均的响应的tps之后慢慢的调大tomcat线程池看它的平均tps会不会上去要是增多了就继续加它会到达一直极限就是再增加也不会变大的TPS了那么就不需要动了说明性能瓶颈已经不在tomcat了其他的中间件压测调优思路也一样就是基于现有的TPS慢慢的优化参数。Netty1.Reactor主线程MainReactor对象通过select监听连接事件收到事件后通过Acceptor处理连接事件2.当Acceptor处理连接事件后MainReactor将连接分配给SubReactorsubreactor将连接加入到连接队列进行监听并创建handler进行各种事件处理3.当有新事件发生时subreactor就会调用对应的handler处理4.handler通过read读取数据分发给后面的worker线程处理5.worker线程池分配独立的worker线程进行业务处理并返回结果6.handler收到响应的结果后再通过send将结果返回给client7.Reactor主线程可以对应多个Reactor子线程即MainRecator可以关联多个SubReactor8.开发者可以自定义ChannelPipeline创建多个自定义的Handler类似拦截器NIOBIO阻塞式io每一个客户端读写事件都需要服务器一个线程去处理。NIO非阻塞io一个服务器端线程可以同时处理多个客户端连接请求。selector模式服务端线程主动轮询客户端线程是否有io消息没有则返回-1有就进行处理。epoll模式服务端线程不需要主动轮询由操作系统发送io事件会自动的告诉服务线程去处理请求。Nginx基本配置http{# 定义upstream服务器组 upstream backend_servers{# 使用server指令定义后端服务器 server backend1.example.com;server backend2.example.com weight2;# 权重设置为2表示此服务器接收的请求是其他服务器的两倍 server192.168.1.1backup;# 作为备份服务器当其他非备份服务器都不可用时才会被使用 server192.168.1.2down;# 当前标记为down不会被调度到请求 # 还可以添加其他参数如#keepalive32;# 保持连接到上游服务器的空闲连接数# 负载均衡算法可选默认是轮询#least_conn;# 使用最少连接的服务器#ip_hash;# 使用IP哈希实现会话持久性#hash$request_uri;# 根据请求URI的哈希值选择服务器#hash$remote_addr;# 根据客户端IP的哈希值选择服务器# 其他参数和指令...}server{listen80;server_name your_domain.com;location/{# 引用upstream服务器组进行代理 proxy_pass http://backend_servers;# 其他配置...proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}#...其他配置...}#...其他http块配置...}nginx -t 验证配置文件是否正确nginx -s reload 不重启刷新配置Lua脚本EVAL “return tonumber(ARGV[1]) tonumber(ARGV[2])” 参数个数 参数1 参数2SCRIPT LOAD “return tonumber(ARGV[1]) tonumber(ARGV[2])”返回一个固定的hash值不会变EVALSHA hash 2 3 4启动时就把 SCRIPT LOAD 带上这样就可以防止重启redis丢失lua脚本的情况了。keepalived一台为主服务器MASTER一台为备份服务器BACKUP但是对外表现为一个虚拟IP自定义检测脚本进行探活。Haproxy类似nginx 7层负载均衡。OpenRestyLuaNginx
延伸阅读

更多相关文章

2026/9/16 11:35:44

跨平台SSH管理工具electerm实战指南

1. 跨平台终端管理的核心痛点作为长期使用MacBook进行开发的工程师,我经常需要连接各类服务器和虚拟机环境。传统工作流中,macOS自带的Terminal虽然稳定,但在多会话管理、文件传输、密码记忆等方面存在明显短板。而Windows平台常用的Xshell、…

2026/9/16 11:30:43

企业微信二次开发联系人管理实践

在企业服务和私域运营中,客户资产的沉淀与管理是核心诉求。通过自动化接口接管联系人数据,不仅能打破信息孤岛,还能与企业内部的 CRM 系统实现无缝对接。 今天,我们将结合 星云企业微信开放平台 的底层逻辑,为大家系统…

2026/9/16 11:30:43

触发器本质解析:从门电路到数字时钟的底层逻辑

1. 为什么“时序逻辑电路也不难”这句话背后藏着太多被忽略的真相你是不是也经历过——翻完《数字电子技术基础》前五章,组合逻辑电路画真值表、化简表达式、搭74LS系列芯片,手到擒来;可一到第六章“时序逻辑电路”,瞬间卡壳&…

2026/9/16 12:30:58

机器人端侧AI选型:MCU与MPU的确定性与吞吐量权衡

1. 为什么机器人开发者最近总在问“该选MCU还是MPU”?上周调试一个室内巡检机器人样机时,我遇到个典型场景:客户要求在电池供电下连续运行72小时,同时完成激光雷达SLAM建图、双目视觉障碍物识别、语音唤醒响应三件事。团队内部立刻…

2026/9/16 12:30:58

SSM+Vue构建青海美食工艺数字化保护平台

1. 项目背景与核心价值民族地区特色美食作为非物质文化遗产的重要组成部分,其制作工艺的数字化保护具有重要的文化传承意义。青海作为多民族聚居区,拥有众多独具特色的传统美食,如牦牛肉干、青稞酒、酸奶等,这些美食的制作工艺往往…

2026/9/16 12:30:58

仓库效率提升:ABC分类与智能优化实战

1. 仓库效率提升的核心痛点解析作为一名在仓储物流行业摸爬滚打十余年的老兵,我见过太多企业陷入"设备崇拜"的误区。每当仓库效率低下时,第一反应就是购买自动化设备、引入高大上的系统。但实际情况是,80%的仓库效率问题都出在最基…

2026/9/16 12:30:58

Python数据库数据高效导出Excel的完整方案

1. 项目背景与核心需求在日常数据处理工作中,我们经常需要将数据库中的大量记录导出到Excel文件进行二次处理或分发。手动逐条导出不仅效率低下,还容易出错。Python作为数据处理领域的利器,配合适当的库完全可以实现自动化批量导出。这个方案…

2026/9/16 12:25:57

STM32F407驱动SL2823 NFC模块:I2C初始化与中断处理实战

简介:这是基于STM32F407驱动捷联微芯SL2823 NFC模块的完整工程,面向嵌入式开发及NFC应用设计人员。工程涵盖GPIO、I2C/SPI接口初始化,SL2823寄存器配置,读卡写卡指令交互,中断服务与异常恢复,以及应用层数据…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码