网站服务公司哪个好,openwrt安装wordpress,网站编辑信息怎么做,北京网站建设方案案例目录
编辑 1. 背景
2. web项目和非web项目
3. 环境准备
4. 分析链路
5. 总结 1. 背景
今天开了一篇文章“SpringMVC是如何将不同的Request路由到不同Controller中的#xff1f;”#xff1b;看完之后突然想到#xff0c;在请求走到mvc 之前服务是怎么知道有请求进来…
目录
编辑 1. 背景
2. web项目和非web项目
3. 环境准备
4. 分析链路
5. 总结 1. 背景
今天开了一篇文章“SpringMVC是如何将不同的Request路由到不同Controller中的”看完之后突然想到在请求走到mvc 之前服务是怎么知道有请求进来了并且知道交给谁处理呢想看看这一块的代码
2. web项目和非web项目
当我们需要新增一个后端接口的时候我们会通过RestController和RequestMapping注解来新增一个接口。然后我们发现我们这两个注解实际上是在spring-web包下的。
如果我们的后端服务需要提供http请求的能力那么我们就需要引入一个spring-web的包。称做web项目。如果我们的后端服务只提供thrift一种rpc框架那么我们也就不需要引入spring-web的包称做非web项目。 这次主要是想看看是怎么处理的http请求。
3. 环境准备
新建或者打开一个之前创建的springboot项目我用的是之前写各种demo的项目在项目中新建一个Controller或者使用之前的Controller我用的是之前就建好的TestController自己得知道咋请求这个接口就行
RestController
public class TestController implements BaseController {RequestMapping(/test)public String test() {return SUCCESS;}
}在AbstractHandlerMethodMapping#lookupHandlerMethod第一行添加断点这个看文章知道的会在这里处理请求转发到不同的controller如图 以debug启动项目 请求接口然后进入到debug模式
4. 分析链路
首先可以看到在线程池拿到了一个task并执行 2. 继续往下我们可以看到这个task是一个SocketProcessorBase对象添加断点重启服务再次请求接口 3. 然后发现是在NioEndpoint$Poller创建的socket继续debug 这个时候我们发现是在容器加载完成之后会去启动服务同时启动tomcat 5. 当tomcat接受到请求的时候
Poller从Acceptor线程接收新的连接请求。Poller将接收到的连接请求注册到其内部的NIO Selector上。Poller不断轮询其注册的Selector以查看是否有任何NIO事件就绪。一旦Poller检测到某个通道上有事件就绪它就会创建一个SocketProcessor任务对象并将该任务提交给Executor线程池进行处理。
然后经过tomcat 的一顿invoke 7. 开始处理请求 8. 一直走到FrameworkServlet这个springmvc处理请求的核心类 9. 然后走到DispatcherServlet 的doDispatch类
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {。。。省略try {//现在在这里去拿mappedHandlermappedHandler getHandler(processedRequest);if (mappedHandler null) {noHandlerFound(processedRequest, response);return;}。。。省略
}5. 总结
后面就走到了我们比较熟悉的springmvc处理请求的地方了这块网上很多写的文章大家感兴趣可以自己去百度看看。