简易版Tomcat搞起

Posted 胡钦振

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简易版Tomcat搞起相关的知识,希望对你有一定的参考价值。


简易版Tomcat

tomcat的基本功能是开放web端口,接受http请求,处理http响应,而servlet,filter,listener是基于这些来实现具体逻辑的,tomcat的简化版设计如何实现呢?(案例参考Netty4核心原理与手写RPC实战)

基于传统的io来实现:

  • 在properties文件里面定义好所有的servleturl和处理的servlet。

  • 然后在基于这些特定请求完成对应的加载映射方法。

  • 可以按以下步骤来逐步实现:

1. 请求响应抽象类

2. servlet基类和具体实现子类

3. tomcat监听端口和请求,并完成处理。

1.抽象的基类:

处理的响应类:

简易版Tomcat搞起

2. 按servlet的方法抽象出来基类:

简易版Tomcat搞起

3. 其中一个子类:

简易版Tomcat搞起

4. 模拟tomcat:

读取定义的servlet路径和类,将servlet初始化到容器中。

简易版Tomcat搞起

完成初始化,开始监听端口,并处理请求:

简易版Tomcat搞起

 http请求处理方法:

完成上述过程,简单的web模型就搭建完成,用浏览器或者postman测试下请求输出,会得到一个定义好的输出结果的。

  • 这里几乎都是同步响应的,如果是异步处理,效果会好很多。

  • 这里面引申关于同步&异步的区别:

  • 客户端在与服务端交互的情况下,如果客户端必须要等待服务端完成返回才能继续其它任务,那就是同步,如果客户端在发起服务端请求后,可以执行别的任务,并且只需服务端给个回调通知啥的,用来更新状态之类的就是异步。

  • 总结是对消息结果的获取是主动发起的还是被动通知,如果是请求方主动发起,一直等待应答(是同步阻塞的),如果是不断轮询查看消息结果的是(同步非阻塞)。

  • 关于阻塞&非阻塞

  • 其实更多说的是I/O操作,我们调用函数后,等待函数返回结果,这个当前线程是挂起还是运行,如果是运行,意味着可以处理其它任务,是同步非阻塞的,如果是挂起,那就是同步阻塞的。

这个在网络里面的i/o模型里面体现比较明显:

    总结同行的准确评论:简单总结一下:同步:主动菜是否准备好(光等或轮询) 异步:服务员在菜准备好的时候通知你 阻塞:没准备好之前什么事都不干 非阻塞:没准备好之前干其他事

    所以最后的总结图对应的是:

  • 阻塞I/O:

  • 同步阻塞 非阻塞I/O:

  • 同步(轮询)非阻塞 I/O多路复用:

  • 同步阻塞(不过可以同时监听多个socket状态,效率高了) 信号驱动I/O:

  • 异步非阻塞 异步I/O:

  • 真正意义上的异步非阻塞(上面的都只是数据准备阶段,这个是数据准备和数据处理阶段) 回到上面模型,这里会有几个地方可以改进:

  • 1. 这里是基于bio的,如果请求量过大,搞不好会崩掉的,真实的tomcat里面做了很多的优化。

  • 2. 引入了netty之后,可以借助netty的api来完成接受请求,nio的效率远超过bio的。


以上是关于简易版Tomcat搞起的主要内容,如果未能解决你的问题,请参考以下文章

手动实现一个简易版 tomcat(yet)

如何手写一个简易版SpringMVC

springboot学习入门简易版一---springboot2.0介绍

学生管理系统(SSM简易版)总结

springboot学习入门简易版五---springboot2.0整合jsp(11)

简易图书管理系统