Web 容器、HTTP 服务器 、Servlet 容器区别与联系

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

  首先浏览器发起 HTTP 请求像早期的时候只会请求一些静态资源这时候需要一个服务器来处理 HTTP 请求并且将相应的静态资源返回。

  这个服务器叫 HTTP 服务器。

  简单点说就是解析请求然后得知需要服务器上面哪个文件夹下哪个名字的静态文件找到返回即可。

请添加图片描述

  而随着互联网的发展交互越发得重要单纯的静态文件满足不了需求。

  业务变得复杂需要我们编写代码来处理诸多业务。

  需要根据 HTTP 请求调用不同的业务逻辑来响应但是我们的业务代码不能跟 HTTP 服务器耦合起来。

  总不能在 HTTP 服务器的具体实现里面来做判断到底需要调用哪个业务类吧

  这就把非业务和业务强相关了。

  所以需要做一层抽象将 HTTP 的解析和具体的业务隔离。

请添加图片描述

  本质上的需求就是根据 HTTP 请求找到对应的业务实现类然后执行逻辑再返回。

  而业务千千万所以需要规定一个接口所以业务类都实现这个接口这样才好对接。

  这就是接口的含义就像 USB。

  这个接口就是 Servlet当然这是最狭义的解释。

  Servlet 其实是 Server Applet全称 Java Servlet指的是用Java 编写的服务端程序。

  其实指代的是实现 Servlet 接口的那些业务类。

  这就是 Servlet 的由来。

  而 Servlet 容器其实就是管理和加载这些 Servlet 类的拿到 HTTP 请求之后找到对应的 Servlet 类这就是 Servlet 容器要做的事情。

  看到这是不是觉得还能再抽一层因为这好像也和具体的业务实现没关系

  是的还能抽一层。

  没必要把 Servlet 容器做的事情和具体的业务耦合起来业务反正照着 Servlet 接口实现就行这样 Servlet 容器就可以加载它和管理它。

请添加图片描述

  把请求和哪个 Servlet 对应关系也抽象出来就是 web.xml 了咱们在配置里面告诉 Servlet 容器对应关系即可。

  图中的业务实现其实对应的就是我们平常的 war 包这就是业务和 Servlet 容器的解耦。

  想必你也听过 Servlet 规范其实 Servlet 接口和 Servlet 容器这一整套包括目录命名啊啥的合起来就叫 Servlet 规范。

  所有相关的中间件按照 Servlet 规范实现我们也按 Servlet 规范来实现业务代码这样我们就能在不同场景选择不同的 Web 中间件。

  反正规范的目的就是为了对接方便减少对接成本。

  至此 HTTP 服务器、Servlet 、Servlet 容器想必都清晰了。

请添加图片描述

  而 Web 容器其实就是 HTTP 服务器 + Servlet 容器因为单单 Servlet 容器没有解析 HTTP 请求、通信等相关功能。

  所以把 Tomcat、Jetty 等实现包含了 HTTP 服务器和 Servlet 容器的功能称之为 Web 容器。

  从我们的分析一层一层的剥离一层一层的抽象相信你对 Web 有了更进一步的认识我再画个 Tomcat 的分析图应该就很清晰了。

  从上面的一步步分析可以看出其实架构的设计就是一系列相关的抽象。

  先是抽象出 HTTP 服务用来通信和解析协议。

  再因为业务的复杂为了不和 HTTP 服务耦合又抽象了一层 Servlet。

  由 Servlet 加载和管理 Servlet 来控制请求转发到指定的 Servlet 实现类。

  然后我们安心的开发业务即可。

  因为抽象所以灵活易扩展比如现在是 HTTP1.1 服务可以换成 HTTP 2。

  现在用 Tomcat 来作为 Servlet 容器也可以换成 Jetty。

  现在用原生的实现 Servlet 来做业务也可以换成 SpringMVC。

  随意变更因为都抽象出来了就很好替换只要遵循约定的接口实现即可。


  参考文章地址https://www.cnblogs.com/yescode/p/14099868.html

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 服务器