JAVA WEB 应用开发模式:servlet、tomcat与nginx
- 做web开发,无论CS还是BS架构,都要有server;
- 应用层开发就要有应用层协议的server,如http server、smtp server、ftp server等;
- 传输层开发就会有传输层协议的server,如tcp server,udp server;
- http server最基本的功能是监听服务器的网络端口,接收请求并给予响应;
- 最基本的响应是静态内容,读取后直接返回;
- 为了支持响应动态内容,便有了CGI、WSGI等技术或协议,Servlet(Server Applet )就是一个变种;
- Servlet本质是为了实现请求分发而定义的一套规范,包含 Servlet 接口和 Servlet 容器,还有两种扩展机制 Filter 过滤器和 Listener 监听器。
- 我们把实现了Servlet接口的业务类叫作Servlet,它们运行在容器中。
- Servlet 容器就是所谓 Servlet 引擎,用来加载和管理业务类。容器(Container)中比较有名的有tomcat、jetty、jboss、WebSphere、WebLogic等。
- Servlet 引擎利用Java类载入工具载入一个Servlet,Servlet可以来自一个本地的文件系统、一个远程的文件系统以及网络。载入Servlet后,对其进行初始化。
- Servlet 初始化完成后就可以接收客户端的请求了。每一个来自客户端的请求都被描述成一个ServletRequest对象,Servlet的响应被描述成一个ServletResponse对象,并作为参数传递到service()方法中
- ServletRequest 与 ServletResponse 本质是对通信协议的封装,如 http 协议中的 HttpServletRequest 和 HttpServletResponse
- Servlet 规范并不在乎通信协议是什么,但使用最广泛的是 HTTP 协议,因此规范中内置了 HttpServlet 及其相关类。
- 虽然 Servlet 容器用来管理业务类,但是其实 Servlet 业务类是注册到 ServletContext 接口中的。Servlet容器在启动时会根据配置加载Web应用,为其创建唯一的ServletContext 对象,这个ServletContext 中可能有多个 Servlet。
- Servlet 业务类不直接与客户端通信,也不直接与 HTTP 服务器打交道,而是 HTTP 服务器把请求交给Servlet容器,Servlet容器将请求转发到具体的Servlet。
如下图所示:

- Servlet开发主要就是通过javax.servlet 包提供的类/接口,这个包也不复杂,主要的几个接口和类有(详情可见 javax.servlet 包) :
接口 : RequestDispatcher Servlet ServletConfig ServletContext ServletRequest ServletResponse SingleThreadModel
类 : GenericServlet ServletInputStream ServletOutputStream
异常类 : ServletException UnavailableException
- Spring 中的容器运行在容器中的 ServletContext 中,ServletContext 作为宿主环境。
- Tomcat运行在JVM之上,绑定IP地址并监听TCP端口,同时还包含以下指责:
-
- 管理Servlet程序的生命周期
- 将URL映射到指定的Servlet进行处理
- 与Servlet程序合作处理HTTP请求——根据HTTP请求生成HttpServletResponse对象并传递给Servlet进行处理,将Servlet中的HttpServletResponse对象生成的内容返回给浏览器
- 因为需求的复杂性,有的http server还会提供反向代理、负载均衡等功能,典型如nginx
- 因此tomcat通常它仍然会和Nginx配合在一起使用:
-
- 动静态资源分离——运用Nginx的反向代理功能分发请求:所有动态资源的请求交给Tomcat,而静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器,这样能大大减轻Tomcat的压力。
- 负载均衡,当业务压力增大时,可能一个Tomcat的实例不足以处理,那么这时可以启动多个Tomcat实例进行水平扩展,而Nginx的负载均衡功能可以把请求通过算法分发到各个不同的实例进行处理
servlet 系统说明 https://www.cnblogs.com/haimishasha/p/5609261.html
servlet使用方式参考此文 https://www.cnblogs.com/libingbin/p/5960456.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

浙公网安备 33010602011771号