用Glacier2进行事务管理

来源:互联网 发布:protobuffer java 编辑:程序博客网 时间:2024/06/05 03:08
用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
 
1 0
原创粉丝点击