模块设计与代码结构
代码地址请移步 github链接
代码结构说明
- connector 主要是网络相关的组件:基于Netty
- core 是服务的核心实现
- executor 线程池相关
- Bootstract 是启动引导类
- Gevlet 用于服务生命周期相关
模块设计
Gevlet 的模块设计总体上分为处理网络请求的 BackendServer 模块和执行应用的 ServerContainer容器。
BackendServer 可以有不同的网络协议进行实现,比如 HTTP HTTPS TCP/IP 等。最终网络请求将会被映射为统一的 NetMessagetProtocol 请求协议传递给 ServerContainer 进行处理。
ServerContainer 是管理所有应用的全局唯一的容器。在系统启动的时候,Gevlet会加载所有的应用,并将每个应用映射成唯一 的 ServerHandler 保存到容器中,并为每个ServerHandler创建单独的类加载器(ClassLoader)。
启动流程
Gevlet 的启动可分为类加载器创建、加载应用资源、创建服务映射、启动网络服务 这四个过程。其中为每个应用创建单独的类加载,和创建服务映射是其中最关键的部分。
- 创建类加载器:由于Gevlet支持多应用的部署,为了防止多应用部署的情况下保证各个应用的独立性已经防止引用冲突,Gevlet 会为每个应用创建单独的类加载器,并同时启动单独的Spring 容器。
- 创建服务映射: 创建服务映射的过程其实就是 通过每个应用的Class资源,通过Spring 容器,获取提供服务的对象,并将其与URL 进行映射。
以下是Gevlet 启动的流程图
请求处理流程
请求处理部分主要依赖 RequestHandlerAdapter 进行请求参数的处理,并将请求转化为统一的 NetMessagetProtocol 然后转发给容器,容器通过URL映射找到对应应用的 ServerHandler 进行业务处理。
请求处理流程图如下:
总结:以上为Gevlet的设计结构,模块设计相对比较简单。不同的是Gevlet并没有为每个应用单独创建线程池,而是整个系统使用一个线程池进行业务处理。