前言
软件的开发流程包含需求分析、对需求的建模以及后续的总体、详细设计、实现和测试过程。本文针对工程实践项目的需求进行了建模分析,包含用例建模、业务领域建模以及数据建模等,最终给出项目的概念原型。
项目概述
本课题主要是在Linux系统下完成一个以c++为基础的web服务器设计与开发。能够为相当数量的客户端提供服务,同时能够完成相应的日志输出以及连接管理等功能。通过连接服务器上的数据库,服务器能够支持客户端的并发访问并及时响应。用户能通过页面进行注册、登录和资料预览、下载等功能。项目基于Linux系统的网络编程接口和系统调用,使用线程池 + 非阻塞socket + epoll(ET和LT) + 事件处理(Reactor和模拟Proactor)的并发模型进行实现,使用状态机解析HTTP请求报文。
需求分析
一个web服务器主要需要完成的功能就是解析用户请求,对用户的请求完成响应,用户的请求包含注册、登录和资源请求等。同时服务器需要支持一定程度的并发量,以保证对用户的请求能够及时返回结果。
- 主要功能需求
主要包含以下几个方面:
- 服务器完成用户登录、注册的功能
- 服务器完成用户预览、用户下载资源的功能
- 服务器完成包含用户登录、请求资源等活动的日志的记录
- 服务器通过定时器清理非活动连接
- 管理员可以完成服务器资源的维护,包含删除、修改、上传资源等功能以及服务器资源的异常检测,同时管理员也可以作为用户完成一系列活动
- 性能需求
支持较高数量的并发请求,同时能够在给定时间内完成响应
- 其他需求
要求具有一定的可移植性,有良好的外部接口
用例建模
- 首先从需求的表述中可以发现,项目包含两种种参与者:用户、管理员。
用户完成以下用例:
- 注册
- 登录
- 预览资源
- 下载资源
- 修改个人信息
管理员完成以下用例:
- 资源上传
- 资源删除
- 资源更新
- 资源异常检测
用户和管理员的用例可以概括成请求资源和维护资源两类。
- 画出用例图
图 1 用户请求资源用例图
图 2 管理员维护资源用例图
业务领域建模
首先分析项目的功能需求,主要包含:
- 服务器完成用户登录、注册的功能
- 服务器完成用户预览、用户下载资源的功能
- 服务器完成包含用户登录、请求资源等活动的日志的记录
- 管理员可以完成服务器资源的维护,包含删除、修改、上传资源等功能以及服务器资源的异常检测,同时管理员也可以作为用户完成一系列活动
用户完成登录等功能,说明用户是独立存在的,作为一个类。用户完成各类动作,这些动作可以统称为事件,通过http请求完成,所以http请求也是一个类。日志记录是独立存在,需要一个日志类来完成记录。服务器完成请求的解析以及日志的生成,并且和用户进行交互,所以服务器也需要作为一个类存在。服务器通过定时器完成非活动连接的清理,所以定时器也是一个类。剩下的登录,注册等都是动作,意味着用户和服务器之间存在着关联关系。同理管理员作为特殊的用户,应该是用户的子类,是继承关系,管理员和服务器之间也存在着关联关系。
经过上诉分析,得到项目的业务类图如下:
图 3 业务类图
数据模型
根据绘制出的业务类图,有相应的数据模型如下:
- User
列名 |
字段名 |
字段说明 |
类型 |
是否为空 |
说明 |
1 |
userId |
用户ID |
int |
N |
|
2 |
userName |
用户名 |
varchar(50) |
N |
|
3 |
userPassword |
用户密码 |
varchar(100) |
Y |
- http_conn
序号 |
字段名 |
字段说明 |
类型 |
是否为空 |
说明 |
1 |
timer_flag |
定时器标识 |
int |
N |
|
2 |
state |
连接状态 |
int |
N |
- timer
序号 |
字段名 |
字段说明 |
类型 |
是否为空 |
说明 |
1 |
user_data |
用户数据 |
text |
N |
|
2 |
expire |
剩余时间 |
varchar(50) |
N |
- SourceInfo
序号 |
字段名 |
字段说明 |
类型 |
是否为空 |
说明 |
1 |
sourceId |
资源ID |
int |
N |
|
2 |
sourceName |
资源名 |
varchar(50) |
N |
|
3 |
sourceType |
资源类型 |
int |
Y |
|
4 |
sourceStatus |
资源状态 |
int |
N |
概念原型
- 概念是人对能代表某种事物或发展过程的特点及意义所形成的思维结论。
- 概念原型是一种虚拟的、理想化的软件产品形式。
- 概念原型=用例+数据模型
用例和数据模型都在前文叙述过,这里总结出项目概念原型的工作过程:
用户通过客户端向服务器端发起连接,服务器维持主线程来通过epoll系统调用监听socket连接,被监听到的socket连接会被accept。同时主线程会维持一个监听队列。服务器通过epoll系统调用来完成对监听socket(listenfd)和连接socket(客户请求)的同时监听。通过线程池来实现并发,为每个就绪的文件描述符分配一个逻辑单元(线程)来处理。
服务器需要处理三类事件:I/O事件,信号及定时事件。主线程负责读写,工作线程(线程池中的线程)负责处理逻辑(HTTP请求报文的解析等)。工作线程完成对HTTP报文请求的解析,并按照报文的类型返回不同的结果。在用户登录时还会查询数据库。同时完成对非活动连接的处理以及日志的输出。管理员作为特殊的用户,发出的请求会被以同样的方式处理。
对应的流程图和时序图:
图 4 流程图
图 5 时序图
请发表评论