RakNet--Rackspace interface

Jenkins Software

Rakspace 云服务器API的C++接口

用编程的方式管理应用服务器

       Rakspace提供了基于API的HTTPS,具体的API信息可以在连接中找到(http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf)。使用TCPInterface时,RakNet支持HTTPS,编译时需要将RakNetDefines.h中的OPEN_SSL_CLIENT_SUPPORT定义为1。

 

设置:

#include "Rackspace.h"

#include "TCPInterface.h"

RakNet::Rackspace rackspaceApi;

RakNet::TCPInterface tcpInterface;

RakNet::RackspaceEventCallback_Default callback;

tcpInterface.Start(0, 0, 1);

rackspaceAPI.Authenticate(&tcpInterface, "myAuthURL", "myRackspaceUsername", "myRackspaceAPIKey");

while (1)

{

       for(RakNet::Packet *packet=tcpInterface.Receive(); packet; tcpInterface.DeallocatePacket(packet), packet=tcpInterface.Receive())

       rackspaceApi.OnReceive(packet);

       rackspaceApi.OnClosedConnection(tcpInterface.HasLostConnection());

}

 

 

       前面三行分别创建了一个TCPInstance实例,Rackspace实例,以及Rackspace的事件处理器。第四行启动了TCPInterface类,那么可以初始化对外的连接。调用Authenticate()方法,日志记录在Rackspace(这块不知道这么翻译合适不合适,我不太理解这块的代码),存储一个密钥用于下面一系列的操作。了解Authenticate()函数的参数更多内容参考Rackspace.h的注释。在内部循环中的两行给Rakspace类传递连接事件。

       假设验证成功,Authenticate会返回一些除了UNASSIGNED_SYSTEM_ADDRESS值以外的其他值,以表明连接完成。那么之后要获取回调函数OnAuthenticationResult,这个回调处理设置给RET_Success_204的事件类型。这完成之后,你可以调用Rackspace类给出的函数方法。

       如果连接立即关闭,没有来自服务器的任何响应,那你可能是在编译时忘记了将RakNetDefines.h或RakNetDefinesOverrides.h中的OPEN_SSL_CLIENT_SUPPORT设置为1。

 

列出镜像的例子:

rackspaceApi.ListImages();

 

       等待回调OnListImagesResult(RackspaceEventType eventType, const char * htmlAdditonalInfo)

       正如在devguide中描述的一样,回调会返回HTML事件码,200, 203, 400, 500, 503, 401, 400,或413。200和203表示成功。事件码会在eventType参数中返回。真正的HTML信息会在htmlAdditionalInfo变量中。例子输出:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
vary: Accept, Accept-Encoding, X-Auth-Token
Last-Modified: Tue, 29 Mar 2011 22:41:36 GMT
X-PURGE-KEY: /570016/images
Cache-Control: s-maxage=1800
Content-Type: application/xml
Content-Length: 1334
Date: Sat, 02 Apr 2011 15:15:19 GMT
X-Varnish: 601046147
Age: 0
Via: 1.1 varnish
Connection: keep-alive
 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><images xmlns="http://doc
s.rackspacecloud.com/servers/api/v1.0"><image name="Windows Server 2008 R2 x64 -
MSSQL2K8R2" id="58"/><image name="Fedora 14" id="71"/><image name="Red Hat Enterprise Linux 5.5" id="62"/><image name="Windows Server 2003 R2 SP2 x86" id="29"/
><image name="Oracle EL Server Release 5 Update 4" id="40"/><image name="Windows
Server 2003 R2 SP2 x64" id="23"/><image name="Gentoo 10.1" id="19"/><image name
="Windows Server 2008 SP2 x86" id="31"/><image name="Windows Server 2008 SP2 x64
- MSSQL2K8R2" id="57"/><image name="Ubuntu 9.10 (karmic)" id="14362"/><image na
me="Ubuntu 10.04 LTS (lucid)" id="49"/><image name="Arch 2010.05" id="55"/><imag
e name="Oracle EL JeOS Release 5 Update 3" id="41"/><image name="Ubuntu 8.04.2 L
TS (hardy)" id="10"/><image name="CentOS 5.4" id="187811"/><image name="Fedora 1
3" id="53"/><image name="Windows Server 2008 SP2 x64" id="24"/><image name="Cent
OS 5.5" id="51"/><image name="Ubuntu 10.10 (maverick)" id="69"/><image name="Win
dows Server 2008 R2 x64" id="28"/><image name="Windows Server 2008 SP2 x86 - MSS
QL2K8R2" id="56"/><image name="Red Hat Enterprise Linux 5.4" id="14"/><image nam
e="Debian 5.0 (lenny)" id="4"/><image name="Ubuntu256MBBigPacketTest" id="943818
4"/><image name="RakNet-setup" id="9019637"/></images>

 

       RakNet不能帮你解析XML。如果你自己没有XML解析器,你可以在DependentExtenstions\XML下找到一个XML解析器。

      

执行用户命令:

       Rackspace提供了一个XML模式,这个模式带有API的操作和参数的列表。有一些命令比Rackspace类提供的命令要复杂。对于这些命令,可以直接调用Rackspace::AddOperaton()。例如,如下是一个创建服务器的命令:

RakNet::RakString xml("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"

"<server xmlns=\"http://docs.rackspacecloud.com/servers/api/v1.0\" name=\"%s\" imageId=\"%s\" flavorId=\"%s\">" "</server>" , name.C_String(), imageId.C_String(), flavorId.C_String());
AddOperation(RO_CREATE_SERVER, "POST", "servers", xml);

 

       例如,可以扩展XML支持加载一个镜像文件

 

使用RakNet进行服务器管理的例子:

       重新启动崩溃的服务器 — 运行一个主服务器来监控其他的服务器。主服务器可以使用一个固定IP地址,或者可以使用DynDNS(这个也是一个C++ DynDNS类,位于/Source目录下)。当你启动一个Rackspace服务器时,让Rackspace服务器连接到主服务器。如果主服务器在某一点得到了ID_CONNECTON_LOST,让主服务器调用Rackspace::RebootServer,重新启动这个崩溃的服务器。

       匹配能力 – 再次运行一个主服务器,使用CloudServer和CloudClient插件,通知主服务器每一个Rackspace服务器当前连接的负载。如果所有的服务器都满了或者接近要满了。使用Rackspace::CreateServer基于你应用程序的系统镜像创建新的服务器实例。相似地,如果服务器完全是空的,没有玩家在该服务器上登录,可以使用Rackspace::DeleteServer()方法删除空服务器,以节省服务器花费开销。

See Also

 

Index
Cloud Computing
Cloud Hosting
TCP Interface
posted @ 2012-09-17 01:13  杂草  阅读(431)  评论(1编辑  收藏  举报