1 Star 0 Fork 0

ztfb / Ray

Create your Gitee Account
Explore and code with more than 12 million developers,Free private repositories !:)
Sign up
Clone or Download
contribute
Sync branch
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README
Apache-2.0

Ray——后端服务器框架

项目介绍

本项目是一个基于C++, Python, Linux, MySQL的后端服务器框架。该项目已经开发好的部分包括:核心服务器(基于C++)、MySQL函数库(基于C++)、Python接口层(与C++代码进行对接,方便Python业务层快速开发)。用户只需要使用Python脚本编写业务层逻辑,即可快速搭建一个简易的后端服务器。

核心服务器主要实现的功能有:

  • 异步的日志系统,方便在开发中进行调试以及在服务器运行时监控服务器的运行状态。
  • 单例模式的线程池,避免频繁创建和销毁线程带来的额外开销。
  • 单例模式的数据库(MySQL)连接池,避免频繁创建和销毁连接带来的额外开销。
  • 基于小根堆的定时器,用于清除到期的非活跃的连接。
  • 自定义的可以自动增长的缓冲区,用于读取文件中的数据或者向文件中写数据。
  • 封装epoll函数,使用I/O多路复用监听文件描述符的状态。
  • Python脚本引擎,用于执行Python脚本,并获取Python函数的返回值。
  • 利用正则表达式和状态机解析HTTP请求报文,并路由给相应的处理函数。
  • 根据处理结果和实际情况封装HTTP响应报文,返回给客户端。

MySQL函数库:

  • 对MySQL的增删改查进行了简单的封装,使用户调用MySQL更加方便。MySQL的查询结果统一封装成json字符串返回。

Python脚本:

  • Python内层接口模块(pmysql)对C++ MySQL函数库进行进一步的封装,实现了简单的增删改语句的自动拼接,提供给业务层调用。
  • Python外层接口模块(prouter)会根据HTTP请求的请求方法和URL将请求路由给相应的函数处理。
  • 制定了一个Python业务层开发规范。

程序的可扩展性:

  • 该后端框架可以很容易的更换所操作的数据库,实现和其他数据库的连接(只要按照MySQL函数库的规范重新开发一套C++函数库和Python内层接口模块即可)。
  • 该后端框架可以很容易的更换上层协议,只要重写Connection的process方法调用的process方法,以及Python外层接口模块即可(即把HTTP处理器和prouter模块更换成其他协议的处理器和处理模块即可)。

Ray的优势:

  • C++ 核心服务器的性能良好。
  • 使用Python编写业务逻辑简单快速。
  • 即开即用,无需安装其他的依赖。

项目结构

项目结构主要分为三层:

  • 外层:服务器层。数据报经过一定的解析后,传递给业务层进行处理。
  • 中间层:业务层。调用数据库层的功能,处理传递过来的数据,并将结果封装后返回给服务器层。
  • 内层:数据库层。给业务层提供一些可调用的功能。

在程序运行过程中,服务器层将接收到的数据初步解析后传递给业务层,业务层对数据进行处理,并调用数据库层的功能,得到处理结果。业务层将处理结果封装后返回给服务器层,由服务器层将数据进一步封装后发送给客户端。外层依次调用内层的接口,内层将数据依次返回给外层。

-C++核心服务器
	--HTTP处理器
		---Python外层接口
			----Python业务层
				-----Python内层接口
                	------C++ MySQL函数库
# 从上到下是依次调用的关系
# 数据则从下到上依次返回	

目录结构

# 将boost MySQL Python的相关头文件和库文件放在项目中,是为了方便在没有安装过这些环境的PC上进行编译
-bin				# 一个Ray的demo项目
 --script			# 业务层Python脚本
 --config.ini		# 服务器配置文件
 --server			# 核心服务器(可执行程序)
-boost				# boost.python开发环境(使用boost.python所需文件)
 --include			# boost.python相关头文件
 --lib				# boost.python相关库文件
-MySQL				# MySQL开发环境(连接MySQL所需文件)
 --inlude			# MySQL开发相关头文件
 --lib				# MySQL开发相关库文件
-Python				# Python开发环境(嵌入Python解释器所需文件)
 --include			# Python开发相关头文件
 --lib				# Python开发相关库文件
-script				# 预定义的Python模块
 --mysqllib.so		# C++ MySQL函数动态库
 --pmysql			# 对C++ MySQL函数库进一步封装
 --prouter			# 将HTTP请求路由给相应的函数,并将处理结果返回给HTTP处理器
 --pscript			# 编写的业务层demo(实现简单的用户登录、注册、注销和修改功能)
 --README.md		# 概要说明文件
-server				# C++核心服务器
 --Buffer			# 自动增长的缓冲区
 --Epoll			# epoll相关函数封装
 --Log				# 异步日志系统
 --MySQLPool		# MySQL连接池
 --RunPython		# Python脚本引擎
 --Server			# 通信主循环
 --ThreadPool		# 线程池
 --Timer			# 基于小根堆的定时器
 --Connection		# 客户端连接封装
 --HttpProcess		# HTTP处理器
 --main.cpp			# 主程序(启动程序)
 --test				# 一个简单的客户端代码,可以用于测试服务器
 --config.ini		# 服务器启动时要读取的配置文件
 --CMakeLists.txt	# CMake
 --README.md		# 概要说明文件
-sql				# C++编写的MySQL函数库
 --CMakeLists.txt	# CMake
 --README.md		# 概要说明文件
 --mysqllib.cpp		# C++编写的MySQL库(源文件)
 --mysqllib.so		# C++编写的MySQL库(动态库,由boost导出,可用Python调用)
-.gitignore			# git忽略
-LICENSE			# Apache2.0 开源许可
-README.md			# README.md文件,Ray的概要说明文件

压力测试

测试程序:webbench

由于不同的环境下测试结果相差很大,因此这里不再做统一的测试,用户可自行测试。

项目编译、启动与发布

项目编译

  • server的编译:使用源代码目录下的CMakeLists.txt文件进行编译,编译后生成一个可执行文件server
  • mysqllib的编译:使用源代码目录下的CMakeLists.txt文件进行编译,编译后生成一个动态链接库mysqllib

注意:由于路径的差异或环境的差异,用户可能需要对CMakeLists.txt文件进行一定的修改才能成功编译!!

项目启动

将编译后生成的可执行文件server,服务器配置文件config.ini放在同一个文件夹下。在同级目录下创建script文件夹,将pmysqlprouterpscript模块,以及C++ MySQL函数库文件mysqllib.so都放到该文件夹下。然后在终端中输入./server即可启动服务器。

# 如果配置文件与server不在同一目录下,或Python脚本不在server目录的script文件夹下
# 终端中启动server时要携带参数:
./server 配置文件路径 脚本文件所在文件夹两者顺序不能乱

项目发布

将编写好的业务层Python代码直接放到Ray的script文件夹下,然后将整个项目(包括serverconfig.iniscript)直接压缩打包即可发布。得到发布压缩包后,先打开压缩包,然后使用上述方法即可启动项目。

暂时未实现的目标

  • 添加防火墙功能
  • 实现反向代理

致谢

@ LZF

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

基于C++和Python的后端服务器框架 expand collapse
C++ and 4 more languages
Apache-2.0
Cancel

Releases

No release

Contributors

All

Activities

Load More
can not load any more
C++
1
https://gitee.com/tian-wenzhuo/Ray.git
git@gitee.com:tian-wenzhuo/Ray.git
tian-wenzhuo
Ray
Ray
master

Search

53164aa7 5694891 3bd8fe86 5694891