这篇算是原创和翻译的混合吧,把我阅读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
-
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
休息一下,下面是使用事务,明天再写吧.