调试环境搭建

下载源码

去官网直接下载源码
https://solr.apache.org/downloads.html
0B3F9F5035B94F68BD6E3A7B67083406.png

搭建调试环境

https://hub.docker.com/ 找到sorl镜像
下载docker 最新镜像

docker run -d -p 8983:8983 -p 8998:8998 -p 8999:8999 -t solr

启动镜像

调试

docker 进入开启的solr镜像,输入下面命令

solr -f -a  "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8999" -port 8998

8998 是web访问页面,8999是调试端口,要加0.0.0.0 防止连接不上

流程分析

Solr的流程有很多条,我这里以http://127.0.0.1:8998/solr/admin/info/system
这个路径作为案例来走一遍流程

查看web.xml
D52EE5292D014AF0BADC7F88E67D4E5B.png
所有的路径都走SolrRequestFilter

org.apache.solr.servlet.SolrDispatchFilter#doFilter 搭上断点
2B5479D1DDEC48378C6D67202FEBB5D9.png

进入
首先判断路径是否在excludePatterns 中,如果是则直接过掉filter
0A493CC958BC4340AB31E18ADBCFEB56.png
excludePatterns可以在web.xml 里面看到配置
66849D0EF2584AD886C7F92FC87E29D5.png

这里的作用应该就是静态路径不再走下面流程了。

然后进入
his.authenticateRequest(request, response, wrappedRequest)
8615694C0DD34446880EFF6543833022.png
我们这里是默认安装的,所以没有权限校验
ACB6042AD71B4248878E79AA8417CCDC.png
直接返回true了。
接着进入
8D0DA43ABD9A4CB0ADB93CC2B127E529.png

找到一个call,
进入org.apache.solr.servlet.SolrDispatchFilter#getHttpSolrCall

68735C2D482D485590866877AB3297E9.png
这里根据路径有两种call,我们正常的路径返回的是http类型的,还有一种是v2的,
接着往下走,
进入主要的call()方法。
进入
org.apache.solr.servlet.HttpSolrCall#call
进入其中的初始化部分
A7928D6AFB164B6DB4EB459B389AEBD8.png
跟进后
0E4AAF20EB6A43EEA6A29C804B5C98AF.png
这里的主要作用是判断action 类型
一直跟进到org.apache.solr.handler.RequestHandlerBase#getRequestHandler
CC496188F3B14DF6BB4A15EBFB9EBCD6.png

看到这里是根据路径找到requesthandler
由于我们的路径为admin/info/system
获取到的action类型为admin
进入到了第一个case
17941965F2D44BEB90228EF41EEE64BB.png
开始处理requesthandle
DE6E1A3CE554420088DCA1D2F1DE9B98.png
一直跟进到org.apache.solr.handler.RequestHandlerBase#handleRequest
03D81A12AC004F52A6095BFB1B52B362.png
跟进到this.handleRequestBody(req, rsp);
183C6CD457FB48CFB1440FD86F2C65B8.png
一直跟进到 org.apache.solr.handler.admin.InfoHandler#handle
AB583A72EF794F2686A3748931846DB9.png
根据name找到handles中的handle
再进入
handler.handleRequest(req, rsp);
处理
又一次进入了org.apache.solr.handler.RequestHandlerBase#handleRequest
这一次的handle为SystemInfoHandler
进入其中的org.apache.solr.handler.admin.SystemInfoHandler#handleRequestBody
679E70E2ECE14CE8B44590D9B67379A8.png

这里就是从路径找到功能的最后地方了最后的地方了
处理好请求之后又回到org.apache.solr.servlet.HttpSolrCall#handleAdminRequest

09975E730AF4427DAFF2DE04B234FEF7.png

下面就是处理一下response了
到次完成。