总结:服务器批量处理http请求的大致流程
- 一·客户端发起请求:可以多个请求同时发送
- 二·Web服务器解析请求(如:Nginx):可以多个请求同时解析
- 三·Servlet容器接收请求(如:tomcat):可以多个请求同时处理
- 四·Servlet初始化(如果需要):
- 五·调用Servlet的service()方法:
- 六·选择适当的HTTP方法处理:
- 七·Servlet处理请求:
- 八·生成响应:
- 九·Servlet容器发送响应:
- 十一·Servlet销毁(如果需要):
- 十二·线程返回到线程池(如果使用):
一·客户端发起请求:可以多个请求同时发送
1.用户通过浏览器访问一个URL,该URL与某个Servlet相关联。
2.浏览器构造一个HTTP请求,请求中包含特定的URL、头部信息、参数等;并将它发送到Web服务器。
二·Web服务器解析请求(如:Nginx):可以多个请求同时解析
1.Web服务器主要作用:请求分发、反向代理、负载均衡器、HTTP缓存服务器,支持静态文件服务,一般不会处理动态请求。
动态请求:比如前端调用某API接口,需要后端服务器运算处理完,再响应给前端报文
静态请求:比如前端调用某API接口,后端直接将某个资源读取返回,不用任何运算。注意:web服务器、servlet容器两者一般都可以称为服务器,如何区分就看具体实际情况了
2.每个服务器都会存在一个,监听指定端口的死循环socket线程,除非服务器关机,这个线程才会停止循环
3.该socket线程每接收到一个http请求,就会从服务器的线程池里面获取一个空闲线程来处理该请求
4.这个新线程接着就会解析请求中的URL路径和参数,然后根据URL映射规则,决定返回哪个静态资源,或者将该http请求继续转发给哪个Servlet容器(如Tomcat、Jetty等)来处理。
三·Servlet容器接收请求(如:tomcat):可以多个请求同时处理
1.Servlet容器主要作用:动态请求的运算处理
2.每个服务器都会存在一个,监听指定端口的死循环socket线程,除非服务器关机,这个线程才会停止循环
3.该socket线程每接收到一个http请求,就会从服务器的线程池里面获取一个空闲线程来处理该请求
4.这个新线程接着就会解析请求中的URL路径和参数,然后根据URL映射规则,找到对应的Servlet对象;并根据请求信息创建HttpServletRequest对象和HttpServletResponse对象,再传递到Servlet对象的service方法里面,然后继续执行service方法
注意:
(1)如果多个URL映射的是同一个servlet程序处理,那么servlet容器会给每个请求分配一个线程进行单独处理;
(2)servlet容器传递给各个线程的servlet对象都是同一个;
(3)servlet容器给每个线程中的同一个servlet对象之service方法,传递的两个参数HttpServletRequest对象和HttpServletResponse对象都是不一样的,这两个对象都是根据http请求报文即时生成的。
(4)这样虽然节省了服务器资源,但这也是造成可能存在高并发的核心原因
(5)因此servlet类中的成员变量要慎重使用,如果存在频繁修改的变量,就尽量不要设置为成员属性,而是设置为方法内的局部变量
四·Servlet初始化(如果需要):
1.如果Servlet实例还没有初始化,容器会调用init()方法进行初始化。这个方法在Servlet的生命周期中只会执行一次。
五·调用Servlet的service()方法:
1.Servlet容器调用Servlet的service()方法,并传递ServletRequest和ServletResponse对象作为参数。
六·选择适当的HTTP方法处理:
1.在service()方法内,Servlet根据HTTP请求的方法(GET、POST等)选择调用适当的doGet()、doPost()等方法。
七·Servlet处理请求:
1.在doGet()、doPost()等方法中,开发者编写具体的业务逻辑来处理请求。这可能涉及到读取参数、执行业务逻辑、访问数据库等。
八·生成响应:
1.Servlet生成一个ServletResponse对象,其中包含要返回给客户端的数据,比如HTML内容。
九·Servlet容器发送响应:
1.Servlet容器将ServletResponse对象传递给Web服务器,然后服务器通过网络将响应发送回客户端。
十一·Servlet销毁(如果需要):
1.如果Servlet容器检测到应用程序正在关闭或者Servlet的生命周期已经结束,它会调用Servlet的destroy()方法,释放资源。
十二·线程返回到线程池(如果使用):
1.处理请求的线程返回到线程池,等待下一个请求。