ICE的Glacier2使用
1、使用Glacier2的步骤:
A、编写一个Glacier2的配置文件,参见样例
B、设置Glacier2的访问鉴权(密码或者证书),passwords文件每行样例"test xxMqsnnDcK8tw" 可以通过openssl的passwd命令创建密码
C、定制Glacier2的session管理对象
D、启动Glacier2,glacier2router --Ice.Config=config
E、修改客户端的配置使用router
F、获取Glacier2.router并创建session
G、附加线程保持session的激活状态
2、Glacire2的配置样例:
Glacier2.InstanceName=MyRouter
Glacier2.Client.Endpoints=tcp -h 5.6.7.8 -p 4063
Glacier2.Client.PublishedEndpoints=tcp -h 5.6.7.8 -p 4064
Glacier2.Server.Endpoints=default
Glacier2.SessionManager=MySessionManager:tcp -h 127.0.0.1 -p 10001
Glacier2.PermissionsVerifier=MySessionVerifier:tcp -h 127.0.0.1 -p 10002
Glacier2.SSLPermissionsVerifier=MySSLSessionVerifier:tcp -h 127.0.0.1 -p 10003
Glacier2.SessionTimeout=60
Glacier2.SessionManager.LocatorCacheTimeout=30
Glacier2.SSLSessionManager.LocatorCacheTimeout=30
Glacier2.CryptPasswords=passwords
Glacier2.AddConnectionContext=1
Glacier2.Client.ForwardContext=1
Glacier2.Server.ForwardContext=1
Glacier2.Trace.Session=1
Glacier2.Client.Trace.Request=1
Glacier2.Filter.Address.Accept=10.0.1.[5,6]:[10000-11000]
Glacier2.Filter.Address.Reject=10.0.1.[5,6]:[10500,10501]
Glacier2.Filter.Category.Accept=cat1 cat2
Glacier2.Filter.Identity.Accept=id1 id2
Glacier2.Filter.AdapterId.Accept=Adapter1 Adapter2
Glacier2.RoutingTable.MaxSize=10000
Glacier2.Filter.ProxySizeMax=10000
3、客户端使用Glacier2
A、配置默认router:Ice.Default.Router=MyRouter/router:tcp -h 5.6.7.8 -p 4063
B、关闭ACM,Ice.ACM.Client=0 Ice.RetryIntervals=-1
C、创建Session
Ice::RouterPrx defaultRouter = communicator->getDefaultRouter();
Glacier2::RouterPrx router = Glacier2::RouterPrx::checkedCast(defaultRouter);
Glacier2::SessionPrx session = router->createSession(username, password); //创建基于密码方式的session
Glacier2::SessionPrx sslSession = router->createSessionFromSecureConnection(); // 基于ssl的证书方式创建session
D、创建额外的线程,在线程中隔段时间调用router->refreshSession()来确保session的存活
也可以通过调用session对象的ice_ping()方法来刷新session的过期时间
E、为了能够让服务器端使用回调,客户端试图传递一个回调的代理对象CallBackPrx给服务器端,让服务器端在合适的时机来进行回调
首先需要有一个adapter,其router已经设置,可动态创建createObjectAdapterWithRouter,也可静态配置
CallbackAdapter.Router=Glacier2/router:tcp -h 5.6.7.8 -p 4063
F、在该adapter上增加CallBack对象,返回CallBackPrx对象,可以通过各种方式传递给服务器端
G、如果在客户端会存在一个嵌套的调用,即客户端在处理请求的同时需要处理回调,注意一定要增加客户端的线程数Client.ThreadPool.Size
H、有时客户端为了简化代码逻辑处理,可以使用Glacier2::Application类来编程程序,其自动获取router代理和管理session
class Application : public Ice::Application
{
public:
Application();
Application(Ice::SignalPolicy policy);
virtual int runWithSession(int argc, char* argv[]) = 0; // 成功返回0,非0表示失败
virtual Glacier2::SessionPrx createSession() = 0; // 创建session对象
virtual void sessionDestroyed(); // 释放session
static Glacier2::RouterPrx router(); // 获取router代理
static Glacier2::SessionPrx session(); // 获取创建好的session代理
void restart();
std::string categoryForClient(); // 获取session的分类
Ice::Identity createCallbackIdentity(const std::string& name); // 获取一个回调对象的ID
Ice::ObjectPrx addWithUUID(const Ice::ObjectPtr& servant); // 加入一个回调处理对象,返回回调代理
Ice::ObjectAdapterPtr objectAdapter(); // 获取用于回调的adapter
};
4、服务器端使用Glacier2
A、实现Glacier2的session管理
class MySessionManagerI : public Glacier2::SessionManager
{
public:
virtual ::Glacier2::SessionPrx create(const std::string& User, const ::Glacier2::SessionControlPrx&, const ::Ice::Current& current);
};
class MySSLSessionManagerI : public Glacier2::SSLSessionManager
{
public:
virtual ::Glacier2::SessionPrx create(const ::Glacier2::SSLInfo&, const ::Glacier2::SessionControlPrx&, const ::Ice::Current& current);
};
B、注意在上述session管理对象的create方法中,必须返回一个Session的代理对象,该session的代理对象必须要包含对应的router属性
可以通过current.adapter->addWithUUID(new MySession);获得
C、实现Session对象接口
class MySession : public ::Glacier2::Session
{
public:
virtual void destory();
};
D、实现Glacier2的鉴权接口,当然你也可以使用ssl的鉴权方式
class MySessionVerifier : public Glacier2::PermissionsVerifier
{
public:
bool checkPermissions(string userId, string password, out string reason);
};
class MySSLSessionVerifier : public Glacier2::SSLPermissionsVerifier
{
public:
bool authorize(SSLInfo info, out string reason);
}
E、可以在SessionManager的create方法中通过SessionControlPrx对象动态的设置session的访问过滤
interface SessionControl {
StringSet* categories();
StringSet* adapterIds();
IdentitySet* identities();
void destroy();
ICE的Glacier2使用的更多相关文章
- ZeroC Ice 暂记
摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...
- Ice简介+Qt代码示例
1.ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,它封装并 ...
- ICE的连接机制
1.当使用ICE的proxy进行方法调用时,ICE运行环境会建立一个到服务器的连接.当proxy提供了多个endpoint时 默认的ICE运行环境选择endpoint的行为为random,可以通过 ...
- 高性能分布式应用开发中间件ICE介绍
作为一个技术人员,你是否在为不断增长的数据量和日益复杂的业务逻辑而头疼不已,杂乱堆砌在一起的庞大业务让系统越来越脆弱,于是你想到了网格,想到了利用分布式来重组一个健壮的系统架构. 随后,RMI,EJB ...
- Ice框架介绍
概述 Ice是一个开源的综合性RPC框架,以高性能和原生支持微服务的架构而著称.提供了很多可以直接使用的组件,如注册中心IceGrid,部署工具IcePatch2,防火墙穿透Glacier2,发布订阅 ...
- ZeroC Ice启用SSL通讯的配置
Zeroc ICE ( Internet Communications Engine )中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯 ...
- 第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数
1.linux find export find /Applications/Xcode.app/ -name symbolicatecrash -type f export DEVELOPER_DI ...
- c#Ice开发之环境配置(一)
第一步,基于Windows下的安装,所以下载windows版的Ice,官网最新版本是Ice3.5.1: http://www.zeroc.com/download/ 安装完成可以在vs-工具的最下面看 ...
- Ice分布式程序设计—IceBox(Hello World Application)
忙了三天,总算浏览完此书.藉此记下 Ice 的 IceBox 服务框架. 在此用 IceBox 框架写 Hello World 程序,即以载体来体现其特性. 第一步:编写 Slice 文件,映射生成 ...
随机推荐
- django内容总结
一.django请求的生命周期 1.django请求生命周期如图所示 2.django本身没有socket,客户端请求先到达wsgi然后再提交给django,而wsgi的本质就是个socket程序 注 ...
- django-admin 登录之后显示页面,表是否显示
如果是超级用户可以全部看到(如图),如果是普通用户,只能看到user与group 虽然实现了其功能,不过有些地方没搞懂,所以有些地方出了写的不好 ```class PermissionsMixin(m ...
- MyEclipse工具栏的隐藏与显示及自定义
Myeclipse的工具栏 1.隐藏 工具栏---->右键---->hide toolbar 2.显示 window ----> show toolbar 3.自定义 ...
- 分布式计算开源框架Hadoop入门实践(三)
Hadoop基本流程 一个图片太大了,只好分割成为两部分.根据流程图来说一下具体一个任务执行的情况. 在分布式环境中客户端创建任务并提交. InputFormat做Map前的预处理,主要负责以下工作: ...
- 合并apk和odex 为完整的apk安装文件
from:http://bbs.hiapk.com/thread-1151284-1-1.html 文件夹:<ignore_js_op> 文件夹拖放到odex.cmd,出现下面的窗口后,按 ...
- Objective-C系列总结之基础知识
//第一个程序示例 #import <Foundation/Foundation.h> int main(int argc,const char * argv[]) { @autorele ...
- 【HackerRank】 有洞的地图
给你一个n*n的地图.地图中的每个格子有一个值表示该地区的深度.我们称一个地图中的一个格子为空洞,当且仅当该格子不在地图边缘并且每个和它相邻的格子都具有比它更小的深度.两个格子称为相邻如果它们共有一条 ...
- python中完善decorator
@decorator可以动态实现函数功能的增加,但是,经过@decorator“改造”后的函数,和原函数相比,除了功能多一点外,有没有其它不同的地方? 在没有decorator的情况下,打印函数名: ...
- phpMyAdmin中config.inc.php设置密码和修改密码的方法
phpMyAdmin有3种授权模式: 1. cookie: 显示一个web登录页面,输入mysql的用户名和密码,然后进入管理界面. $cfg['Servers'][$i]['auth_type'] ...
- 【P2401】不等数列(DP)
这个题乍一看就应该是DP,再看一眼数据范围,1000..那就应该是了.然后就向DP的方向想,经过对小数据的计算可以得出,如果我们用f[i][j]来表示前i个数有j个是填了"<" ...