关闭

WebLogic RMI 编程(五)

1468人阅读 评论(0) 收藏 举报

为 RMI-IIOP 配置 WebLogic Server

以下部分描述与 为 RMI-IIOP 配置 WebLogic Server 相关的概念和过程:

 


设置监听地址

为简化 IIOP 的使用过程,请始终在配置文件中 (config.xml) 为“监听地址”特性指定有效的 IP 地址或 DNS 名称以监听连接。

“监听地址”的默认值 null 允许它“监听所有配置的网络接口”。但是,此功能仅适用于 T3 协议。如果需要配置多个监听地址供 IIOP 协议使用,则请使用配置网络资源中描述的“网络通道”功能。

 


设置网络通道地址

以下部分提供了在为瘦客户端实现 IIOP 网络通道地址时需考虑的信息。

有关代理和防火墙的注意事项

很多典型的环境都使用防火墙、代理或其他设备,它们隐藏了应用服务器的真实 IP 地址。由于 IIOP 依赖于按对象的寻址机制(其中每个对象都包含一个主机和端口),因此对真实 IP 地址使用掩码的任何操作都将使外部客户端无法保持其连接。为避免出现这种情况,请将服务器 IIOP 网络通道上的 PublicAddress 设置为客户端所看到的虚拟 IP。

有关具有多个连接的客户端的注意事项

IIOP 客户端会发布应用程序服务器建立连接所用的寻址信息。在某些情况下,如运行客户端具有多个连接的 VPN 时,服务器无法看到客户端发布的 IP 地址。这种情况下,有两个选择:

  • 使用 IIOP 的双向形式。使用下列 WebLogic 标志:
    -Dweblogic.corba.client.bidir=true

    此例中,服务器并不需要客户端发布的 IP 地址,因为服务器对出站请求使用入站连接。

  • 使用下列 JDK 属性设置服务器对出站连接使用的地址:
    -Dcom.sun.CORBA.ORBServerHost=client_ipaddress

    其中,client_ipaddress 是客户端发布的一个地址。

 


使用 IIOPS 瘦客户端代理

IIOP 瘦客户端代理为 WebLogic 瘦客户端提供了将出站请求代理至服务器的能力。这种情况下,每个用户都是通过其代理来路由全部出站请求。用户的代理随后会将此请求定向至 WebLogic Server。在实现网络通道不可行时,应使用此方法。要启用代理,请设置下列属性:

   -Diiops.proxyHost=<host>
   -Diiops.proxyPort=<port>

其中:

  • hostname 是用户的代理服务器的网络地址。
  • port 是端口号。如果未明确设置,则端口号的值设置为 80。
  • hostnameport 支持符号名称,如:
    -Diiops.proxyHost=https.proxyHost
    -Diiops.proxyPort=https.proxyPort

应考虑以下安全影响:

  • 此功能并不更改 WebLogic Server 的行为。但是,使用此功能确实会通过客户端的防火墙公开 IP 地址。由于连接的两端都受信任,并且链接信息是加密的,因此对于很多环境来说,这是一个可接受的安全级别。
  • 有些生产环境不允许在代理服务器上启用 CONNECT 特性。这些环境应使用 HTTPS 隧道。有关详细信息,请参阅“配置和管理 WebLogic Server”中的设置 WebLogic Server 以使用 HTTP 隧道

 


在 SSL 和 Java 客户端中使用 RMI-IIOP

支持 SSL 的 Java 客户端为瘦客户端和 WLS-IIOP 客户端。要在这些客户端上使用 SSL,只需指定一个 SSL URL。

 


通过委托从 CORBA 客户端访问 WebLogic Server 对象

WebLogic Server 提供了使 CORBA 客户端能够访问 RMI 远程对象的服务。作为备用方法,还可以在 WebLogic Server 上承载 CORBA ORB(对象请求代理)并委托传入和传出的消息,以允许 CORBA 客户端间接调用可绑定在服务器中的任何对象。

委托概述

以下是创建对象(以使这些对象通过协同工作可以将 CORBA 调用委托给 WebLogic Server 上承载的一个对象)的主要步骤。

  1. 创建一个启动类,它负责创建和初始化 ORB,以使 ORB 与运行 WebLogic Server 的 JVM 共存。
  2. 创建 IDL(接口定义语言),它将创建用于接收来自 ORB 的传入消息的对象。
  3. 编译此 IDL。这将生成许多类,其中将有一个类是 Tie 类。Tie 类用于服务器端,可处理传入的调用,并将调用调度至适当的实现类。实现类负责连接到服务器、查找适当的对象,并代表 CORBA 客户端调用对象上的方法。

图 8-1 是一个 CORBA 客户端调用 EJB(通过将调用委托给连接到服务器并在 EJB 上操作的一个实现类)的图表。使用类似的体系结构,相反的情况也适用。您可以有一个启动类,它负责启动 ORB 和获取对感兴趣的 CORBA 实现对象的引用。此类可将自己提供给 JNDI 树中的其他 WebLogic 对象,并将适当的调用委托给 CORBA 对象。

图 8-1 通过委托调用来调用 EJB 的 CORBA 客户端

通过委托调用来调用 EJB 的 CORBA 客户端

 

委托示例

以下代码示例创建了一个实现类,它连接到服务器、在 JNDI 树中查找 Foo 对象并调用 bar 方法。此对象也是一个启动类,它负责通过执行下列操作初始化 CORBA 环境:

  • 创建 ORB
  • 创建 Tie 对象
  • 将实现类与 Tie 对象关联
  • 将 Tie 对象注册到 ORB 中
  • 将 Tie 对象绑定到 ORB 的命名服务中
    import org.omg.CosNaming.*;
    import org.omg.CosNaming.NamingContextPackage.*;
    import org.omg.CORBA.*;
    import java.rmi.*;
    import javax.naming.*;
    import weblogic.jndi.Environment;
    public class FooImpl implements Foo
    { 
      public FooImpl() throws RemoteException {
        super();
      }
      public void bar() throws RemoteException, NamingException {
        // 查找并调用实例以将调用委托给...
        weblogic.jndi.Environment env = new Environment();
        Context ctx = env.getInitialContext();
        Foo delegate = (Foo)ctx.lookup("Foo");
        delegate.bar();
        System.out.println("delegate Foo.bar called!");
      }
      public static void main(String args[]) {
        try {
          FooImpl foo = new FooImpl();
          // 创建并初始化 ORB
          ORB orb = ORB.init(args, null);
          // 创建 tie,并使用 ORB 注册 tie
          _FooImpl_Tie fooTie = new _FooImpl_Tie();
          fooTie.setTarget(foo);
          orb.connect(fooTie);
          // 获取命名上下文
          org.omg.CORBA.Object o = /
          orb.resolve_initial_references("NameService");
          NamingContext ncRef = NamingContextHelper.narrow(o);
          // 绑定命名中的对象引用
          NameComponent nc = new NameComponent("Foo", "");
          NameComponent path[] = {nc};
          ncRef.rebind(path, fooTie);
          System.out.println("FooImpl created and bound in the ORB       registry.");
        }
        catch (Exception e) {
          System.out.println("FooImpl.main: an exception occurred:");
          e.printStackTrace();
        }
      }
    }

 


配置 CSIv2 身份验证

Common Secure Interoperability Specification, Version 2 (CSIv2) 是开放管理组(Open Management Group,简称 OMG)规范,它解决了通用对象请求代理体系结构(Common Object Request Broker Architecture,简称 CORBA)对可互操作身份验证、委托和权限方面的安全性要求。请参阅“了解 WebLogic 安全性”中的通用安全互操作性版本 2 (CSIv2)

通过下列步骤使用 CSIv2 对来自远程域的入站调用进行身份验证:

  1. 更新标识声明者。请参阅“确保 WebLogic Server 安全”中的配置标识声明提供程序
  2. 更新用户名映射器。请参阅“确保 WebLogic Server 安全”中的配置用户名映射器
  3. 将远程域中应用程序所需的全部用户添加到 WebLogic AuthenticationProvider 中。请参阅“管理控制台联机帮助”中的创建用户

 


在硬件负载平衡器中使用 IIOP 上的 RMI

注意: 只有在通过硬件负载平衡器进行引导时,此功能才能正确工作。

对 WebLogic Server BEA ORB 和更高版本的增强选项,通过在引导时强制重新连接,可支持硬件负载平衡。这使硬件负载平衡器能够平衡连接尝试

在多数情况下,建立了连接之后,将使用原始连接来执行下一次 NameService 查找。但是,由于此功能会强制将端点重新协商到硬件负载平衡器,因此将丢失所有现有连接上的所有进行中的请求。

使用 -Dweblogic.system.iiop.reconnectOnBootstrap 系统属性设置 BEA ORB 的连接行为。有效值为:

  • true - 强制端点的重新协商。
  • false - 默认值。

对于需要使用硬件负载平衡器的环境,应将此属性设置为 true。

 


WebLogic RMI-IIOP 的限制

以下部分大致列出了与 WebLogic RMI-IIOP 相关的各种问题。

在客户端上使用 RMI-IIOP 的限制

将 WebLogic Server 与 JDK 1.3.1_01 或更高版本结合使用。早期版本与 RMI-IIOP 不兼容。请注意这些早期 JDK 的如下方面:

  • 在 IOR 中发送 GIOP 1.0 消息和 GIOP 1.1 配置文件。
  • 不支持 EJB 2.0 互操作的必要内容(GIOP 1.2、代码集协商和 UTF-16)。
  • 在处理不全的方法名时会出现错误。
  • 对 unchecked 异常不会正确取消编组。
  • 存在与值类型的编码有关的细微错误。

这些项中很多都无法支持双向。在有选择的情况下,WebLogic 将支持符合规范的选项。

开发 Java IDL 客户端的限制

如果准备使用 RMI-IIOP,则 BEA Systems 强烈建议使用 RMI 客户端模型开发 Java 客户端。开发 Java IDL 客户端可能导致命名冲突和类路径问题,您需要对服务器端类和客户端类使用不同的名称。由于 RMI 对象和 IDL 客户端有着不同类型的系统,因此定义服务器端的接口的类将与定义客户端上的接口的类大不相同。

通过值传递对象的限制

要通过值传递对象,需要使用值类型(请参阅 CORBA/IIOP 2.4.2 Specification 的第 5 章了解进一步的信息)。需要在每个定义或引用值类型的平台上实现值类型。本部分描述传递复杂值类型的不便之处,同时引用了一个 C++ 客户端访问 WebLogic Server 上实体 Bean 的特定案例。

使用通常不可见的派生数据类型是 Java 编程人员经常面临的问题。例如,在访问 EJB finder 时,Java 编程人员将看到一个集合或枚举,但不会注意其底层实现,因为 JDK 运行时将从网络进行类加载。但是,C++ 和 CORBA 编程人员必须了解这些通过网络加载的数据类型,以便能够为其注册某个值类型工厂,并且 ORB 也能够对其取消编组。

只在已定义的 EJB 接口中运行 ejbc 将不会生成这些定义,因为它们不会出现在接口中。因此,ejbc 还将接受不是远程接口的 Java 类(专门用于生成这些接口的 IDL£©。查阅 /iiop/ejb/entity/cppclient 示例以了解如何注册值类型工厂。

可序列化但定义了 writeObject() 的 Java 类型将映射到 IDL 中的自定义值类型。必须编写 C++ 代码以手工取消对值类型编组。请参阅 iiop/ejb/entity/tuxclient/ArrayList_i.cpp 文件中的示例代码,此文件的网址是 http://dev2dev.bea.com/

注意: 使用 Tuxedo 时,可指定 -i 限定符以命令 IDL 编译器创建名为 FileName_i.h 和 FileName_i.cpp 的实现文件。例如,此语法创建 TradeResult_i.h 和 TradeResult_i.cpp 实现文件:
  idl -IidlSources -i   idlSources/examples/iiop/ejb/iiop/TradeResult.idl

结果源文件提供应用程序定义的值类型上的操作的实现。实现文件包含在某个 CORBA 客户端应用程序中。

 


传播客户端标识

直到最近,有关从 CORBA 客户端传播客户端标识方面的标准仍显不足。如果遇到来自外部 ORB 的客户端标识方面的问题,则可能需要实现下列方法之一:

  • 任何通过 IIOP 连接到 WebLogic Server 的客户端的标识将默认设置为 <anonymous>。可以在 config.xml 文件中设置用户和密码,为通过 IIOP 连接到 WebLogic Server 的特定实例的所有客户端建立单一标识,如下例中所示:
    <Server
    Name="myserver"
    NativeIOEnabled="true"
    DefaultIIOPUser="Bob"
    DefaultIIOPPassword="Gumby1234"
    ListenPort="7001">
  • 也可以在 config.xml 中设置 IIOPEnabled 特性。默认值为“true”,只有在需要禁用 IIOP 支持时,才将此特性设置为“false”。除了确保所有远程对象都绑定到 JNDI 树以供客户端使用外,使用 IIOP 上的 RMI 不需要进行其他的服务器配置。RMI 对象通常由启动类绑定到 JNDI 树。EJB Home 在部署期间绑定到 JNDI 树。通过将所有查找调用委托给 JNDI 树,WebLogic Server 可实现 CosNaming Service
  • 此版本支持 RMI-IIOP corbanamecorbaloc JNDI 引用。请参阅 CORBA/IIOP 2.4.2 Specification。这些引用提供了一个功能,可以通过 IIOP 将某个 WebLogic Server 上承载的 EJB 或其他对象提供给其他的应用服务器。所以,例如,可以将以下内容添加到 ejb-jar.xml 中:
    <ejb-reference-description>
    <ejb-ref-name>WLS</ejb-ref-name>
    <jndi-name>corbaname:iiop:1.2@localhost:7001#ejb/j2ee/interop/foo</jndi-name>
    </ejb-reference-description>

    reference-description 部分将 ejb-jar.xml 中定义的资源引用映射到 WebLogic Server 中可用的实际资源的 JNDI 名称。ejb-ref-name 指定资源引用名称。这是 EJB 提供程序放入 ejb-jar.xml 部署文件中的引用。jndi-name 指定 WebLogic Server 中可用的实际资源工厂的 JNDI 名称。

    注意: <jndi-name> 部分包含的 iiop:1.2。此版本包含通用 Orb 互联协议(General-Inter-Orb-Protocol,简称 GIOP)1.2 的实现。GIOP 指定在互操作的 ORB 间进行交换的消息的格式。这实现了与许多其他 ORB 和应用程序服务器的互操作性。GIOP 版本可通过 corbanamecorbaloc 引用中的版本号进行控制。

在 RMI 客户端中使用 WLInitialContextFactory 时,不需要这些方法,或者可通过使用 WebLogic C++ 客户端避免使用这些方法。请参阅 iiop/ejb/stateless/sectuxclient 示例中的示例代码,网址为 http://dev2dev.bea.com/。  

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:406531次
    • 积分:4530
    • 等级:
    • 排名:第6787名
    • 原创:72篇
    • 转载:121篇
    • 译文:2篇
    • 评论:39条
    最新评论
    友情链接