第6章 Fuse のポリシーエクステンションを使用した 3scale メッセージコンテンツの変換
Red Hat Fuse を使用して、Red Hat 3scale API Management 用の非常に柔軟なポリシーエクステンションを作成することができます。そのためには、Fuse on OpenShift でポリシーエクステンションを作成し、それらを 3scale 管理ポータルで設定します。これにより、APIcast プロキシーポリシーを使用して、リクエスト/レスポンスのメッセージコンテンツに対する複雑な変換を実施することができます (例: XML から JSON への変換)。この変換は、Apache Camel インテグレーションのフレームワークに実装されます。
これにより、静的な APIcast コンテナーイメージを再ビルドして再デプロイする代わりに、Camel でカスタムポリシーエクステンションを動的に追加または変更することもできます。Camel Domain Specific Language (DSL) を使用することで、利用可能な任意の Camel Enterprise Integration Pattern (EIP) により、APIcast ポリシーエクステンションを実装することができます。これにより、Java や XML 等の使い慣れたプログラミング言語を使用して、ポリシーエクステンションを作成することができます。本トピックの例では、Camel Netty4 HTTP コンポーネントを使用して、HTTP プロキシーを Java で実装しています。
必要なソフトウェアコンポーネント
以下の Red Hat Integration コンポーネントを同じ OpenShift クラスターにデプロイしている必要があります。
- Fuse on OpenShift 7.6
- オンプレミス型 3scale
- Self-managed APIcast または Embedded APIcast
これらのコンポーネントを同じ OpenShift クラスターにインストールする必要があります。ただし、同じ namespace またはプロジェクトである必要はありません。Fuse と 3scale が直接通信することはありません。すべての通信は、OpenShift を通じてしか実施されません。
アーキテクチャー的には、3scale とは異なるプロジェクトで Fuse カスタムコードを実行するのが最良です。ただし、両プロジェクト間で通信ができるようにしてください。詳細については、『Networking』の「Configuring network policy with OpenShift SDN」を参照してください。
その他のリソース
- 『Fuse on OpenShift ガイド』
- 『Apache Camel Component Reference』の「Netty4 HTTP Component」
6.1. APIcast と Fuse の Apache Camel による変換のインテグレーション
APIcast と Fuse on OpenShift で Apache Camel アプリケーションとして記述された変換を統合することができます。ポリシーエクステンションによる変換が 3scale に設定およびデプロイされると、3scale トラフィックは Camel ポリシーエクステンションを通過し、メッセージのコンテンツが変換されます。この場合、Camel はリバース HTTP プロキシーとして機能し、APIcast は Camel に 3scale トラフィックを送信し、Camel がそのトラフィックを API バックエンドに送信します。
本トピックの例では、Camel Netty4 HTTP コンポーネントを使用して HTTP プロキシーを作成しています。
- HTTP プロキシープロトコルを通じて受け取ったリクエストは、HTTP ボディーが大文字に変換されて目的のサービスに転送されます。
- 目的のサービスからのレスポンスは大文字への変換処理を受け、続いてクライアントに戻されます。
前提条件
Fuse on OpenShift 7.6 および 3scale 2.8 を、同じ OpenShift クラスターにデプロイしている必要があります。インストールの詳細については、以下のドキュメントを参照してください。
- Fuse on OpenShift および 3scale をインストールしてプロジェクトを作成するには、クラスターの管理者権限が必要です。ただし、プロジェクトごとの編集アクセス権限で、デプロイ設定の作成、Pod のデプロイ、およびサービスの作成が可能です。
手順
Camel netty4-http コンポーネントを使用して Java で Apache Camel アプリケーションを作成し、HTTP プロキシーを実装します。これにより、任意の Camel コンポーネントを使用して、メッセージを変換することができます。
以下に示す簡単な例では、リクエストおよびサービスからのレスポンスを大文字に変換します。
import java.util.Locale; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.builder.RouteBuilder; public class ProxyRoute extends RouteBuilder { @Override public void configure() throws Exception { from("netty4-http:proxy://0.0.0.0:8080") .process(ProxyRoute::uppercase) .toD("netty4-http:" + "${headers." + Exchange.HTTP_SCHEME + "}://" + "${headers." + Exchange.HTTP_HOST + "}:" + "${headers." + Exchange.HTTP_PORT + "}" + "${headers." + Exchange.HTTP_PATH + "}") .process(ProxyRoute::uppercase); } public static void uppercase(final Exchange exchange) { final Message message = exchange.getIn(); final String body = message.getBody(String.class); message.setBody(body.toUpperCase(Locale.US)); } }
- 『Fuse on OpenShift ガイド』の「Fuse on OpenShift でのアプリケーションの作成およびデプロイ」の説明に従って、Camel アプリケーションをデプロイします。
この例では、HTTP over TLS (HTTPS) プロトコルはサポートされません。