当前位置:C++技术网 > 资讯 > 云平台开发架构分析系列:2 云平台技术架构分析

云平台开发架构分析系列:2 云平台技术架构分析

更新时间:2017-06-18 01:20:09浏览次数:1+次

    在文章《云平台项目开发分析系列1:云平台系统基本架构分析》中我们已经分析了基本架构,不过只是从整体层面讲的,并没有从技术层面做个整体的介绍,那么本篇就是介绍技术层面的整体架构。
    我们了解到一共有两个服务器,分别是TCP服务器和Web服务器。web服务器和nginx以及uwsgi配置相关,这在后续我们会详细介绍。我们主要讲解的是TCP服务器技术总体架构。
    作为TCP服务器的基本支撑的通信库,就是libuv库。libuv库的源码、编译方法等各种资料,在我们网站也就是C++技术网都有,需要的可以自己去搜索阅读。
    libuv包装了底层的socket通信,这样让我们省去了大把的时间去写底层代码。不过我们得去熟悉libuv的编程套路,需要熟悉libuv的数据结构和函数。这样也让不熟悉libuv的人也有点费劲。为了屏蔽libuv的细节,这才包装了一层TCP服务类。通过这一层的包装,我们只需要使用这个类,就可以轻松驾驭起TCP服务器。libuv的套路是处处回调。
    在TCP服务类,都已经做好了回调函数的机制。我们只需要关注两个回调函数,那就是新连接和接受数据。当有新客户端连进来的时候,会调用新连接回调函数,这样你可以在回调函数中处理新连接的逻辑,比如可以发一个欢迎的消息。当客户端发数据过来的时候,就在接受数据回调函数里回复客户端数据。那么服务器如何直接发送数据呢?这就是类中提供的发送函数send就可以搞定了。send函数就是把要发送的数据放到发送队列就行了。底层的工作就是收发数据,不需要我们上层来处理。这样一来,TCP服务器开发就变得很简单了。处理好新连接、接受数据和发送数据,一个服务器就可以了。而我们真正要做的开发就是发送的数据。这些数据是我们的业务数据,我们一般都会定义一套业务协议,我们收发的数据就是业务协议数据咯。我们只要将协议数据包正确解析出来,再将数据封装成正确的协议数据包,这就可以了。其他的代码编写就是纯粹的业务逻辑了。
    那么我们的回调函数是如何设置的呢?TCP服务端是怎么跑起来的呢?实际上,我们用一个全局的TCP服务端对象,在启动运行之前,先设置好新连接的回调函数,也就是这个类的一个成员函数。当有了新连接过来的时候,再调用成员函数设置接收数据的回调函数。我这里不列出代码,主要是让你知道这个基本流程。而这个TCP服务类的代码,请看《libuv服务器端包装类源代码分享(修正Linux服务器连续死循环版)》。因为你不会马上就动手研究代码,所以这里主要是讲解实现思路,而不是具体代码。有了思路,你可以用其他方式来实现,而不限于我说的代码。
    上面这部分就是TCP服务类的情况。另外,平台开发需要大量的基础功能,比如数据库操作、日志打印、协议解析、字符串处理、订单处理和xml解析处理等等。所以我们需要实现写好基础函数,在后面开发中就可以轻松使用了。而每一个部分都是一个完整的模块。最后汇总在一起就是基础平台库了。当然,基础平台库不限于上面提出来的内容,还可以扩展到更多,根据需要加入。这里说一个大概就差不多了,细节的实现,各有各的办法,就没有必要说。
    这个基础平台库不仅会提供给TCP服务器使用,还会提供给python导出库使用。python导出库是将C++的代码封装到动态库里,然后导出供python导入使用。我这里暂时将C++导出库给python使用而生成动态库称为python导出库,可能这个叫法有所偏差,所以这里特别解释一下。在导出函数中,我们还是用C++写代码,按照python要求的格式传递参数就行,其他的还是和普通C++代码一样编写,所以可以正常使用基础平台库。
    有了TCP服务类和基础平台库的支持,我们就可以开始写业务逻辑了。我们就利用TCP服务类的几个回调函数来构建核心业务服务器。为了简化开发,我们将TCP服务类封装的通信、基础平台库和核心业务服务器放在单个项目中直接开发了。这样没有更多的进程间或者开发库之间的调用问题,都直接是源码级别的使用。但是如果平台变大了之后,需要更多的人来参与开发,那么一定要将这些模块分为不同的独立运行的项目,将通信服务器和核心业务服务器都独立开来,甚至将核心业务服务器的多项不同的业务也可以单独抽离出来,这样再都以进程间通信的形式进行沟通。显然这样会变得更加复杂,但是可以让多人并发开发变得更加简单。
    本来我也是一个人开发,也赶时间,所以就不分那么多了,放在一起就好了。不过按照模块化的方式写代码,后续再拆分出来也很容易。
    那么核心业务服务器主要做的就是对协议的解析和打包,然后就是根据业务逻辑进行开发。这个就根据不同行业有不同的做法了。我们不在这讨论,而我们讨论的是通用的服务器技术。
    而Web服务器,则就是配置好Nginx服务器,将http请求通过uwsgi转接到web.py搭建的web服务器。这是一系列的参数配置,不是开发范畴,这里就暂时不讨论。而python要写脚本来处理nginx转发过来的http请求。而在处理请求时,如果要涉及到相关业务逻辑,则需要调用我们的python导出库。当然,如果要处理加密情况,可以直接调用第三方python的加密库。在python中使用各种库是轻而易举的事情。使用我们自己的python导出库是用来实现业务功能的。在需要实现设备控制的时候,则调用python导出库的控制函数。我们写的每一个python文件通过配置后,都可以成为一个api接口。这个接口可以调用python导出库。调用了控制函数,传入相关的参数,控制函数就启动消息队列与TCP服务器通信,进行一次通信交互,就将控制指令发送过去,并得到执行结果。接口再返回结果给调用接口的客户端。
    我们系统实现了两套API,一个针对web系统,一套针对APP和微信公众号。都是用python写的脚本代码。
    web后台管理系统则是web开发了,微信公众号是使用asp.net开发的。这两个都是web范畴,我就不具体介绍了。
    最后让大家看看云平台技术架构示意图:
    云平台开发架构分析系列2:云平台技术架构示意图