前言
C++课设选用了一个比较坑的主题,前后端开发一个网络小游戏,但是必须要使用到C++,只能从后端做文章。理论上来说只需要用C++实现了rest风格的web service就能解决我们的问题,但是怎么用c++这样一个相对于java python不是那么适合web服务的语言来说,如何实现一个rest后端成了难题。这篇文章主要介绍使用ubuntu+ngrest来进行rest服务的开发,这方面的教程网络上较少,很多都是靠自己试探摸索出来的。
开发环境准备
· ubuntu服务器一台(云服务器最方便团队协作,也可以通过本地公网映射)
· cmake + gcc + build-essential(cpp编译环境) + git
· ngrest(git上开源的C++ rest框架)
实现步骤
1.在自己的ubuntu上安装ngrest
首先为什么不使用操作习惯的windows系统呢?因为使用cmake和makefile的编译过程实在太痛苦了,六个小时试验也没有解决了win10系统里面编译的报错问题,stackoverflow找到的解决方案都无济于事,最终选择了ubuntu系统。
首先访问ngrest在git的仓库:https://github.com/loentar/ngrest
可以查看到其官方文档,有给出安装方法
但是这个方法安装ngrest,我切换了许多环境,都是相同的结果,输入未响应好久,然后退出,什么都没有发生。
因此只能采用自己下载源码编译的方法,在ubuntu终端输入以下代码
git clone https://github.com/loentar/ngrest.git
cd ngrest
mkdir build
cd build
cmake ../../ngrest
make
如果没有上面所需工具:git/cmake,请输入
apt install git
apt install cmake
如果提示找不到包,那么需要手动加入阿里源,添加后输入
apt-get upgrade
更新安装仓库源,之后就可以正常安装了。
成功make之后应该得到的目录是这样的:
这样就初步完成了ngrest的编译工作。
2.部署服务到指定ip地址与端口
在/ngrest/build/deploy/bin当中可以部署官方提供的样例服务
在此之前我们需要知道本机的ip地址,由于编者使用的是阿里云ECS,设置地址为127.0.0.1或者localhost均无效,最后发现需设置为本机的ip地址才可以正确运行,输入
ifconfig
红框圈住的即为本机ip地址,可以通过以下指令完成服务部署
./ngrestserver -l ***.***.***.*** -p ****
#其中-l后为本机ip地址,ip为制定端口号
#或者可以使用默认配置,ip为localhost,端口为9098
./ngrestserver
这是正常部署后的情况,如果使用的是自己的虚拟机或者双系统ubuntu,直接通过浏览器输入url就可以访问到服务详情主页,如果使用ECS,那么需要添加安全组,将9098这一端口暴露出来
这样就完成了服务的部署与发现,相对于其他框架算是十分简便了。
3.开发自己的服务
这里编者参考一篇难得的教程,和官方文档一致,都是直接通过ngrest create指令就可以创建新的工程来开发自己的服务,而在第一步编译工作当中,并没有全局安装ngrest在系统当中,这一步就出现了问题,而在/ngrest/scripts当中我们发现是存在一个可执行文件ngrest的,使用
./ngrest create project
理论上来说应该是可行的,而实践过程中会报错,显示第n行当中有一个指令未找到,这时候就需要全局安装ngrest来解决这个问题了,之后也是可以直接使用ngrest的命令来在任意目录新建工程了,相当于一个脚手架工具,全局安装只需要在/ngrest/scripts目录下执行inst即可
./inst
下面是安装成功后的截图
可以使用ngrest help来检查安装是否成功。
在你要建立工程的目录下输入
ngrest create project_name
即可创建名为project_name的工程,这里我们建造了一个hello工程。
访问到最内层目录发现有默认生成的一个头文件与实现文件
通过vim编辑器打开hello.h,即可定义自己服务的接口,在cpp当中写具体实现代码,这一部分在官方文档较为详细,建议直接阅读官方文档:https://github.com/loentar/ngrest
需要注意的是,定义接口类型是通过注释的方式定义的,如图
*method代表方法类型,*location代表路径参数,类名对应实际服务的根路径名,location可以设置具体路径与路径参数
如hello类中的echo对应路径为http://localhost:9098/hello/{text}
add对应路径为http://localhost:9098/hello/post/{text}
定义接口后在cpp当中编写具体实现代码,之后退出到项目根目录hello,输入以下命令部署服务:
export NGREST_SERVER_IP="***.***.***.***"
#引号中填写本机ip地址
ngrest run
成功部署后如图
通过浏览器访问自己发布服务的默认页面 http://ip:9098/ngrest/services,编者使用ECS,故ip直接使用公网ip就可以访问
提供服务描述页面和简单的测试页面,可以通过postman模拟get与post请求得到返回结果,不作演示了
可能遇到的问题
异常结束服务器进程可能会导致僵尸进程的产生,占用端口和内存资源,这时可以使用ps -a/ ps -ef的指令找到僵尸进程的pid,使用kill -9 pid指令来强制结束进程,欢迎评论区留言!
2020.7.24更新
1.ngrest框架有自带的数据库框架ngrest-db,但是很遗憾没有提供出连接mysql的具体文档,官方项目组也停止更新两三年了,谷歌社区的最近发言也是定格在了2018年,内容也还是安装的问题。不过还是可以根据他的框架定义一个本地存储的简单数据库的,配合框架使用是比较方便的。
2. 避免不开的跨域请求问题,这一问题目前并没有人解决过,编者将会尝试解决这一问题,后续亟待跟进...
2021.1.11更新
跨域请求应该可以通过nginx转发解决,考完试试一下