BIT101的服务端,基于Go语言。
如果其他同学有需要用到该项目,可以直接使用,但需要注明使用了该项目,另外还请注意开源协议。文档中的说明已经比较详尽了,如有问题欢迎提issue。
🥳也非常欢迎你来贡献代码!
总之,希望这个项目能够帮助到大家( ´▽`)
一些更详细的说明可参考运维手册。
BIT101-GO主要使用了PostgreSQL数据库、Redis缓存、Meilisearch推荐系统和Gorse推荐系统三大依赖服务,你可以选择使用docker或手动安装的方式,推荐使用docker方式,只需要进入到env目录并运行docker compose up即可一键运行所有依赖服务,关于更多docker的相关操作可自行查询。
注意需要同步docker-compose.yaml和config.yml中的配置。
默认情况况下,将在几个端口上提供服务:
6379:Redis缓存端口7700:meilisearch的端口,除了提供API外,浏览器访问还有交互式搜索测试网页8086:gorse的gRPC端口8088:gorse的HTTP端口,浏览器访问显示后台网页5432:PostgreSQL数据库端口
需要先配置好依赖服务。
- 克隆并进入代码仓库
- 安装
GO并配置 - 复制
config_example.yml为config.yml并配置 - 执行
go run .以启动调试 - 执行
go build -o main main.go以编译为可执行文件main
假设编译后程序为main
- 开启服务:
./main或./main server - 备份数据:
./main bakcup,默认备份到./data/backup/文件夹下 - 导入课程表:
./main import_course [path],其中path为课程表.csv文件所在的目录,默认为./data/course/ - 获取课程历史:
./main course_history [start_year] [end_year] [webvpn_cookie],现阶段测试最早的课程历史为2005-2006学年
使用postgresql作为数据库。
CREATE USER bit101 WITH PASSWORD '*****';
CREATE DATABASE bit101 OWNER bit101;
GRANT ALL PRIVILEGES ON DATABASE bit101 TO bit101;使用Meilisearch作为搜索系统。可前往官网链接查看安装和实用教程。
部署时运行:
meilisearch --env production --master-key BIT101 --db-path ./data/meilisearch其中master key需要和config.yml中对应。
- 前往Gorse仓库Release下载对应平台
latest版本 - 修改配置文件
./env/gorse_config.toml - 运行
gorse-in-one:
./gorse-in-one -c ./env/config.toml使用JWT作为身份验证的方式,这样服务器就不用缓存任何信息,只要验证数字签名就可以,数字签名的密钥在config.yml中配置,绝对不可以泄漏。登录成功时会下发一个fake-cookie,之后只需要每次请求携带fake-cookie头即可。
serverless的分支中为专供Serverless平台使用的精简版本,当前只用于成绩查询。
BIT101-GO可以非常简单地部署到函数计算服务上,也可以按照路由将请求转发到另一个服务器上,实现反向代理。
一个典型的应用是,查询成绩详情需要进行大量的请求,这些请求如果在同一台机器上完成可能会造成比较大的压力,于是就可以将成绩查询接口的请求转发给函数计算代理完成。
如果只是快捷开关并配置代理链接,更改配置文件中的proxy字段即可,但如果要定义哪些接口需要走代理,需要在router中添加获移除特定路由的Proxy中间件(默认已经在部分接口添加了代理中间件)。
在Serverless中新建函数服务,选择运行环境为GO的Web函数。
然后使用命令GOOS=linux GOARCH=amd64 go build -o main main.go编译为目标平台的可执行文件(也可以在相同平台上直接编译),再将生成的main可执行文件、config.yaml和一个文件名为scf_bootstrap的文件打成一个压缩包上传即可。其中scf_bootstrap文件的内容如下:
#!/bin/bash
./main这样就将BIT101-GO部署到了Serverless平台上。
另外需要注意函数配置中几个参数的设置:超时时间、请求多并发等。
当前部署在Ubuntu上,使用screen来实现后台运行。
首先按照之前的说明跑起依赖服务并编译好main程序,然后创建production文件夹,将config_example.yml复制为production/config.yml并进行配置,同时将main也复制到production文件夹下。
使用screen -S bit101-go创建一个后台运行控制台,并使用screen -r bit101-go进入,然后cd到production文件夹下,使用bash run.sh运行程序。
使用ab -n 1000 -c 100进行压力测试,为排除网络影响,均为同一台服务器本机运行测试。
首先测试了一个比较复杂的接口。
老Python后端结果:
Document Path: /reaction/comments/?obj=paper1&order=default&page=0
Document Length: 17314 bytes
Concurrency Level: 100
Time taken for tests: 44.034 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 17494000 bytes
HTML transferred: 17314000 bytes
Requests per second: 22.71 [#/sec] (mean)
Time per request: 4403.378 [ms] (mean)
Time per request: 44.034 [ms] (mean, across all concurrent requests)
Transfer rate: 387.97 [Kbytes/sec] received新GO后端结果:
Document Path: /reaction/comments?obj=paper1&order=default&page=0
Document Length: 18019 bytes
Concurrency Level: 100
Time taken for tests: 2.939 seconds
Complete requests: 1000
Failed requests: 106
(Connect: 0, Receive: 0, Length: 106, Exceptions: 0)
Total transferred: 18121202 bytes
HTML transferred: 18018202 bytes
Requests per second: 340.31 [#/sec] (mean)
Time per request: 293.851 [ms] (mean)
Time per request: 2.939 [ms] (mean, across all concurrent requests)
Transfer rate: 6022.28 [Kbytes/sec] received一通测试猛如虎,结果非常 AMAZING 啊,老、新后端在该接口上的秒并发分别为22.71、340.31,提升了约15倍!!!(然而当前实际场景中服务器带宽反而成为瓶颈了)
又测试了一个比较简单的接口(仅包含一个数据库查询),老、新后端秒并发分别为708、955,仍然一定的提升。