专栏首页搬砖记录手写服务器笔记记录与tomcat相关笔记(无源码)

手写服务器笔记记录与tomcat相关笔记(无源码)

目录

1. 前言

阅读之前,请先理解以下概念:

  • web服务器:如tomcat,它是web应用的载体。由于我们平时老是说“客户端与服务端进行交互”,然后容易误以为我们写的web应用就是服务器,这种理解是错误的。web服务器相当于一个容器,装载着我们写的web应用,与浏览器进行交互的是web服务器,处理逻辑的是我们的web应用。
  • webApp(web应用):
  • servlet:web应用中处理业务逻辑的类(或者说处理request返回response的类)
  • HTTP:这个自行百度,主要理解三次握手、请求与响应

2. 逻辑推导

从已有知识推导服务器逻辑: start–>

  1. 浏览器与服务器直接通过HTTP协议进行数据传输==》
  2. HTTP协议分为请求报文和响应报文,浏览器发送请求报文,服务器返回响应报文==》
  3. 请求报文中关键数据包括:请求路径(统一资源定位符),请求体(发送的数据包);响应报文中关键数据包括:响应体(响应的数据包)==》
  4. 所以,大概逻辑如下==》
  5. 浏览器通过IO流发送请求资源路径和请求数据包给服务端==》
  6. 服务端获取IO流,得到请求路径和请求数据包==》
  7. 根据请求路径找到对应的请求资源,并处理响应的数据包==》
  8. 将上述过程的结果封装到响应体中,通过IO流返回。

end<–

3. 关键问题:

  1. 如何利用统一资源定位符找到对应的服务器资源?
  2. IO流传输的是字节流,html页面最终是怎样渲染到浏览器的?

回答: 如果是静态的html页面,则直接根据uri找到服务器中的静态页面,然后通过IO流返回。 直接返回的是字符串,这个解析过程,只要带上对应的响应协议,浏览器会自动渲染。

4. servlet

问:如果是xxx.html结尾,显然只需要读取服务器html资源然后响应即可,但是对于?username=xx&psw=xxx这样的uri,需要业务逻辑来处理,该如何解决?

答:显然,这种写法也是HTTP规范之一,因此,也可以通过遵守规范而正确解析。服务器只做转发功能(web),而逻辑功能,则是服务来完成(webApp),这类webApp,就是servlet。(server Applet的缩写) 关键逻辑如下:

  1. 浏览器发送的/project/login?username=xx&psw=xxx,到达web服务器
  2. web服务器根据HTTP协议,首先解析uri问号的前半部分/project/login,然后建立uri与servlet的映射关系(这就是web.xml的由来),并通过解析web.xml反射得到servlet,然后解析得到参数键值对并封装到request中(同时初始化响应的response请求头,避免由webApp来拼接响应头协议)
  3. 通过servlet.service(request,response)调用webapp中的servlet,执行相关的do方法。

关键知识: 这里面有两大规范:HTTP协议、servlet规范 HTTP协议制定浏览器与服务器之间的交互规则,体现在HTTP请求与HTTP响应上。 servlet规范制定了服务器与webApp之间的交互规则。体现在:webApp的servlet实现servlet规范,然后在web服务器中,直接通过servlet接口调用具体实现。

5. 问题思考

为什么需要web.xml文件(或者相关的注解)? web.xml文件中定义了uri与servlet的映射关系,如果不在配置文件中定义,那就只能在web服务器启动类的解析过程中预先定义所有uri与servlet的关系映射,这显然不可能。只能通过反射获取。

6. 图解与说明

  1. 端口开发JDK 的ServerSocket已提供相应方法
  2. socket网络编程主要包含端口监听、请求监听、解析输入流得到请求、构建输出流进行响应。
  3. 线程调度器即线程池,每个请求都会从池中拿一个线程进行执行,可以用ExecutorService创建
  4. servlet需要解析web.xml文件得到url与servlet映射关系,然后解析浏览器传递过来的url,用反射获取对应的servlet进行执行。

7. 优化

servlet缓存池

如果解析完url之后就直接根基web.xml中的映射关系反射获取servlet,这样必定出现servlet爆炸(每个相同的url都会创建一个servlet)。 因此需要建立一个servlet缓存池。 逻辑: 维护一个url:servlet缓存池。 请求过来之后,先从池中拿,拿不到,再反射创建一个,同时放到池中。

servlet线程安全

对于相同的url,servlet都是同一个,即会有多个用户同时使用同一个servlet对象的情况,自然可能存在线程安全。

一般只用一种方式进行规范,那就是不要定义会变化的servlet的成员变量。 非要使用的话,请用TheadLocal

8. 应用联想

springmvc的dispatchservlet也是一个servlet,只不过他不直接处理请求与响应,而是做请求与响应的中转站。


springboot中的web开发,controller也有线程安全问题,原因与servlet相同,解决办法也相同。

9. 推荐阅读

TomCat架构分析

Tomcat连接器

Tomcat配置文件详解(配置文件基本展现了Tomcat的架构,建议重视)

servlet工作原理

另外,还可以打开百度图片,搜索 “tomcat架构图” “tomcat时序图” 等图。

10. 关键信息记录

  1. 在初始化过程中,tomcat大量使用观察者模式,以便于实现链式初始化
  2. 容器层级之间基于pipeline(管道)和valve(阀门)的形式处理request(类似过滤器、责任链)相当于提供了可在每层容器之间设置过滤器的功能
  3. tomcat没有遵循双亲委派类加载机制,而是自定义类加载顺序。原因:tomcat本身是一个java程序(即便它运行着多个不同的java项目),如果还是按照双亲委派,则多个不同的项目可能发生冲突,比如说不同项目中相同的类名。因此,基本要求就是不同的webapp应该用各自不同的类加载器。 (延伸阅读

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记

    该JavaWeb学习笔记源自zcc同学,非常善于总结知识的一位同学,可以收藏起来慢慢学习

    ChinaManor
  • 博客目录及索引,欢迎指导交流

    一转眼发现博客里积累了不少文章,特别是这两年开始发现写博客也是一种提升自己技术能力的方法。这就和写代码一样,因为会让大脑思考,时间长了就会留下记忆。所以很多的高...

    用户1105954
  • 服务假死问题解决过程实记(一)——问题发现篇

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    剑影啸清寒
  • Linux大牛分享7道面试题告诉你秒收 offer 的技巧

    笔者其实没有想到去面试,只是在智联上更新了一下简历,就陆陆续续接到很多猎头的邮件和电话,实在是没准备好要去面试,就推掉了几家公司的面试了。正因为笔者也很久没有面...

    小小科
  • Docker+Jenkins+GIT+Tomcat实战持续化集成

    | Docker-server | 172.20.6.20 |Docker宿主机

    KaliArch
  • 备战金三银四!面试准备事项与面试题总结已撸完(Linux运维篇)!快要爆肝了。。。

    “金三银四”指的是在3月、4月,尤其是3月是应届生求职、也是在职人员跳槽到更满意职位的黄金时期。求职、跳槽,说到底,本质上就是职场人员和工作职位匹配的过程,一个...

    民工哥
  • tomcat学习|tomcat源码结构

    提到tomcat,相信大家都不陌生,只要是搞web开发的,老师总会让我们把应用打成war包,然后再丢到tomcat的webapp里面,然后就可以用ip:port...

    微笑的小小刀
  • Spring Boot应用部署到Tomcat中无法启动问题

    完事儿打完包以后, 放到我本地Tomcat上跑了跑,发现没问题。但是部署到服务器上的Tomcat以后, 发现无法启动,错误如下:

    凯哥Java
  • 实战中遇到的sql小姿势

    笔者有个好习惯就是喜欢做笔记,即使当时没来来得及弄懂,之后也可以慢慢研究。今天就选取出一些之前所做笔记里的个人认为比较有趣的,关于 SQL 注入/ SQL 方面...

    信安之路
  • Apache Ant 实现自动化部署

    Apache Ant 实现自动化部署 这篇文章帮你解决下列问题: 源码获取,源码编译,处理配置文件,应用部署,远程备份,部署回撤,启动,服务器状态,停止 ---...

    netkiller old
  • IntelliJ IDEA 2019从入门到上瘾 图文教程

    如果说IntelliJ IDEA是一款现代化智能开发工具的话,Eclipse则称得上是石器时代的东西了。

    用户1516716
  • 32天高效突击:开源框架+性能优化+微服务架构+分布式,面阿里获P7(脑图、笔记、面试考点全都有)

    今年似乎因为疫情影响,时间过得特别快,对于需要跳槽换工作的人来,更觉得有些突然,似乎金三银四和金九银四还没开始准备好,就匆匆过去。加上今年的大环境不佳,所以大部...

    Java程序猿阿谷
  • Centos7 Tomcat9 安装笔记

    有两个月没更新博客,部分原因是这两月的工作一直没写Spark程序,而是在写前端,所以虽然期间一直想写但是没有想出从哪方面入手。后端框架用的SpringBoot,...

    董可伦
  • Java架构技术怎么学,做到年薪50W会这几点就够了

    他们的共同特点是:10 年以上的工作经验,在大公司当过螺丝钉,也在创业公司做过技术 leader,有过一两段不算成功的创业经历。

    Java架构
  • 【阅读清单】系列文章清单列表(三)

    分布式系统学习 https://cloud.tencent.com/developer/inventory/2708

    云加社区
  • windoes服务器搭建Jenkins和部署war项目

    背景介绍:由于工作原因,小编申请新的服务器环境需要搭建Jenkin环境部署项目,新的服务器上项目部署用的环境和依赖基本上为零,小编没有求助运维的帮助,想尝试一下...

    沁溪源
  • 用Docker搭建微信公众号

    此文我将带大家用Docker来搭建一个微信公众号的后台,主要涉及Docker里运行JavaWeb的技术,一起来做这个有意思的事情吧! (如果你对Docker了解...

    小小科
  • IDEA 新建 Spring MVC 工程项目与 SpringMVC 运行流程

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    剑影啸清寒
  • Servlet基础——快速了解什么是Servlet

    Tanyboye

扫码关注云+社区

领取腾讯云代金券