手写一个简化版Tomcat

作者: 阿里云云栖号 | 来源:发表于2018-08-29 16:03 被阅读482次

Tomcat作为Web服务器深受市场欢迎,有必要对其进行深入的研究。在工作中,我们经常会把写好的代码打包放在Tomcat里并启动,然后在浏览器里就能愉快的调用我们写的代码来实现相应的功能了,那么Tomcat是如何工作的?

一、Tomcat工作原理

      我们启动Tomcat时双击的startup.bat文件的主要作用是找到catalina.bat,并且把参数传递给它,而catalina.bat中有这样一段话:

  Bootstrap.class是整个Tomcat 的入口,我们在Tomcat源码里找到这个类,其中就有我们经常使用的main方法:

    这个类有两个作用 :1.初始化一个守护进程变量、加载类和相应参数。2.解析命令,并执行。

      源码不过多赘述,我们在这里只需要把握整体架构,有兴趣的同学可以自己研究下源码。Tomcat的server.xml配置文件中可以对应构架图中位置,多层的表示可以配置多个:

即一个由 Server->Service->Engine->Host->Context 组成的结构,从里层向外层分别是:

• Server:服务器Tomcat的顶级元素,它包含了所有东西。

• Service:一组 Engine(引擎) 的集合,包括线程池 Executor 和连接器 Connector 的定义。

• Engine(引擎):一个 Engine代表一个完整的 Servlet 引擎,它接收来自Connector的请求,并决定传给哪个Host来处理。

• Container(容器):Host、Context、Engine和Wraper都继承自Container接口,它们都是容器。

• Connector(连接器):将Service和Container连接起来,注册到一个Service,把来自客户端的请求转发到Container。

• Host:即虚拟主机,所谓的”一个虚拟主机”可简单理解为”一个网站”。

• Context(上下文 ): 即 Web 应用程序,一个 Context 即对于一个 Web 应用程序。Context容器直接管理Servlet的运行,Servlet会被其给包装成一个StandardWrapper类去运行。Wrapper负责管理一个Servlet的装载、初始化、执行以及资源回收,它是最底层容器。

比如现在有以下网址,根据“/”切割的链接就会定位到具体的处理逻辑上,且每个容器都有过滤功能。

二、梳理自己的Tomcat实现思路

      本文实现效果比较简单,仅供新手参考,大神勿喷。当浏览器访问对应地址时:

实现以上效果整体思路如下:

 1.ServerSocket占用8080端口,用while(true)循环等待用户发请求。

 2.拿到浏览器的请求,解析并返回URL地址,用I/O输入流读取本地磁盘上相应文件。

 3.读取文件,不存在构建响应报文头、HTML正文内容,存在则写到浏览器端。

三、实现自己的Tomcat

工程文件结构和pom.xml文件:

1.HttpServer核心处理类,用于接受用户请求,传递HTTP请求头信息,关闭容器:

2.创建Request类,获取HTTP的请求头所有信息并截取URL地址返回:

3.创建Response类,响应请求读取文件并写回到浏览器

四、读者可以自己做的优化,扩展的点

      1.在WEB_INF文件夹下读取web.xml解析,通过请求名找到对应的类名,通过类名创建对象,用反射来初始化配置信息,如welcome页面,Servlet、servlet-mapping,filter,listener,启动加载级别等。

      2.抽象Servlet类来转码处理请求和响应的业务。发过来的请求会有很多,也就意味着我们应该会有很多的Servlet,例如:RegisterServlet、LoginServlet等等还有很多其他的访问。可以用到类似于工厂模式的方法处理,随时产生很多的Servlet,来满足不同的功能性的请求。

      3.使用多线程技术。本文的代码是死循环,且只能有一个链接,而现实中的情况是往往会有很多很多的客户端发请求,可以把每个浏览器的通信封装到一个线程当中。

还能做什么扩展,实现什么功能,读者可以在评论中与我探讨。

本文作者:我叫刘半仙

阅读原文

本文为云栖社区原创内容,未经允许不得转载。

相关文章

  • 手写一个简化版Tomcat

    Tomcat作为Web服务器深受市场欢迎,有必要对其进行深入的研究。在工作中,我们经常会把写好的代码打包放在Tom...

  • 手写一个简化版Tomcat

    Tomcat作为Web服务器深受市场欢迎,有必要对其进行深入的研究。在工作中,我们经常会把写好的代码打包放在Tom...

  • 手写tomcat

    手写tomcat+servlet https://my.oschina.net/960823/blog/28778...

  • 手写Tomcat

    需求分析 根据Tomcat的基本功能分析,基本需求包括: 监听端口,接受外部请求 多线程并发处理多个请求 解析HT...

  • 手写一个tomcat

    tomcat是十分常用的轻量级的web服务容器,其原理其实不复杂,本质就是在jdk的socket,输入输出流,反射...

  • 手写SpringBoot (简化版本)

    对于SpringBoot的总结 其实对于SpringBoot来说,它做的事情主要有几个点 整合了SpringMVC...

  • 手写一个简易版的tomcat

    @[TOC] 手写一个简易版的tomcat 前言 使用tomcat的时候当浏览器输入url之后,开始发送http请...

  • 手写一个简化版的EventBus

    EventBus相信很多人都很熟悉,虽然现在谷歌官方出了JetPack来替代,但EventBus的一些设计思路还是...

  • 手写实现简化版LRU

    通过LinkedHashMap实现简化版LRU算法 LinkedHashMap提供了很好的方法,便于我们快速实现一...

  • 基于netty手写Tomcat

    netty 简介 Netty一个基于NIO的客户、服务器端的编程框架 1.环境准备 maven依赖

网友评论

本文标题:手写一个简化版Tomcat

本文链接:https://www.haomeiwen.com/subject/kazhwftx.html