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

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

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

  这个服务器叫 HTTP 服务器。

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

image.png

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


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


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


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


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


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

image.png

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


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


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


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


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


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


 这就是 Servlet 的由来。


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


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


 是的,还能抽一层。


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

image.png

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


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


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


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


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


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

 而 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

相关文章
|
11月前
|
移动开发 数据挖掘 开发者
服务器发送事件(SSE)在现代Web开发中的关键作用
服务器发送事件(SSE)是HTML5标准协议,用于服务器主动向客户端推送实时数据,适合单向通信场景。相比WebSocket,SSE更简洁高效,基于HTTP协议,具备自动重连、事件驱动等特性。常见应用场景包括实时通知、新闻推送、数据分析等。通过Apipost等工具可轻松调试SSE,助力开发者构建高效实时Web应用。示例中,电商平台利用SSE实现秒杀活动通知,显著减少延迟并简化架构。掌握SSE技术,能大幅提升用户体验与开发效率。
|
6月前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
651 2
|
8月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
428 18
|
8月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
429 14
|
10月前
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
480 69
|
7月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
7月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
531 0
|
10月前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
522 35
|
10月前
|
JSON API 数据安全/隐私保护
使用curl命令在服务器上执行HTTP请求
总的来说,curl是一个非常强大的工具,它可以让你在命令行中发送各种类型的HTTP请求。通过学习和实践,你可以掌握这个工具,使你的工作更加高效。
954 30