ICE的事务管理

这篇算是原创和翻译的混合吧,把我阅读ICE文档的一些心得和大家分享.

用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  - 127.0 . 0.1   - 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   - 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   - 10001

休息一下,下面是使用事务,明天再写吧.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值