Table of Contents
1. 线程模型
根据项目文档 Thread Pool and I O Flow,RestExpress的线程模型如图:
- Front-End Thread Pool(或者叫I/O Worker Thread Pool)实际上是Netty中ServerBootStrap时用到的boss和worker
- Back-End Thread Pool(或者叫Executor Thread Pool)是在Pipeline中add ChannelHandler时提供的EventExecutorGroup。当不提供时使用worker处理。
2. ChannelHandler栈
从下(底层)到上(上层),RestExpress给Channel注册的ChannelHandler包括:
- io.netty.handler.ssl.SslHandler.SslHandler(optional)
- io.netty.handler.codec.http.HttpRequestDecoder.HttpRequestDecoder
- io.netty.handler.codec.http.HttpContentDecompressor.HttpContentDecompressor
- io.netty.handler.codec.http.HttpResponseEncoder.HttpResponseEncoder
- io.netty.handler.stream.ChunkedWriteHandler.ChunkedWriteHandler
- io.netty.handler.codec.http.HttpContentCompressor.HttpContentCompressor (optional)
- io.netty.handler.codec.http.HttpObjectAggregator.HttpObjectAggregator
- org.restexpress.pipeline.DefaultRequestHandler
除最后一个,其他都是netty自带的。根据项目文档,下图中的蓝色部分,就是在DefaultRequestHandler里触发的:
另外,蓝色的部分在在上文中的Back-End Thread Pool中执行,绿色部分在Front-End Thread Pool中执行。
3. Route定义
server.uri("/example/route", controller)
.action("returnString", HttpMethod.GET)
.noSerialization();
- RestExpress利用RouteDeclaration类实现Route的定义,在初始化过程中,用户调用uri或者regex函数向RouteDeclaration插入一系列RouteBuilder
- RestExpress定义了两种RouteBuilder,当调用RestExpress.uri时使用ParameterizedRouteBuilder,当调哦那个RestExpress.regex时,使用RegexRouteBuilder
- 一个HttpMethod和Url(或Url Regex)的组合确定一个Route,每个Route绑定到一个Java对象的一个Method
- RestExpress通过调用RouteDeclaration.createRouteMapping将其中的RouteBuilder列表变成 RouteMapping。RouteMapping能根据给定的地址返回一个Action。Action对应于Route。
- RestExpress的主要HTTP request/reponse处理逻辑在DefalutRequestHandler实现,因此它需要一个RouteResolver来找到对应Route,从而找到对应的对象的Method并调用
- 默认的HTTP method对应的对象的方法如下
- POST: create(Request, Response)
- DELTE: delete(Request, Response)
- PUT: update(Request, Response)
- GET: read(Request, Response)
- Method方法名配置,但是方法的参数必须都是(Request, Response)。Method的返回值可以使ByteBuf或者实现toString(),这个返回值昨晚Response的body

0 评论:
Post a Comment