简易版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.抽象的基类:
处理的响应类:
2. 按servlet的方法抽象出来基类:
3. 其中一个子类:
4. 模拟tomcat:
读取定义的servlet路径和类,将servlet初始化到容器中。
完成初始化,开始监听端口,并处理请求:
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搞起的主要内容,如果未能解决你的问题,请参考以下文章
springboot学习入门简易版一---springboot2.0介绍