课程交流网站项目架构
课程交流网站项目最终赶在3月初部署成功。
其功能主要提供一个平台交流,分享课程评价及学习资料。
附有自用开发的智慧树刷课,网课答题助手,百度文库文本提取,漫画模块,都可免费使用。
如果你是暨大的,甚至还有抢课助手自动抢课。
网址课程交流网站
基础设施
所含基础设施:
- 腾讯云香港服务器
- 两台广州轻量云服务器
- 腾讯云COS存储
- 腾讯云短信服务
- 域名 campusutopia.cn
项目架构图
服务解析
前端
网站前端页面分两种:
- 前台页面应用传统服务器渲染,由django处理返回html。
- 后台页面应用Vue作前后端分离,html文件由香港服务器返回,其余静态文件由广州返回。后端由django(drf)处理返回json数据。
域名campusutopia.cn解析到香港服务器(不用备案),所有html页面都由香港服务器返回,而所有api接口都直接指向广州服务器ip:81。
前端页面都使用了Vue及Element-ui组件。只不过服务器渲染方式中Vue充当JQ的角色,而前后端分离方式中Vue充当前端渲染的角色。
后端
香港服务器负责返回html,无论是nginx静态文件返回还是django处理模板后返回,都是html文件。
html文件中所引用的其他静态文件以及api接口,都指向广州服务器ip:81。
Docker
所有的服务都由docker-compose部署。
只不过香港使用docker-compose up 单机部署,广州两台服务器使用docker stack集群部署。
Nginx
nginx负责静态文件的返回以及对uwsgi的socket转发,负载均衡。
uwsgi+Django
Web服务器采用uwsgi,nginx将相应请求通过socket转发至uwsgi,uwsgi调用django完成业务逻辑处理后返回给nginx而后nginx返回给请求方。
香港服务器的django是原生django,采用处理请求,服务端渲染html返回的方式。
广州服务器的django加上了drf模块,采用restful形式标准设计,处理请求后返回json数据的方式。
spider
全站爬取某个漫画网站,采用scrapy-redis模块完成分布式爬取。利用redis存储请求队列,以及利用bloom filter去重。item存入mongo。docker swarm的管理节点利用crontap每天定时开启服务完成全站增量爬取。
MySQL
主要的数据存储采用mysql,并只有一个实例放在广州服务器。香港的web服务也是调用香港的mysql,但只做读操作。
Redis
- 作为api服务的cache
- 存储spider服务的请求队列。利用bloom filter去重spider服务上传的请求。
ES
提供建议以及全文搜索服务。
其数据来自mysql或者mongo,文档id与源数据库的主键一致。
mongo
存储漫画数据
腾讯云COS及短信服务
腾讯云COS存储文章中的图片以及每个课程的学习资料,短信服务用作注册或登录的验证。
认证方式JWT
认证方式采用JWT。
由于前端服务,api服务不同域名(甚至于api服务没有域名),token选择存储在campusutopia网站的localStorage中。请求时作为header的Authorization的值传至django解析。