cybertheye / evolution-from-netty-to-springboot Goto Github PK
View Code? Open in Web Editor NEW学习开源项目,模拟实现netty,tomcat,springmvc,springboot等核心功能。可以作为提升编码能力的实践项目。欢迎各位一起参与,提交代码,相互学习
License: GNU General Public License v3.0
学习开源项目,模拟实现netty,tomcat,springmvc,springboot等核心功能。可以作为提升编码能力的实践项目。欢迎各位一起参与,提交代码,相互学习
License: GNU General Public License v3.0
现在显得好乱啊
1.完善header
2.Cookie区分处理跨域相关逻辑
项目最终实现目标是 mimic-springboot 依赖 mimic-springmvc 依赖 mimic-tomcat 依赖 mimic-netty
功能模块进度:
mimic-tomcat 迭代 (可以增加):
讨论:
代码优化
wiki 上可以增加,“对于这里的实现方式,Tomcat是怎么实现的” 章节
目前实现的来一个请求就会去构造 Filter 责任链
优化,复用责任链
目前的mimic-tomcat 框架是使用 注解的形式去配置和申明一个 Servlet,可以考虑增加 XML 配置的形式
潜在工作:
目前的责任链开启的方式是
@Override
public void start(MTRequest request, MTResponse response) {
FilterNode traveler = head.getNext();
try {
while (traveler != null && traveler.exec(request, response)) {
traveler=traveler.next;
}
targetServlet.service(request,response);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
这里实现的启动 责任链 并不是 Tomcat
中的实现模式,
从方法栈角度来看,这里是来一个方法,执行完,然后出栈,执行下一个。
而Tomcat
中
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("filter before");
chain.doFilter(request, response);
System.out.println("filter after");
他是 以 chain.doFilter(request, response);
请求过来执行这句代码上方的代码
请求返回的时候去执行这句代码下方的代码
从方法栈角度来看,方法栈是没有出栈的,类似递归,最后递归回来。
todo 这里迭代修改实现模式
wiki 文档 优化
目前, MTResponse 的定义是
public interface MTResponse {
void write(String content);
void writeAndFlush(String content) throws UnsupportedEncodingException;
}
目前的实现是在 write
方法里面 拼接 要返回的内容,因为我们增加了请求的生命周期,引入了Filter后,开发者可以在 Filter 中,调用 写方法,返回一些东西。
如果直接去生成一个 HTTP
响应体,然后通过 通道写回,此时浏览器就收到了这个响应体,那么默认此次 HTTP
会话是结束了。所以后面 在执行 write
方法的话,就会报这个错误
这里暂时的解决方法是,先 默认在 Servlet
中 要返回的信息是最终要返回的信息,
然后在 Filter
中 如果写信息,那就先拼接着。最终在 Servlet
中调用 writeAndFlush
详见
测试Filter模块功能
这里的方案需要进行优化改造
tomcat里filter是按照web.xml配置的顺序读取并且执行的。目前采用的注解模式,需要考虑也加上顺序读取,顺序执行的处理
在实ServletRequestListener
时,需要 定义request初始化的时机,而它决定了 ServletRequestListener 调用时机
目前是放在 MimicHttpInBoundHandler
,Netty pipeline 除了 HTTP 解码,的第一个处理环节。 在这里当作 request 初始化的时机
这样合不合理,Tomcat里面是怎么做的?
//模块分
#netty
#tomcat
#springmvc
#springboot
//任务方向
#重构
#迭代
#性能优化
//优先级
Priority L3
Priority L2
Priority L1
//重要程度
VIP L3
VIP L2
VIP L1
//任务复杂度
O(3)
O(2)
O(1)
//其他
#bug
#question
#具体工作
#维护工作
!!!大家 Feel Free 发布 issue!!!,发挥一下主观能动性
先发布一下issue,再做相关开发
在旁边的 Assignees ,弄上自己就行了
重新弄到 Git Book上了
大家一起修改,完善
https://app.gitbook.com/invite/b0EKvp3JOyWyCPaJP2Uk/JG220amczhLwx4UnvL1Z
请先 push 到 dev 分支上
git push -u origin master:dev (注意远程仓库的分支)
具体场景:
比如,在ComponentScanner
在后面 增加了 Servletinformation
之后,其实是添加了一个元数据
那么后面比如我要 容器初始化的时候,先去将 loadOnStartup
是 1
的 servlet
先实例化
那么这个时候,我希望这个 ComponentScanner
提供一个功能是 把 loadOnStartup 的所有给返回过来
那么就要涉及到 接口增加功能了, 那么这个 功能适不适合 增加在 ComponentScanner
里面呢?
SOLID原则,
那么如果不放在这里,那么需要接口类的继承等实现方式,那么又该怎么做呢?
搞清楚原理,可以实现一下
其他暂定。。。。现在粒度比较大,等具体可以讨论后细分
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.