依托于Servlet的Spring Boot
spring boot是目前java微服务广泛使用的Web框架,本身内部的核心模块是嵌入的tomcat和spring mvc。
spring mvc设计上遵循Servlet标准,是在标准Servlet接口的基础上实现后续的请求处理和应答。一个Servlet本身并不能独立运行,需要依托外部Servlet容器加载到应用中才能工作。tomcat就是servlet容器中的佼佼者,和spring mvc一起,最终构成了spring boot的核心基础。tomcat和spring mvc的组合虽然已经能够实现整个系统的运作,但是这种模式下spring mvc应用在开发过程中面临繁琐的配置问题。这时spring boot的出现解决了这个问题,同时内置tomcat+spring mvc的模式又恰恰迎合了微服务的潮流。
历史悠久的Servlet标准
1997年,Sun公司联合其他公司一起,发布了在Java业界影响深远的J2EE企业开发标准。这个标准中就包含了著名的JDBC、JSP、XML等等规范,Java Servlet也是这其中之一。
Servlet标准自从发布后持续迭代,目前已经进入3.0时代。Servlet 3.1接口标准如下:
public interface Servlet {
//初始化Servlet。ServletConfig Servlet配置
public void init(ServletConfig config) throws ServletException;
//获取Servlet配置
public ServletConfig getServletConfig();
//获取Servlet信息.作者版权等
public String getServletInfo();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
//销毁
public void destroy();
}
熟悉java的开发者都知道,接口并不能真正的运作,而是为实现的子类提供的一个参考规范,同时实现这一个规范的子类也能够作为一个组件被使用到所有同类接口规范的环境中。Servlet规范中,除了初始化配置init方法、获取配置和附带信息getServletConfig与getServletInfo方法,以及销毁回收资源的destroy方法之外,最重要的是service方法。service方法是Servlet中用来处理传入请求、处理传出Response的地方,作为web服务的核心,是需要重点关注的点。传入的ServletRequest、ServletResponse参数是Servlet组件处理的起点,ServletRequest接口设定了网络协议、远程主机地址、设定了ContentType、定了Key、Attribute的参数结构、输入流等,ServletResponse接口设定了ContentType、Length、本地化配置、输出流、Buffer等。
你可能会奇怪Servlet接口标准过于宽泛,和我们目前实际使用的Http协议的形式不太一致。实际上,Servlet标准中也包含了HttpServlet的标准。
HttpServlet实现的service方法特异化地针对Http协议的请求。一方面表现在传参转化为继承ServletRequest、ServletResponse的HttpServletRequest、HttpServletResponse,它们新增了Header、Conkie、Path、URL、应答Status和状态枚举(例,404、502)等。
另一方面,service方法的实现中,会根据http请求的类型,将请求分派到doGet、doPost、doHead、doPut、doTrace、doOption方法中,分别对应Http协议中的GET、POST、HEAD等类型。
Servlet标准为Servlet和Servlet容器各自需要完成的工作划定了边界。这一点在后续对tomcat和spring mvc介绍中会有更清楚的解释。
Servlet容器实例:Tomcat
tomcat需要做什么
根据Servlet标准,Servlet容器需要做些什么呢?最简单直接能想到的就是,需要处理套接字Socket的接入,以完成对TCP消息的接收和发送,tomcat的核心能力也就是在这里。
相对复杂的一点是Tomcat需要考虑的更多。首先,tomcat最初是可以作为一个独立的服务器部署的,不同的实现Servlet接口的应用都可以被打包整war包,热部署到tomcat指定目录下,实现服务的运行。所以,tomcat需要考虑同一个服务器下多个站点Host、多个Servlet应用运行的问题。具体