zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    SQLServer数据库自增长标识列的更新修改操作
    “~/Views/Login/Login.aspx”处的视图必须派生自 ViewPage、ViewPage<TModel>、ViewUserControl 或 ViewUserControl<TModel>。
    关于值类型与列类型不匹配,所需类型是 DataRow"的解决方案
    尝试为文件 F:visual studio 2010kbspaperCMSApp_DataProject.mdf 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
    Django快速开发之投票系统
    super() 的入门使用
    [python]模块及包
    [转]大话后端开发的奇淫技巧大集合
    [.net 多线程]ThreadPool的安全机制
    [.net 多线程]Task
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9410071.html
Copyright © 2011-2022 走看看