您的位置:首页 > 其它

用Glacier2进行事务管理

2016-02-15 11:46 260 查看
用Glacier2进行事务管理

介绍

Glacier是一个ICE特有的应用层防火墙和路由器,它提供了安全,路由消息和事务管理等功能.这篇文章只讲述

Glacier2事务管理和用户认证方面的内容.如果想了解更详细的关于安全的高级应用,请阅读ICE的文档.

大部分计算机的应用都是基于事务这个概念的,比如:

一个用户坐在电脑前,登录进他的电脑,做了一些事情,然后登出系统.

一个玩家登录到他喜爱的网络游戏晨,玩了一会儿,然后退出吃晚饭.

上面的示例都涉及到了某种形式的事务.事务操作很每繁琐,初始化每种必要的状态,提供在事务中处理逻辑的接口,最后在事务结束时还要保证所有的资源被释放.Glacier2提供了套基础设置,让你可以在你的应用中很容易的就整合进事务功能.

后面我将给出一个例子:一个简单的聊天系统.一个聊天服务器包含了一个聊天室里所有用户的列表,当聊天室里的一个用户发送了一条消息时,服务器把这条消息转发给其它所有的用户.这个服务器就是依赖于Glacier2的事务功能.

事务的生命周期:

每一个事务都应该有这样的生命周期:

1.认证.

2.创建事务.

3.使用事务.

4.注销事务.

认证:

Glacier2提供了一种认证机制,以创建事务前验证用户的用户名和密码.要使用认证功能,你的应用必须实现Glacier2::PermissionsVerifier接口,并提供了个访问这个接口的代理实例.Glacier2调用checkPermissions操作来验证用户名和口令,如果应用通过这个用户的验证的话,必须返回true.如果返回false,还可以通过事务的返回参数说明具体的失败原因.

现实中的聊天室可能在系统的数据库里验证用户名和口令,

// Slice

interface PermissionsVerifier

{

nonmutating bool

checkPermissions(string userId,

string password,

out string reason);

};

// C++

class DummyPermissionsVerifierI

: public Glacier2::PermissionsVerifier

{

public:

virtual bool

checkPermissions(const string& userId,

const string& passwd,

string&,

const Current&) const

{

return true;

}

};

你要实例化一个PermissionsVerifier提供给Glacier2,并把它注册给对象适配器,并通过设置配置文件里的Glacier2.PermissionsVerifier属性自动加载.

// Server Configuration

ChatServer.Endpoints=tcp -h 127.0.0.1 -p 10001

// C++

CommunicatorPtr communicator = ...

ObjectAdapterPtr adapter = communicator->

createObjectAdapter(“ChatServer”);

adapter->add(new DummyPermissionsVerifierI,stringToIdentity(“verifier”));

// Glacier2 Configuration

Glacier2.PermissionsVerifier=verifier:tcp -h

127.0.0.1 -p 10001

大家可以看到,真正的chatServer用的是本机地址,而Glacier2起动时则是挂的外网的IP,你是不是已经看到一个游戏服务器集群的影子.Glacier2成了客户机和服务器之间的桥梁,G和S之间一般在内网内,可以不要保护,你可以通过配置文件来让C和G之前使用SSL.不过没有哪个游戏中这么做吧.自己考虑吧.

创建事务

好,现在基本的结构已经知道了,那我们来看看如何创建事务.

为了让G2创建事务,我们的应用程序要实现Glacier2::SessionManager接口.当认证通过后,G2会调用这个接口的创建方法来创建一个事务.

// Slice

module Glacier2

{

interface Session

{

void destroy();

};

interface SessionManager

{

Session* create(string userId)

throws CannotCreateSessionException;

};

};

// C++

class ChatRoomSessionManagerI

: public Glacier2::SessionManager

{

public:

virtual Glacier2::SessionPrx

create(const string& userId,

const Current& current)

{

return Glacier2::SessionPrx::

uncheckedCast(

current.adapter->addWithUUID(

new ChatSessionI(userId)));

}

};

同样的,你的应用程序要把这个接口添加到适配器里,然后在配置文件里告诉接口的名字.

// C++

ObjectAdapterPtr adapter = ...;

adapter->add(

new ChatSessionManagerI,

stringToIdentity("ChatSessionManager"));

// Glacier2 Configuration

Glacier2.SessionManager=ChatSessionManager:tcp -h

127.0.0.1 -p 10001
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: