SpringBoot学习分享-进阶篇(内置服务器tomcat专篇)

Owen Jia 2018年11月16日 539次浏览

本文衔接SpringBoot基础篇的基础上进行讲解,重点带你深入去了解spring-boot-starter-tomcat组件。

提供http协议服务的应用服务器有很多,如何jetty\jboss等等。我们这里就用tomcat代表这一类http服务器,当然在springboot里面首推tomcat。

传统部署tomcat方式

我回顾传统web项目的服务形式:

  • 1、JAVA webapp形式的项目,最终封包xxx-xx.war。
  • 2、安装应用服务器(这里以tomcat为例),如:tomcat-8.0.5。你需要配置config/server.xml文件,修改端口、线程限制。还有启动分配个内存什么的。
  • 3、把tomcat/webapp目录里面除ROOT外文件全删除,我敢说大多数公司都这么干(特别是线上)。

tomcat是支持多项目服务的但是生产环境大家基本都只部署一个项目。估计到现在还有很多公司是这么干的,但为啥又有很多公司选择在项目里面集成应用服务器呢?难道他们傻不成,而且越来越多的选择这种方式。

tomcat-project

我们试想一下:一个tomcat就部署一个项目服务,他们是1-1的关系,反过来理解如果合成一个起码部署上会方便很多。在微服务领域,tomcat&project合在一起才能叫service。微服务的微是很重要的,就是有超级多的服务和超级多的部署发布流程。

spring-boot-starter-tomcat中tomcat的包都是tomcat官方提供的,包稳定安全是可以保障的。它的依赖包如下:

  • tomcat-embed-core(3M)
  • tomcat-embed-el(240K)
  • tomcat-embed-websocket(250K)
  • javax.annotation-api(29K)

只有tomcat-embed-core是必须有的,其他不是必须的。反而看tomcat服务lib目录下的jar有24个之多,那是因为tomcat本身不单单提供http服务,还提供很多如何project启动管理、账户管理等等功能。在微服务里面很多服务仅仅只需要个http服务就行了,那么tomcat对它来说就太重了。

tomcat-libs

对于微服务来说选择传统tomcat方式部署应用提供服务,tomcat太重且没有发挥它价值。微服务比较适合稳定小巧的http应用服务,能随着服务本身进行定制化配置,这也是为什么很多公司tomcat-project是一对一的关系。我们启动一个tomcat的http服务只要几行代码就行了:

Tomcat tomcat = new Tomcat();
tomcat.setPort(8080);
tomcat.getHost().setAppBase(".");
tomcat.addWebapp("/cgi", getAbsolutePath() + "src/main/webapp");
tomcat.start();
tomcat.getServer().await();

部署模式演变

早期tomcat直接提供服务。网络请求->域名cdn->ip(服务器)->tomcat->project。这种方案还是有不少公司遗留下来的,很传统有年代了现在基本不用。

目前主流结合nginx来做。网络请求->域名cdn->ip(服务器)->nginx->tomcat->project,这种方案很成熟。我注意到这里的nginx再次把tomcat的部分功能给承接了,什么ssl,请求记录什么的。查看tomcat/logs目录你会发现有好几种日志localhost、management等,这些基本不用。

对于开发模式

以前大家都是本地装个tomcat-8.0.xx,在IDE里面配置server。项目测试时选择发布到tomcat里面运行。我们拆解一下这里面具体干嘛了。

  • IDE编译project,再package一个xxx-xx.war。
  • IDE把xxx-xx.war发布到tomcat/webapp目录下。
  • IDE启动tomcat。

每次修改代码都是上面三个步骤再走一遍,IDE比较厉害提供code变动就自动发布(有个勾选勾上就自动走三步)。也就是说每个人都要安装个tomcat还要配置IDE,还有一点就是慢,很慢,虽然IDE一直在优化可tomcat的启动要检查很多环节(因为它重量级啊)就是慢。我们把http服务集成到project里面,通过main方法直接一个java run启动就会快,快太多了。源码编译后直接加载到内存启动,当然要比你读文件在解析块,不然内存数据库咋这么火。

SpringBoot带来哪些实用

我们就说filter\servlet\listener,传统方式需要在web.xml里面把class配置进去。而spring-boot封装后只需要在类上加上@WebServlet,@WebFilter,@WebListener三个注解配合@ServletComponentScan,就是直接将bean注入IOC进行管理。有一点很重要:annotation的速度比xml的解析加载要快很多,一个在内存里面和一个在磁盘上读取速度不用太费脑子想也能想的通的。

针对tomcat的服务级别自定义配置,这要归功于spring-boot-autoconfigure提供的ServerProperties基本涵盖了http服务环节中控制参数,具体参数可以去查看官方网文档properties附录:application.properties。我们再这里需要了解spring-boot把tomcat-project这种服务依赖关系给颠倒了一下。Springboot可以灵活的切换jetty\tomcat\Undertow这三种server,切换成本就是把pom.xml引入的jar给换一下,配置文件里面部分参数改一下名(大多数不需要改)。

project-server

在tomcat很火那个年代(虽然现在也很火),大家一说部署http服务器就想到了tomcat来支持,有个很大的功臣要属JSP做出的贡献。JSP就是个servlet,可以很好的在tomcat里面运行可以说完美,而如今了JSP已经没落了没几个人提了。它已经过时了,也许未来servlet也会被替代。在SpringBoot官方直接推荐你抛弃掉jsp,改用thymeleaf和freemarker优先thymeleaf,这是个html风格的templating engine。作为java后端模版这块毫不犹豫选择thymeleaf去开发一些web系统。

SpringBoot的tomcat模块做的不单单这些,还有很多关于server的制定扩展接口和实现,还有MVC安全等等。

SpringBoot是在微服务大趋势下应运而生的框架,是微服务首选框架。它里面集成了大量微服务中要用到的中间件,结合自动配置思想极大的简化我们项目搭建和开发成本。

作者:Owen Jia ,推荐关注他博客:Owen Blog

技术的海洋里面,我们都需要潜心学习,永无止境。