Ice IceBox

IceBox是什么

一种易于使用的 Ice 应用服务框架

Service Configurator 模式

  • 这种技术可用于配置服务、并把对它们的管理集中在一起。
  • 用实践中的术语说,这意味着服务被开发成可动态加载的组件,并且可以按照需要,以任何一种组合方式配置进一个通用的 “超级服务器”中。
  • IceBox 是 Service Configurator 模式的一种用于 Ice 服务的实现。

IceBox优点

1.优化:你可以对同一个IceBox服务器加载的多个服务进行配置,利用Ice的并置优化。
  例如:如果一个服务是另一个服务的客户,而这两个服务驻留在同一个 IceBox 服务器中,那么在它们之间进行的调用就可以优化。
2.解耦:要把多个服务组合成一个应用,可以通过配置、而不是编译和链接来完成。
  这解除了服务和服务器的耦合,允许你按照需要组合服务或分离服务。
3.节省资源:在 Java Virtual Machine (JVM) 的单个实例中,可以有多个活动的 Java 服务。
  与在多个 JVM 中分别运行一个整体式的服务器相比,上面的这种做法能够节省操作系统资源。
4.集中式管理:各个服务要实现 IceBox 服务接口,为开发者提供了一个公共框架,以及一个集中式的管理设施。
5.支持:在服务器激活和部署服务 IcePack 中集成了 IceBox 支持。

服务管理器

IceBox::ServiceManager

这个对象负责加载和初始化服务,并执行客户所要求的管理动作。
ServiceManager 接口只支持 shutdown,用于终止服务、关闭 IceBox 服务器。

端点配置

IceBox.ServiceManager.Endpoints=tcp -p 10000

客户配置

ServiceManager.Proxy=ServiceManager:tcp -p 10000

管理实用程序

Usage: iceboxadmin [options] [command...]
        Options:
-h, --help
-v, --version
Commands:
shutdown
Show this message.
Display the Ice version.
Shutdown the server.

开发服务

要编写 IceBox 服务,需要实现某个 IceBox 服务接口。

module IceBox {
       local interface ServiceBase {
           void stop();
       };
       local interface Service extends ServiceBase {
           void start(string name,
           Ice::Communicator communicator,
           Ice::StringSeq args)throws FailureException;
       };
};
你可以看到,服务只需实现两个操作:start 和 stop。这些操作由服务管理器调用; 
start 在服务加载后被调用。
stop 在服务关闭时被调用。

配置服务器

1.要把服务配置进 IceBox 服务器中,只需使用一个属性。这个属性的用途有好几个:  
    定义服务的名字
    向服务管理器提供服务进入点
    定义用于服务的属性和参数
2.下面是这个属性的格式:
    IceBox.Service.name=entry_point [args]
        * name 是服务名。这个名字会传给服务的start操作,在配置进同一个 IceBox 服务器的所有服务中必须是唯一的。
        用不同的名字加载同一个服务的两个或多个实例是可能的,尽管你很少需要这么做。
        * 属性值的第一个参数用于指定进入点。对于 C++ 服务,其形式必须是 library:symbol
            - library 是服务共享库或 DLL 的简单名字,而 symbol 是进入点函数的名字。
            - 我们所说的 “简单名字”是指,没有任何与特定平台有关的前缀或扩展名的名字;服务管理器会根据平台附加适当的前缀或扩展名。
            - 例如:简单名字 MyService 在 Windows 上对应的是名为 MyService.dll 的 DLL,
                        在 Linux 上对应的是名为 libMyService.so 的共享库。共享库或 DLL 所在的目录必须出现在Windows 上的 PATH 或 POSIX 系统上的 LD_LIBRARY_PATH 中。
        * 对于 Java 服务,进入点就是服务实现类的完整类名 (包括任何 package)。
            - 这个类必须位于 IceBox 服务器的类路径上。
            - 跟在 entry_point 后面的任何参数都会被检查。
            - 如果某个参数的形式是 --name=value,它就会被解释为属性定义,将会出现在传给服务的 start 操作的通信器的属性集中。这些参数将被移除,剩下的参数会放在 args 参数中传给 start 操作。

C++ 例子

IceBox.Service.Hello=HelloService:create \
--Ice.Trace.Network=1 hello there
    使用这个配置,将会创建一个名为 Hello 的服务。 
    这个服务应当位于 HelloService.dll (Windows)或 libHelloService.so (Linux) 中
    进入点函数 create 会被调用,创建服务的一个实例。
    参数 -- Ice.Trace.Network=1被转换成属性定义, 
    参数hello和there则会成为传给 start 方法的 args 序列参数中的两个元素。

Java 例子

IceBox.Service.Hello=HelloServiceI \
--Ice.Trace.Network=1 hello there
    使用这个配置,将会创建一个名为 Hello 的服务。
    这个服务应当位于 HelloServiceI 类中。 
    参数 --Ice.Trace.Network=1 被转换成属性定义, 
    参数 hello 和 there 则会成为传给 start 方法的 args 序列参数中的两个元素。

Freeze 配置

Freeze 服务支持一个额外的配置属性,用于定义服务管理器创建 Freeze数据库环境所用的目录的路径名:

IceBox.DBEnvName.name=path
    属性键的 name 部分是服务名。

共享一个通信器

IceBox.UseSharedCommunicator=1

加载服务

在缺省情况下,服务管理器加载服务的次序是不确定的,也就是说,同一个 IceBox 服务器中的各个服务不应该相互依赖。 
如果多个服务必须按照特定的次序加载,可以使用 IceBox.LoadOrder 属性:
    IceBox.LoadOrder=Service1,Service2
在这个例子中, Service1 首先加载,接着是 Service2。剩下的其他服务在 Service2 之后以不确定的次序加载

Freeze 服务

module IceBox {
        local interface FreezeService extends ServiceBase {
            void start(string name,
                       Ice::Communicator communicator,
                       Ice::StringSeq args,
                       Freeze::DBEnvironment dbEnv) throws FailureException;
        };
};

启动IceBox

启动C++服务器

    IceBox.ServiceManager.Endpoints=tcp -p 10000
    IceBox.Service.Hello=HelloService:create
    Hello.Endpoints=tcp -p 10001

注意,我们为 Hello 服务创建的对象适配器定义了一个端点。
假定这些属性位于名为 config 的配置文件中,我们可以这样启动 C++ IceBox 服务器:
$ icebox –Ice.Config=config

启动Java服务器

    IceBox.ServiceManager.Endpoints=tcp -p 10000
    IceBox.Service.Hello=HelloServiceI
    Hello.Endpoints=tcp -p 10001

假定这些属性位于名为 config 的配置文件中,我们可以这样启动 Java IceBox 服务器:
$ java IceBox.Server –Ice.Config=config

在启动时, IceBox 服务器会检查它的配置,查找所有具有前缀 IceBox.Service 的属性,并初始化每个服务。如果某个服务的初始化失败了, IceBox 服务器会调用任何已初始化的服务的 stop 操作,报告错误并终止。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
zero ICE快速入门文档, ice是最优秀的rpc框架。 4、开发服务端代码如下 步骤一:编写Servant类即带有Disp的存根文件也就是说继承_HelloWorldDisp 这个类,这个类是个抽象类定义如下: public abstract class _HelloWorldDisp extends Ice.ObjectImpl implements HelloWorld{} servant类是ice所定义的接口,在服务器端的实现类。我们在该类中可以编写服务器端对请求的具体处理。 代码如下: package myHelloWorld.server; import Ice.Current; import myHelloWorld._HelloWorldDisp; public class HelloWorld_gaojs extends _HelloWorldDisp{ private static final long serialVersionUID = 1L; public void say(String s, Current __current) { System.out.println("Hello World!"+" the string s is " + s); } } 步骤二:创建远程的服务器类 package myHelloWorld.server; public class ServerStart { /** * @param args */ public static void main(String[] args) { int status = 0; // Communicator实例,是ice run time的主句柄 Ice.Communicator ic = null; try { // 调用Ice.Util.Initialize()初始化Ice run time System.out.println("初始化ice run time..."); ic = Ice.Util.initialize(args); // args参数可传可不传 // 创建一个对象适配器,传入适配器名字和在10000端口处接收来的请求 System.out.println("创建对象适配器,监听端口10000..."); Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints( "SimplePrinterAdapter", "default -p 10000"); // 实例化一个PrinterI对象,为Printer接口创建一个servant System.out.println("为接口创建servant..."); Ice.Object object = new HelloWorld_gaojs(); // 调用适配器的add,告诉它有一个新的servant,传递的参数是刚才的servant,这里的“gaojs”是Servant的名字 System.out.println("对象适配器加入servant..."); adapter.add(object, Ice.Util.stringToIdentity("gaojs")); // 调用适配器的activate()方法,激活适配器。被激活后,服务器开始处理来自客户的请求。 System.out.println("激活适配器,服务器等待处理请求..."); adapter.activate(); // 这个方法挂起发出调用的线程,直到服务器实现终止为止。或我们自己发出一个调用关闭。 ic.waitForShutdown(); } catch (Ice.LocalException e) { e.printStackTrace(); status = 1; } catch (Exception e) { e.printStackTrace(); status = 1; } finally { if (ic != null) { ic.destroy(); } } System.exit(status); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值