[WLS, Java] WLS JNDI Multitenancy

原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/wls_jndi_multitenancy

WebLogic Server 12.2.1で導入された最も重要な機能は、マルチテナントです。
Understanding PaaS Multitenancy
http://docs.oracle.com/middleware/1221/wls/WLSMT/concepts.htm#WLSMT724
Domain Partitions for Multi-tenancy in WebLogic Server 12.2.1
https://blogs.oracle.com/WebLogicServer/entry/domain_partitions_for_multi_tenancy
http://orablogs-jp.blogspot.jp/2015/11/domain-partitions-for-multi-tenancy-in.html 
ご存知のように、WebLogic Server 12.2.1までは、1 WebLogic Serverドメインを、1テナントで使用しますが、WebLogic Server 12.2.1からは、WebLogic Serverドメインを複数のパーティションに分割してテナントがWebLogic Serverドメインの異なるパーティションを利用することができるため、複数のテナントが1個のWebLogic Serverドメインを互いに影響することなく共有することができます。それゆえ、パーティション間のリソースの分離が重要です。JNDIがこれらのリソースにアクセスするための一般的な方法ですので、WebLogic Server 12.2.1でのJNDIの主な目標は、JNDIリソースを分離することにあります。

WebLogic Server 12.2.1までは、WebLogic ServerドメインのJNDIグローバルツリーしかありません。パーティションには一意の分離された名前空間が必要なので、この1個のJNDIグローバルツリーで複数のパーティションをサポートすることは困難です。例えば、複数のパーティションが同じJNDI名を使って個別にJNDIリソースをバインド/ルックアップをすることができますが、NameAlreadyBoundExceptionになることでしょう。異なるパーティションでJNDIリソースを分離するため、すべてのパーティションには、WebLogic Server 12.2.1以降の一意のJNDIグローバルツリーがあります。そうすることで、テナントは、他のパーティションと名前が競合せずに、パーティションのJNDIリソースを操作することができます。アプリケーションスコープのJNDIツリーの場合、アプリケーション内部でのみ見えるので、自然に分離しますから、アプリケーションスコープのJNDIツリーは、WebLogic Server 12.2.1で変更する必要はありません。では、パーティションのJNDIリソースへのアクセス方法を見てみましょう。

Access JNDI resource in partition

パーティションのJNDIリソースにアクセスするには、InitialContext作成時にパーティション情報をプロバイダURLプロパティに指定する必要があります。
partition1情報をInitialContext作成時にプロパティに追加し、partition1のJNDIリソースにアクセスします。
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.PROVIDER_URL, "t3://ms1:7001/partition1");
env.put(Context.SECURITY_PRINCIPAL, "weblogic");
env.put(Context.SECURITY_CREDENTIALS, "welcome1");
Context ctx = new InitialContext(env);
Object c = ctx.lookup("jdbc/ds1");
Partition2はクラスタで動作するので、クラスタアドレス形式を使ってInitialContext作成時にプロパティに指定する必要があります。
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.PROVIDER_URL, "t3://ms1:7001,ms2:7003/partition2");
env.put(Context.SECURITY_PRINCIPAL, "weblogic");
env.put(Context.SECURITY_CREDENTIALS, "welcome1");
Context ctx = new InitialContext(env);
Object c = ctx.lookup("jdbc/ds1");
WebLogic Serverでは、外部JNDIプロバイダを作成して別サーバのJNDIリソースをリンクすることができます。WebLogic Server 12.2.1では、構成にパーティション情報を追加すれば、外部JNDIプロバイダを使って指定のパーティションのJNDIをリンクすることもできます。これらのパーティション情報(URL、ユーザ名、パスワードなど)を使ってJNDIコンテキストを作成します。以下はPartition1の外部JNDIプロバイダ構成例です。このプロバイダはpartition2にリンクします。
<foreign-jndi-provider-override>
  <name>jndi_provider_rgt</name>
  <initial-context-factory>weblogic.jndi.WLInitialContextFactory</initial-context-factory>
  <provider-url>t3://ms1:7001,ms2:7003/partition2</provider-url>
  <password-encrypted>{AES}6pyJXtrS5m/r4pwFT2EXQRsxUOu2n3YEcKJEvZzxZ7M=</password-encrypted>
  <user>weblogic</user>
  <foreign-jndi-link>
    <name>link_rgt_2</name>
    <local-jndi-name>partition_Name</local-jndi-name>
    <remote-jndi-name>weblogic.partitionName</remote-jndi-name>
  </foreign-jndi-link>
</foreign-jndi-provider-override>

Stickiness of JNDI Context

JNDIコンテキストを作成すると、コンテキストは指定されたパーティションに関連付けられるので、この後のJNDIの操作は、関連付けられたパーティションのJNDIツリー内で実施します(現在のパーティションのJNDIツリーではありません)。この関連付けられたパーティションは、コンテキストを作成時とは異なるスレッドが使っている場合でも残ります。JNDIコンテキスト作成時にプロバイダURLプロパティを環境に設定すると、プロバイダURLで指定されたパーティションに関連付けられます。そうでない場合、JNDIコンテキストは現在のパーティションに関連付けられます。

Life cycle of Partition JNDI service

WebLogic Server 12.2.1までは、JNDIサービスのライフサイクルはWebLogic Serverと同じですが、12.2.1からは各パーティションが個々でJNDIグローバルツリーを持つため、JNDIサービスのライフサイクルはパーティションに一致します。パーティション開始時にすぐJNDIサービスが利用でき、パーティションのシャットダウンで当該パーティションのJNDIサービスは破棄されます。

0 件のコメント:

コメントを投稿