当前位置 博文首页 > JavaEdge全是干货的技术号:肝了一个通宵!给学弟学妹们看的Java

    JavaEdge全是干货的技术号:肝了一个通宵!给学弟学妹们看的Java

    作者:[db:作者] 时间:2021-08-22 18:19


    早期Web应用主要用于浏览新闻等静态页面,HTTP服务器(比如Apache、Nginx)向浏览器返回静态HTML,浏览器负责解析HTML,将结果呈现给用户。

    随着互联网的发展,已不满足于仅浏览静态页面,还希望通过一些交互获取动态的结果,因此也就需要机制能让HTTP服务器调用服务端程序。

    于是Sun公司发布Servlet,相当于运行在服务端的Java小程序,但Servlet无main方法,无法独立运行,因此必须把它部署到Servlet容器,由容器来实例化并调用Servlet。

    而Tomcat和Jetty就是一个Servlet容器。为了方便使用,它们也具有HTTP服务器的功能,因此Tomcat或Jetty就是一个“HTTP服务器 + Servlet容器”,也叫Web容器:

    • HTTP 服务器负责处理 HTTP 请求(接收请求、返回请求结果)
    • Servlet 容器负责把 HTTP 请求分派给对应的 servlet 程序处理,并把结果返回给 HTTP 服务器

    其他应用服务器比如JBoss和WebLogic,它们不仅仅有Servlet容器的功能,也包含EJB容器,是完整的Java EE应用服务器。从这个角度看,Tomcat和Jetty算是一个轻量级应用服务器。

    微服务时代的我们更喜欢稳定、轻量级的应用服务器,最流行的就是SpringBoot应用程序用内嵌方式运行Servlet容器。

    什么叫内嵌方式运行servlet容器呢?
    你的程序比如SpringBoot直接调用Web容器的提供的API去创建一个Web容器(HTTP服务器和Servlet容器),同时你的程序注册一个Servlet到Servlet容器中,比如SpringMVC的DispatcherServlet,这样请求到达时,Servlet容器负责调用你的Servlet。

    轻量级,是因为在微服务下,把一个大而全的单体应用,拆分成一个个功能单一的微服务,在这个过程中,服务数量大大增加,但为减少资源消耗,并且降低部署成本,我们希望运行服务的Web容器也是轻量级,Web容器本身应消耗较少的内存和CPU资源,并且由应用本身启动一个嵌入式的Web容器,而不是通过Web容器来部署和启动应用,这样可以降低应用部署的复杂度。

    因此轻量级的Tomcat和Jetty就是一个很好的选择,并且Tomcat它本身也是Spring Boot默认的嵌入式Servlet容器。最新版本Tomcat和Jetty都支持Servlet 4.0规范。

    该怎么学?

    操作系统基础

    像Java这种高级语言,其实都是对操作系统API的封装,上层应用包括Web容器都是通过操作系统来工作的,因此掌握相关的操作系统原理是我们深刻理解Web容器的基础。

    对于Web容器来说,操作系统方面你应该掌握它的工作原理,比如

    • 什么是进程
    • 什么是内核
    • 什么是内核空间和用户空间
    • 进程间通信的方式
    • 进程和线程的区别
    • 线程同步的方式
    • 什么是虚拟内存
    • 内存分配的过程
    • 什么是I/O、什么是I/O模型、阻塞与非阻塞的区别、同步与异步的区别
    • 网络通信的原理
    • OSI七层网络模型以及TCP/IP、UDP和HTTP协议。

    推荐阅读名著《UNIX环境高级编程》。

    Java语法、JVM基础

    推荐的经典书籍有

    • 《Java核心技术》
    • 《Java编程思想》
    • 《Java并发编程实战》
    • 《深入理解Java虚拟机 第三版》

    Java Web开发基础

    学习一些通用的设计原则和设计模式。了解Web的工作原理,同时提高你的设计能力,注重代码的质量。我的建议是可以从学习Servlet和Servlet容器开始。
    Web框架的本质是,开发者在使用某种语言编写Web应用时,总结出的一些经验和设计思路。很多Web框架都是从实际的Web项目抽取出来的,其目的是用于简化Web应用程序开发。

    我以SpringMVC框架为例,给你讲讲Web框架是怎么产生的。Web应用程序的开发主要是完成两方面的工作。

    • 设计并实现类,包括定义类与类之间的关系,以及实现类的方法,方法对数据的操作就是具体的业务逻辑
    • 类设计好之后,需要创建这些类的实例并根据类与类的关系把它们组装在一起,这样类的实例才能一起协作完成业务功能

    就好比制造一辆汽车,汽车是由零件组装而成的。第一步是画出各种零件的图纸,以及定义零件之间的接口。第二步把把图纸交给工厂去生产零件并组装在一起。因此对于Web应用开发来说,第一步工作是具体业务逻辑的实现,每个应用都不一样。而第二步工作,相对来说比较通用和标准化,工厂拿到零件的图纸,就知道怎么生产零件并按照零件之间的接口把它们组装起来,因此这个工作就被抽取出来交给Spring框架来做。

    Spring又是用容器来完成这个工作的的,容器负责创建、组装和销毁这些类的实例,而应用只需要通过配置文件或者注解来告诉Spring类与类之间的关系。

    我们把Spring的IOC容器理解为一个工厂,这个工厂负责创建组装你的Bean。
    但是我们怎么向IOC容器中放入Bean呢?可能通过配置文件或者注解或者其他方式,于是容器除了做创建、组装Bean的工作,还需要去做解析配置文件或者注解的工作,于是把容器换个说法,叫应用上下文

    但是容器的概念不是Spring发明的,最开始来源于Servlet容器,并且Servlet容器也是通过配置文件来加载Servlet的。你会发现它们的“元神”是相似的,在Web应用的开发中,有一些本质的东西是不变的,而很多“元神”就藏在“老祖宗”那里,藏在Servlet容器的设计里。

    Spring框架就是对Servlet的封装,Spring应用本身就是一个Servlet,而Servlet容器是管理和运行Servlet的,因此我们需要先理解Servlet和Servlet容器是怎样工作的。

    总结

    当前web技术涉及的知识包括这样几层,
    第一层:核心规范相当于宪法,主要包括servlet规范、网络协议等;
    第二层:主流技术支撑相当于各类法律,包括java语言、各类中间件等;
    第三层:基于各行业的业务应用和框架,相当于行政法规地方法规。
    规范是基础,具体实现可以用java也可以用python等等,行业应用和框架更是可以百花齐放。

    我们的学习一定是从具体技术入手,从规范和体系结构统筹安排,最后再落实到实现。是一个自底向上再由上向下的一个过程,也是一个由薄到厚再由厚到薄的过程。

    cs