一、嵌入式Tomcat
1、为什么要嵌入式
为什么需要嵌入式启动,我们由之前一般的Tomcat启动可知,Tomcat组件非常多,启动流程步骤比较多,但是往往我们一般就只需要简单快速的部署一个Web项目,所以简单实用的嵌入式Tomcat就诞生而来。
1.1、部署复杂度
如果按照传统部署,我们需要下载Tomcat,同时需要配置服务器,同时还需要修改端口,同时也要避免应用系统的jar包与服务器中存在的lib包的冲突,所有的这些都会增加部署的复杂度,并且这种配置大部分还是一次性的,不可重用。如果你遇到大规模的服务器集群环境(部署N多个应用)时,会增加我们的运维成本,如果按照嵌入式启动,这种方式几乎是一键式的,可以把以上问题轻松的解决。
1.2、架构约束
Tomcat启动的时候默认不单单只启动了HTTP协议,还有AJP协议等等,如果我们就只想简简单单的启动一个HTTP服务,同时不想启动那些多组件,可以使用嵌入式Tomcat,避免在部署启动时的架构约束。
1.3、微服务架构
现在微服务已经是主流的架构,其中微服务中每项服务都拥有自己的进程并利用轻量化机制实现通讯。这些服务都是围绕业务功能建立,可以自动化部署或独立部署。将微服务架构与Tomcat技术相结合,可以轻松将系统部署到云服务器上。当前SpringBoot支持的嵌入式服务器组件就是Tomcat.
2、嵌入式启动实战
2.1、启动Servlet
<!--嵌入式Tomcat -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.34</version>
</dependency>
ServletDemo.class
public class ServletDemo {
public static void main(String[] args) throws Exception {
//自定义的一个Servlet(专门处理http请求)
HttpServlet httpServlet = new HttpServlet() {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.getWriter().write("hello world!");
}
};
Tomcat tomcat = new Tomcat(); //引入嵌入式Tomcat
Context context = tomcat.addContext("/demo",null); //部署应用的context
tomcat.addServlet(context,"hello",httpServlet);//相当于往应用中添加Servlet
context.addServletMappingDecoded("/hello","hello"); //相当于添加了servletMapping 映射信息
tomcat.init(); //启动Tomcat ---生命周期
tomcat.start();
tomcat.getServer().await();//用于阻塞Tomcat,等待请求过来
//http://localhost:8080/demo/hello
}
}
启动后访问路劲:http://localhost:8080/demo/hello
通过实战可知,我们添加了一个HttpServlet提供对外服务,这样我们的Tomcat就可以简单的提供一个Servlet服务,而不提供页面访问(JSP、HTML等),可以非常灵活的控制Servlet的加载以及请求链接的分配,而不受限制于Context与应用的一一对应关系。
2.2、嵌入式启动应用
这个项目工程(ref-comet)是一个服务器推送的工程,包含了JSP
<!--嵌入式Tomcat -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.34</version>
</dependency>
<!--嵌入式Tomcat的JSP 支持-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId