【go语言微服务实践】#1-单体应用的烦恼

线上答题系统,微服务架构的小小实践,项目代码

一、概述

实现一个基本功能的答题网站,管理员可进入网站发布比赛,选择比赛题目、设置比赛信息等。普通用户可组队参加比,按规定时间作答,获取相应积分。这个网站的功能非常简单,主要是来实践如何将一个传统的单应用架构转变为微服务架构,实践过程也会记录自己的一些心得。
版本一基于beego采用传统MVC架构,分为view,controller、model三层,view和controller之间全部使用ajax通信。
技术选型:
基础语言:golang
前端 :planeui+jquery
后端:beego
数据库:mysql

二、整体架构

【go语言微服务实践】#1-单体应用的烦恼_第1张图片
MVC架构,分为view、controller、model三层。

  • view层其实就是前端界面,但是舍弃了beego的视图功能,使用planeui+jquery实现前端界面,与后端全部使用ajax进行通信。这样设计是为了前后端分离,且方便之后可以灵活的替换前端架构。
  • controller层对应beego中的Controller,分为用户模块user、事件模块event、答题模块participant+team+credit、题目模块problem等4个模块。
  • model层是beego与mysql数据库对接的模块,封装好各个表的CURD操作后给controller层调用,其中需要联合多张表操作的sql放在union中。

为了不要过度纠结于业务功能实现,也方便之后改造成微服务,其中各个controller和model都有对应关系。

  1. 用户模块:系统用户管理,分为普通用户和管理员,普通用户只能答题,管理员可以创建事件,选择事件题目、参与本次答题的用户。
  2. 题目模块:管理题目的CURD及excel批量导入题目。
  3. 事件模块:每次答题就是一个事件,由管理员创建(答题时间,题目的数量及分值,描述等),并选择包含的题目
  4. 答题模块:每个参与答题事件的用户user就是这个事件的participant,若是组队参加,则多个participant组成team。答题模块就是负责给每个participant生成题目,判断它提交的答案是否正确并计算积分credit。

三、代码编写

  1. beego语法:beego官方文档
  2. 代码结构说明:
├── conf#配置文件位置
│   └── app.conf
├── controllers#controller层
│   ├── AnswerController.go#答题模块
│   ├── EventManageController.go#事件模块
│   ├── EventMessageController.go#事件模块
│   ├── LoginController.go#用户模块
│   ├── ParticipantManageController.go#答题模块
│   ├── ProblemManageController.go#题目模块
│   ├── UserIndexController.go#用户模块
│   └── UserManageController.go#用户模块
├── main.go
├── models#数据库model层,本系统各个表操作的封装,提供给controller调用,数据表说明见下文
│   ├── 略
├── routers#路由
│   └── router.go
├── sql#建表sql
│   └── problem.sql
├── static#静态文件,如引用的js库,图片等,以及上传文件的存放位置
├── views#前端页面存放
│   ├── answer#用户答题相关界面
│   │   ├── event_message.html
│   │   └── user_problem.html
│   ├── index#修改密码,及用户登陆后的主界面
│   │   ├── change_pwd.html
│   │   └── user_index.html
│   ├── index.html
│   └── manage#管理员的管理界面,包括用户管理、题目管理、创建事件等
│       ├── event_insert.html
│       ├── event_manage.html
│       ├── participant_manage.html
│       ├── problem_manage.html
│       ├── problem_upload.html
│       └── user_manage.html
└── web
  1. 数据库模型:数据库E-R图如下,一共8个表
  • user:用户信息
  • event:事件表,保存发起的比赛信息
  • problem:题目表,包含所有题目
  • event_problem:比赛的题目
  • team:组信息表,多个participant组成team
  • participant:保存参加比赛的用户信息
  • credit_log:积分详细信息表
  • participant_haved_answer:保存参加比赛的用户已经答的题
    【go语言微服务实践】#1-单体应用的烦恼_第2张图片4. 本版本代码:
    链接:https://pan.baidu.com/s/1w9RXBtVx_1unNaPr6iRdHw 密码:rqlr
    安装mysql,执行problem.sql建表
    按官网安装bee工具,在AnswerSystem目录下使用bee run启动,缺失的包用go get下载一下

四、功能详述

  1. 访问http://localhost:8081/index,用户用管理员账户登陆系统(用户名admin,密码123321),在用户管理中创建用户(目前没做注册,只能由管理员创建普通用户)。
    【go语言微服务实践】#1-单体应用的烦恼_第3张图片
  2. 然后创建事件,上传题目(excel模版在src/static/upload/test.xlsx),选择用户参加。
    【go语言微服务实践】#1-单体应用的烦恼_第4张图片
  3. 普通用户登陆可以看见自己参加的事件,选择“开始答题”进行每日答题,“详情”查看事件详情以及个人和小组的得分情况。
    【go语言微服务实践】#1-单体应用的烦恼_第5张图片【go语言微服务实践】#1-单体应用的烦恼_第6张图片目前功能很简单,系统不足以真正使用,界面也比较丑,不过这些都不是重点,以后再慢慢完善。

五、总结

其实现在实现一个基于MVC的单体应用还是比较简单的,只要选好成熟的架构按文档开发即可,但这种方式有很大的局限性。首先,当系统的功能越来越多,这个应用也会变得越来越庞大复杂。实现新功能或修复bug都会变得困难,新人也不容易上手。其次应用越大,启动时间越长,而且若不使用热部署等工具,单体应用需要重新部署整个应用才能更新其中任何一部分,对于部署和敏捷开发都不友好。
最后单体应用的扩展方式也有待改进,例如,如果要增加这个系统的答题模块,一般是增加多个相同的应用,再用nginx做负载均衡,这样user、event这些不需要增加的模块也会增加,其实并不能很好的实现资源配置。
单体应用的这些问题,微服务都可以在一定程度上改善,因此十分值得研究一下。MVC架构当访问量逐渐增大时,可以将单个应用拆成互不相干的几个应用,以提升效率。这样就来到了单体应用转为微服务架构的第一步:拆。
【go语言微服务实践】#1-单体应用的烦恼_第7张图片
因此下一个版本中,会将单体应用按controller层的各个模块,拆成一个包含web应用模块,用户模块user、事件模块event、答题模块answer、题目模块problem、联合模块union等6个模块的分模块版本。
继续了解请戳:【go语言微服务实践】#2-进化,变身成微服务

你可能感兴趣的:(微服务实践#答题系统,golang,分布式,restful,mysql,项目架构)