用户请求
以现在微服务请求的方式,用户一般上网操作都是通过手机、网页等各种方式点击操作,这时候服务器会根据不同的请求分别转发至后面各个对应的服务上,最简单的就是如图所示,只有一个服务器A,服务器B.
两个程序分别部署在对应的服务器A和服务器B上,那么请求发起如A服务请求至B服务时,请求路径是什么样子的?tomcat是怎么实现服务器A到B的请求
应用部署
一般的web项目部署到Tomcat容器的方式有三种:
- war包
- 文件夹形式
一般情况下我们都会选择前两种,把应用程序打成对应的war包或者文件夹形式放在Tomcat的webapps文件夹下进行启动。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
复制代码
- appBase:应用部署目录
- unpackWARs:自动解压war包,使用解压后对应的文件夹
- autoDeploy:热部署
- Value标签表示这个虚拟主机下的日志存放的地址
- Xml描述方式部署
<Context path="/Helloworld" relaodable="false" docBase="D:\IdeaProjects\Demo\target\classes">
</Context>
复制代码
- path : 访问项目的路径
- relaodable : tomcat会持续监测Javabean,一旦发现Javabean源文件改动,服务器立即重启
- docBase : 应用所在的文件夹/war包对应的路径(不受限制),如果docBase如果是空,表示项目没用
tomcat不支持jar包部署,在webapps目录下,一个文件夹代表一个应用,假设在webapps下放入一个jar时,tomcat无法试别到底是依赖的jar包还是服务应用
发起请求
- 应用程序根据对应业务生成和组装业务数据
- 建立连接
根据业务需要,组装符合http协议的数据
- http协议是应用层协议,它不关心数据传输,主要关心的是数据格式,一个http协议包括请求行,请求头,请求体
- http应用层向下传输到了TCP/UDP
操作系统有tcp_connect()方法。应用程序通过操作系统提供的socket接口调用建立tcp连接
3.传输送数据
Connector标签对应的实现类Connector,Connector标签定义了对应的协议,类里面定义了Endpoint对应的抽象类AbstractEndpoint,AbstractEndpoint对应的实现类有AprEndpoint(apache,JIoEndpoint(BIO), NioEndpoint(Nio)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
复制代码
tomcat通过socket传输,根据不同协议进行解析为Request,然后tomcat通过Endpoint组件来接受Socket的连接。
Tomcat7里NIO和BIO都存在,默认是BIO。Tomcat 8以后主要把NIO改为默认,BIO去掉了
tomcat通过Connector处理相关请求。Connector使用ProtocolHandler处理器来处理请求。不同的ProtocolHandler代表不同连接类型。
- Tomcat容器
- Tomcat是一个servlet容器
- Context所谓的容器主要是指继承Container(容器),Container继承Lifecycle(生命周期),Container有4个实现接口,分别是Host,Context, Engine, Wrapper
<Context path="/HelloWord" relaodable="false" docBase="D:\IdeaProjects\Demo\target\classes"/>
复制代码
- 通过server.xml知道,Context是Host下的一个子节点,Host节点表示tomcat内部的虚拟主机,如果虚拟主机没找到,默认找localhost。Engine是host的上一级容器,用于管理Host。Wrapper在context之后,Context管理多个Wapper,Wrapper管理多个servlet