【玩转SpringBoot】翻身做主人,一统web服务器


寄人篱下的日子

一直以来受传统影响,我们的web工程总是打成war包,然后放入tomcat的webapps目录下面。

如下图01:

当tomcat启动时,会去解压war包,然后运行web工程。这大家都非常熟悉了。

用一个抽象的图形表示,就是这样子。如下图02:

在一个大大的tomcat里面,有一个小小的war包,貌似没有地位啊。

不知道有没有人思考过这两个问题:

1)Spring在哪里?

2)tomcat和war包是如何联系上的呢?

对于第一个问题,因为我们的web工程是使用spring-web开发的,所以Spring在war包里呢。

Spring蜷缩在小小的war包里,生活在tomcat的屋檐下,完全一副威风不起来样子。

这简直是叔可忍,婶也不能忍啊。

对于第二个问题,tomcat和war包在代码上没啥关系。它们其实是通过Java Web的规范联系上的。

这个规范是这样的,在某一个jar包的META-INF目录下,必须要有一个services目录。

在这个目录下必须有一个以javax.servlet.ServletContainerInitializer为名字的文件。

显然这个文件名称是一个接口,所以文件内容就是这个接口的实现类。

拿Spring来说,这个任务自然就落在了spring-web-xxx.jar这个jar包里啦。

如下图03:

因此,tomcat会扫描web工程里的所有jar包,找到这个文件并读出里面的接口实现类,然后去调用这个实现类。

这样一来,启动流程从tomcat沿着这个实现类就来到了web工程里面了,web工程自然就被启动起来了。

对于Spring来说,这个实现类一定是由spring-web来提供了,如下图04:

可以看到Spring唯一能访问的就是ServletContext,因此Spring的整个容器就是在ServletContext里面放着呢。

这就是传统的spring-web工程与tomcat的关系。

Spring就一活脱脱的小弟,被埋在tomcat里面,它不甘心啊。

Spring一心想成为大老虎,无奈只能被当作Hello Kitty,宝宝心里苦啊。

翻过身来成主人

Spring一直努力着、等待着、寻找着、观察着,终于机会来了。

它就是SpringBoot,是它让Spring翻身成了主人,是它让Spring百尺竿头更进一步,掌声响起来。

现在可以用下面这个图形表示,如下图05:

成功实现了“权力反转”,SpringBoot成了老大,把tomcat纳入了麾下。

有时候不得不感慨,真是一念之间,地狱天堂啊。

除此之外,其实SpringBoot更进了一步,它干脆一统了web服务器。

也就是说,它那天看tomcat不爽了,分分钟换成jetty或netty。

原来它只有一席之地,现在却拥有了星辰大海。不要太爽了。

当然,为此呢,它需要付出一些额外劳动,不过这个买卖依然非常划算。

因为以有限的代价,换来了无限的可能。现在它就是启动入口,它想怎么折腾都行。

不得不说,当大哥的感觉真好,如果再有个大嫂,那就更好了,哈哈。

SpringBoot统一web可能还有一个原因,就是要支持响应式web,这样整体看起来更加对称。

抽象几个接口,认真封装一下

实现统一web服务器方案其实就是,抽象几个接口,认真封装一下。真是这样的。

首先,得有个web服务器接口吧,如下图06:

一般的人看到这个接口,心中想的是这个接口好简单啊。

二般的人看到这个接口,心中想的是这个接口抽象程度很高啊,说明它的不同实现之间差异化一定很大。

因为抽象程度低的话,不足以抽象出共性,不足以抹平差异化。

所以接口就是它的不同实现类之间的交集,差异化越大的,它们之间的交集就越小。

看下这个接口的不同实现类,如下图07:

其实就是基于已有的不同web服务器的封装。不同的web服务器,是不同的团队设计开发的,几乎没有什么共性。

但总归都要启动和停止,都要有个端口吧。所以这个接口就是它现在这样子。

差异化很大的东西,它们的创建过程也一定有较大的差异化,此时一般使用工厂去创建,如下图0809:

一个是创建基于Servlet的web服务器,一个是创建基于响应式的web服务器。

这样就实现不同的工厂,来创建不同的web服务器即可。如下图1011:

我们可以看到netty这个web服务器是不支持Servlet的,只支持Reactive。

这就是整个的抽象思路和实现过程,原理很简单,但是实现起来要足够的专业。

就像造车一样,造好了就是汽车,造不好就是拖拉机,虽然都能开,但是一个天上一个地下。

音乐渐起,华灯初上

从一开始spring-web和tomcat靠一个Java Web的规范连在一起。处于非常被动的地位。

到SpringBoot出现带来的成功翻身,把自己变成了启动入口,变成了主体。

不仅可以操作web服务器API,而且还统一了它们。从被动变成了主动地位。

SpringBoot把握住了入口,这就为它开辟了更为广阔的天地,可以放心去追求诗和远方了。

音乐渐起,华灯初上,一切美好才刚刚开始。。。

>>> 玩转SpringBoot系列文章 <<<

【玩转SpringBoot】配置文件yml的正确打开姿势

【玩转SpringBoot】用好条件相关注解,开启自动配置之门

【玩转SpringBoot】给自动配置来个整体大揭秘

【玩转SpringBoot】看似复杂的Environment其实很简单

>>> 品Spring系列文章 <<<

品Spring:帝国的基石

品Spring:bean定义上梁山

品Spring:实现bean定义时采用的“先进生产力”

品Spring:注解终于“成功上位”

品Spring:能工巧匠们对注解的“加持”

品Spring:SpringBoot和Spring到底有没有本质的不同?

品Spring:负责bean定义注册的两个“排头兵”

品Spring:SpringBoot轻松取胜bean定义注册的“第一阶段”

品Spring:SpringBoot发起bean定义注册的“二次攻坚战”

品Spring:注解之王@Configuration和它的一众“小弟们”

品Spring:bean工厂后处理器的调用规则

品Spring:详细解说bean后处理器

品Spring:对@PostConstruct和@PreDestroy注解的处理方法

品Spring:对@Resource注解的处理方法

品Spring:对@Autowired和@Value注解的处理方法

品Spring:真没想到,三十步才能完成一个bean实例的创建

品Spring:关于@Scheduled定时任务的思考与探索,结果尴尬了

>>> 热门文章集锦 <<<

毕业10年,我有话说

【面试】我是如何面试别人List相关知识的,深度有点长文

我是如何在毕业不久只用1年就升为开发组长的

爸爸又给Spring MVC生了个弟弟叫Spring WebFlux

【面试】我是如何在面试别人Spring事务时“套路”对方的

【面试】Spring事务面试考点吐血整理(建议珍藏)

【面试】我是如何在面试别人Redis相关知识时“软怼”他的

【面试】吃透了这些Redis知识点,面试官一定觉得你很NB(干货 | 建议珍藏)

【面试】如果你这样回答“什么是线程安全”,面试官都会对你刮目相看(建议珍藏)

【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)

【面试】一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生(深度好文,建议珍藏)

【面试】如果把线程当作一个人来对待,所有问题都瞬间明白了

Java多线程通关———基础知识挑战

品Spring:帝国的基石

作者是工作超过10年的码农,现在任架构师。喜欢研究技术,崇尚简单快乐。追求以通俗易懂的语言解说技术,希望所有的读者都能看懂并记住。下面是公众号的二维码,欢迎关注!

原文地址:https://www.cnblogs.com/lixinjie/p/playing-springboot-005.html

时间: 2024-08-28 02:55:29

【玩转SpringBoot】翻身做主人,一统web服务器的相关文章

A主机让B主机做它的web服务器

参考这个微博,http://ji123.blog.51cto.com/11333309/1958742 这里centos7的web服务放在RedHat6中. 这里需要设置iptables中nat表的PREROUTING这个链. 在centos7中命令 iptables -t nat -A PREROUTING -d 192.168.0.110 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.2 有时候会将RedHat6的web服务端口设

【玩转SpringBoot】让错误处理重新由web服务器接管

其实web服务器是会处理错误的 在web.xml还是随处可见的年代时(确实有点老黄历了),下面的这些配置应该都不陌生. 根据错误代码处理错误,如下图01: 根据异常类型处理错误,如下图02: 不过我们更加熟悉的应该是SpringMVC的统一异常处理.如下图03: 看到@ControllerAdvice注解和@ExceptionHandler注解都应该很熟悉吧. 处理原理就是在捕获到业务Controller有异常抛出时,根据异常类型来这里找到对应的方法并执行. 可见,整个异常的处理过程都是在Spr

Web服务器开发

服务器是C/S模式的核心,最近在看网络编程的东西,参考了一些书籍,做了一个Web服务器.整体的实现分为四个部分:界面控制.服务流程的实现.HTTP协议的实现.协议的辅助实现部分. 界面控制部分 主窗体设计比较简陋, Web服务器的运行离不开HTTP协议,定义一个类CHttpProtocol,用来实现HTTP协议. class CHttpProtocol { public: HWND m_hwndDlg; SOCKET m_listenSocket; map<CString, char *> m

web服务器、应用服务器、web容器、反向代理服务器区别与联系

我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分. 1. 一文看懂web服务器.应用服务器.web容器.反向代理服务器区别与联系 1.1. Web服务器概念与基本原理 1.1.1. Web服务器的历史 1.1.2. Web服务器工作原理 1.2. Web应用程序容器概念与基本原理 1.2.1. Web应用程序容器的由来 1.2.2. Web应用程序容器

Web服务器、Web容器、Application服务器、反向代理服务器的区别与联系

在Web开发中,经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server).反向代理服务器(Reverse Proxy Server)等容易混淆且不好理解名词.在面试中,这也是经常被问到的.本文介绍对四者的理解.区别与联系. 一.Web服务器(Web Server) 1. Web Server 或者叫 HTTP Server ,Web服务器的基本功能就是提供Web信息浏览服务.接受客户端的请求以及响应.处理Http

vrrp ,网关冗余,浮动路由,pat地址转化,web服务器映射

实验名称:vrry ,网关冗余,浮动路由,pat地址转化,web服务器映射 实验拓扑图: 3.实验目的:1 .使内网可以访问web服务器 -server4 2. 配置vrrp使网关冗余备份,并且链路追踪 ,并且配置浮动静态路由 3 映射内网web服务器,使外网client5可以访问 4.                    ip地址规划 :  内网 :  vlan 1 0  : 192.168.10.1           192.168.10.2 vlan 10的网关: 192.168.10

玩转 SpringBoot 2 快速搭建 | RESTful Api 篇

概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP 协议的Web 接口,需要注意的是它和 HTTP 协议并非绑定关系.我的个人理解就是:通过HTTP协议不同请求方法(GET.POST.PUT.Patch,DELETE)来判断如何操作统一命名的资源,并且通过不同的响应码来知道执行的状态. 关于 RESTful API 具体详细介绍,我推荐阅读下面 3

玩转 SpringBoot 2 之整合 JWT 上篇

前言 该文主要带你了解什么是 JWT,以及JWT 定义和先关概念的介绍,并通过简单Demo 带你了解如何使用 SpringBoot 2 整合?JWT. 介绍前在这里我们来探讨一下如何学习一门新的技术,我个人总结为 RSA. R:read 去读官方文档 . S:search 谷歌或百度先关技术文章或 github 去搜索先关信息. A:ask 可以向技术大牛请教或和自己的同事同学进行探讨. 关于?RSA 仅仅代码个人的学习观点,只是给读者一个不成熟的小建议哈 JWT 介绍 官网介绍如下: What

为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架 由struts2迁移到springMVC,我突然有了一个新的疑问无法得到正确的解释,为什么我们现在做java的web开发,会选择struts2或 者springMVC这样的框架,而不是使用servlet加jsp这样的技术呢?特别是现在我们web的前端页面都是使用velocity这样的模板语 言进行开发,抛弃了jsp,这样的选择又会给我们java的web开发带