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使用的更多相关文章

  1. ZeroC Ice 暂记

    摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...

  2. Ice简介+Qt代码示例

    1.ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,它封装并 ...

  3. ICE的连接机制

    1.当使用ICE的proxy进行方法调用时,ICE运行环境会建立一个到服务器的连接.当proxy提供了多个endpoint时   默认的ICE运行环境选择endpoint的行为为random,可以通过 ...

  4. 高性能分布式应用开发中间件ICE介绍

    作为一个技术人员,你是否在为不断增长的数据量和日益复杂的业务逻辑而头疼不已,杂乱堆砌在一起的庞大业务让系统越来越脆弱,于是你想到了网格,想到了利用分布式来重组一个健壮的系统架构. 随后,RMI,EJB ...

  5. Ice框架介绍

    概述 Ice是一个开源的综合性RPC框架,以高性能和原生支持微服务的架构而著称.提供了很多可以直接使用的组件,如注册中心IceGrid,部署工具IcePatch2,防火墙穿透Glacier2,发布订阅 ...

  6. ZeroC Ice启用SSL通讯的配置

    Zeroc ICE ( Internet Communications Engine )中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯 ...

  7. 第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数

    1.linux find export find /Applications/Xcode.app/ -name symbolicatecrash -type f export DEVELOPER_DI ...

  8. c#Ice开发之环境配置(一)

    第一步,基于Windows下的安装,所以下载windows版的Ice,官网最新版本是Ice3.5.1: http://www.zeroc.com/download/ 安装完成可以在vs-工具的最下面看 ...

  9. Ice分布式程序设计—IceBox(Hello World Application)

    忙了三天,总算浏览完此书.藉此记下 Ice 的 IceBox 服务框架. 在此用 IceBox 框架写 Hello World 程序,即以载体来体现其特性. 第一步:编写 Slice 文件,映射生成 ...

随机推荐

  1. List contents of directories in a tree-like format

    Python programming practice. Usage: List contents of directories in a tree-like format. #!/usr/bin/p ...

  2. Python之函数2 嵌套,作用域和闭包(Day12)

    一.函数对象 1.函数是第一类对象,即函数可以当做数据传递 1.1 可以被引用 1.2 可以当做参数传递 1.3 返回值可以是函数 1.4 可以当做容器类型的元素 二.函数的嵌套 1.函数嵌套的调用: ...

  3. python区分大小写吗

    如果能区分像myname和Myname这样的标识符,那么它就是区分大小写的.也就是说它很在乎大写和小写. myname='Ayushi' print(Myname) Traceback (most r ...

  4. SpringMVC:学习笔记(7)——验证器(JSR303)

    JSR 303(Bean Validation ) 说明: 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情.应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是 ...

  5. HibernateQL

    查询语言---QL(Query Language)   NativeSQL-------功能最强大 HQL--Hibernate QL EJB QL (JP QL)---HQL的一个子集 QBC--- ...

  6. 配置树莓派3和局域网NTP服务器实现内网时间校准

    一.配置局域网NTP服务器 1.安装ntp-4.2.8p5-win32-setup.exe 下载地址:https://www.meinbergglobal.com/english/sw/ntp.htm ...

  7. 【Head First Servlets and JSP】笔记17:JSP所生成的servlet相关问题

    1.容器根据你所写的JSP生成一个类, /* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat ...

  8. Hadoop单机搭建

    单机Hadoop搭建 1.下载hadoop-2.7.3.tar.gz http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.3/h ...

  9. MongoDB部署指南

    下載安裝包 http://www.mongodb.org/ 安裝MongoDB systemLog: destination: file path: E:\MongoDB\log\mongo.log ...

  10. ACM训练小结-2018年6月16日

    今天题目情况如下:A题:线段树+XOR性质.情况:由于写法问题,调试困难,浪费大量时间.B题:(对所有满足i mod p==q,求a[i]之和),无修改,直接上n*sqrt(n)的分块写法.情况:由于 ...