WordPressは強力なコンテンツ管理システム(CMS)であり、さまざまな種類のサイトやアプリケーションの基盤を構築することができます。WordPressは、モノリシックアーキテクチャを標準採用していますが、サイトの規模が大きくなるにつれ、このアプローチが適切でなくなることがあります。そこで注目したいのが、「マイクロサービスアーキテクチャ」です。

今回は、マイクロサービスを使用してWordPressウェブアプリを構築する方法を探り、Create Block Themeプラグインを使った手順をご紹介します。

マイクロサービスとは

ウェブアプリの構築を始める前に、マイクロサービスアーキテクチャとモノリシックアーキテクチャの違いを見ておきましょう。

モノリシックアーキテクチャでは、アプリケーションのすべてのコンポーネントが緊密に結合し、単一のサービスとして実行されます。アプリを開発するシンプルなアプローチですが、複雑になるとメンテナンスやスケーリングが課題になります。

マイクロサービスアーキテクチャでは、アプリケーションを小さなサービスに分解し、各サービスがそれぞれ独自に開発、デプロイ、スケーリングを行います。

各サービスは特定のタスクを処理し、アプリケーションプログラミングインターフェース(API)を通じて他のサービスと通信します。たとえば、お買い物カゴ、決済、注文処理、商品ページなどで構成されるECサイトを考えてみます。

DARTDronesのウェブサイト
DARTDronesのウェブサイト

モノリシックアーキテクチャでは、これらの機能は単一の大規模なアプリケーションの一部として存在することになります。WooCommerceでECサイトを構築するのが好例です。

しかし、マイクロサービスを実装すると、それぞれのタスクに適した技術を使用することができます。例えば、コンテンツマーケティングにはWordPressの高性能CMS、商品管理システムにはAdobe Commerce、決済ソリューションにはBoltを使用するといったことも実現可能です。

Boltのウェブサイト
Boltのウェブサイト

マイクロサービスアーキテクチャを採用することで、さまざまな技術のいいとこ取りが可能になります。

マイクロサービスアーキテクチャの利点

マイクロサービスアーキテクチャの何よりの強みは、異なる技術やツールを組み合わせてアプリを構築できる点にありますが、それだけにはとどまりません。

  • デカップリング:各サービスが独立して実行するため、適切でないフレームワークで対応するのではなく、それぞれに適した技術を扱うことができる。
  • 自律性:統合したサービスは互いに依存し合うことがないため、それぞれのパフォーマンスを維持することができる。
  • 専門化:各サービスがそれぞれのタスクに集中することで、パフォーマンスが高まる。
  • 回復力:1つのサービス障害がサイト全体をダウンさせるということがない。

さらに以下のような利点も挙げられます。

  • スケーラビリティ:アプリの他の部分に影響を与えることなく、個々の要件に応じて各サービスを拡張できる。
  • 柔軟性サービスの作成に使用するプログラミング言語に至るまで、それぞれの機能に適した技術を使用できる。
  • 開発の迅速化:小規模で集中的なサービスを迅速に開発し、サービスの機能をよりよく理解し、システムの保守管理を簡素化することができる。
  • 障害隔離の向上:構造がモジュール化されることで、サービスに障害が発生しても、他のサービスに影響を与えることがない。

ただし、マイクロサービスアーキテクチャは、通信、データの一貫性、分散システムの管理が複雑になります。したがって、アプリの要件を洗い出し、この懸念点を踏まえた上で導入する価値があるかを検討することが大切です。

マイクロサービスアーキテクチャの構成要素

マイクロサービスアーキテクチャは、複数のコンポーネントで構成されます。各コンポーネントが「歯車」となり、スケーラブルで保守性の高いアプリケーションの「車輪」を動かします。

以下のコンポーネントが、スムーズな実装の鍵となります。

  • APIゲートウェイ─クライアントからのリクエストの入口であり、リクエストを適切なマイクロサービスに転送する。レート制限や認証などのタスクも処理する。
  • サービスディスカバリ─マイクロサービスがお互いを検出して通信するための動的な方法が必要。ConsulやEurekaのようなツールが有用になる。
  • コンテナ化Dockerのようなツールを使用してマイクロサービスをコンテナとしてパッケージ化し、デプロイして各サービスを分離するのが一般的。
  • オーケストレーション─アプリにマイクロサービスを追加すると管理が複雑に異なるが、Kubernetesのようなツールを使うことで管理を自動化することができる。
  • キャッシュRedisMemcachedのようなキャッシュ機構は、通常パフォーマンスを向上させる。バックエンドのサービスやデータベースへの負担が大きくなることを考慮すると、非常に重要になる。
  • メッセージング─サービス同士の対話には、RabbitMQApache Kafkaなどの非同期メッセージングソリューションが必要に。これにより、マイクロサービス間の疎結合が可能になる。

これらのツールは、セットアップの一部に過ぎません。アーキテクチャ全体の中で各マイクロサービスをどのように設計するかなど、他にも考慮すべき点があります。

マイクロサービスのデザインパターン

マイクロサービスのデザインパターンは、開発ワークフローのあらゆる側面と同等に重要です。アプリ全体の潜在的な複雑さを考慮し、どのパターンが最も影響力を持つかを把握することが重要です。これには以下の3つが考えられます。

  • 各サービスのデータベース─各マイクロサービスが専用のデータベースを使用することで、データの分離と自律性を確保できる。
  • API構成─マイクロサービスを組み合わせることで、より上位のサービスやAPIを作成可能。この柔軟性と再利用性がマイクロサービスアーキテクチャ最大のメリット。
  • イベント駆動型アーキテクチャ─サービスがイベントを介して通信することで、結合が緩くなり、非同期処理が容易になる。

また、アーキテクチャの構築に使用するツール固有のデザインパターンも加味することが重要です。例えば、DockerとKubernetesは、いずれも標準となるパターンを持っており、システム全体の設計と並行して考慮しなければなりません。

なお、必ずしもすべてのコンポーネントをマイクロサービスとして扱う必要はありません。重要なサービスから始めて、適宜アーキテクチャを進化させていくのが正しい考え方です(これについては後ほど詳しく)。まずは、フロントエンドの開発方法から検討しましょう。

Create Block Themeプラグイン

WordPressは多くの点で優れており、フロントエンドなど、アーキテクチャのいずれかの部分に採用することが多いでしょう。テーマはWordPressの核となる機能であり、Create Block Themeのようなプラグインを使えば、独自のテーマを簡単に作成することができます。

Create Block Themeのヘッダー画像(出典:WordPress.org)
Create Block Themeのヘッダー画像(出典:WordPress.org)

Create Block Themeは、カスタマイズを前提としたスターターテーマであるUnderscoresの精神を継承しつつ、フルサイト編集(FSE)と完全に互換性を持つプラグインです。スターターテーマを即座に作成して、エディターをフル活用して高度なカスタマイズを行うことができます。一般的なWordPressプラグインとして動作し、後で独立したテーマとしてエクスポートする機能も組み込まれています。

Create Block Themeとマイクロサービスを組み合わせることで、すべてを「連携」することができます。たとえば、異なるWordPressサイト間でブロックパターンや再利用可能ブロックを共有することが可能です。コードの再利用と一貫性を促進するとともに、個々のサービスのフロントエンドを統一することができます。

Create Block Themeの具体的な使用方法を取り上げる前に、ヘッドレスWordPressとマイクロサービスの併用についてご説明します。

ヘッドレスWordPressとマイクロサービスアーキテクチャ

WordPressのフロントエンドとバックエンドを切り離す場合、マイクロサービスは自然な選択と言えます。標準的なヘッドレスWordPressサイトでは、コンテンツの管理にWordPressを使用し、APIとして機能することもあります。

ヘッドレスWordPressサイトとマイクロサービスアーキテクチャを組み合わせることで、以下のようなことが実現できます。

  • WordPress REST APIの活用。WordPressにはプログラムでコンテンツを取得・操作できるREST APIが組み込まれており、これを活用してマイクロサービスをWordPressと統合することができる。
  • フロントエンドとバックエンドの独立したスケーラビリティ。両者が独立していることで、それぞれ別途スケーリングが可能。より優れたパフォーマンスが期待できる。複雑さの中にも柔軟性を確保することができる。

マイクロサービスの実装を可能にするREST APIについてもう少し掘り下げます。

マイクロサービスとWordPress REST API

WordPress REST APIは、サイトとマイクロサービスの統合を可能にする上で重要な役割を担います。エンドポイントでJSONの出力を使ってWordPressの投稿、固定ページ、ユーザー、タクソノミなどを取得し、操作することができます。

[
  {
    "id": 1,
    "date": "2020-04-01T10:30:00",
    "date_gmt": "2020-04-01T14:30:00",
    "guid": {
      "rendered": "https://example.com/?p=1"
    },
    "modified": "2020-04-01T10:30:00",
    "modified_gmt": "2020-04-01T14:30:00",
    "slug": "hello-world",
    "status": "publish",
    "type": "post",
    "link": "https://example.com/hello-world/",
    "title": {
      "rendered": "Hello World"
    },
    …

REST APIは、アーキテクチャ内の他のすべてのサービスのハブになります。現在のサイトの機能やサービスをマイクロサービスとして抽出し、連携させます(詳細は後ほど)。

一言で言えば、ウェブアプリ内の明確な機能と責任を特定することが重要です。そこから、独立して、焦点を絞り、なおかつデプロイ可能なマイクロサービスに分割します。

Create Block Themeとマイクロサービスを使ったウェブアプリの構築方法

さまざまな要件を考慮しつつ、マイクロサービスとCreate Block Themeを使って、WordPressウェブアプリを構築する方法をご紹介します。まずは、開発環境のセットアップから始めます。

1. 開発環境のセットアップ

まずはアプリを作成するための環境づくりから。開発環境は、ローカルコンピュータとサーバーの2つがあります。

ローカル開発環境をセットアップする方法は多数ありますが、DevKinstaがおすすめです。

DevKinsta
DevKinsta

また、デプロイする前に変更や更新をテストするため、ステージング環境も確保するのが得策です。Kinstaのお客様は、DevKinstaでローカルに開発を行い、簡単にMyKinstaのステージング環境でテストすることができます。

DevKinstaのサイト情報画面
DevKinstaのサイト情報画面

DevKinstaはDockerをインストールするため、別のタスクを確認するのにも役立ちます。オーケストレーション用にKubernetesを使用する場合は、このタイミングでインストールします(Kinstaでは、アプリケーションおよびデータベースホスティングやその他の処理に採用)。Kubernetesは、Docker Desktopからダウンロード可能です。

Docker DashboardのKubernetes設定
Docker DashboardのKubernetes設定

続いて、Create Block Themeを使用して、テーマ開発に必要なその他のフレームワークを設定します。

2. Create Block Themeプラグインのセットアップ

開発環境を整えたら、Create Block Themeを使用して、ブロックベースのカスタムテーマを作成します。また、以下も必要になります。

プラグインを通常通りインストールし、WordPress管理画面の「外観」>「ブロックテーマを作成」を開きます。

WordPress管理画面に出現するCreate Block Themeのメニュー
WordPress管理画面に出現するCreate Block Themeのメニュー

ちなみに、「外観」タブには「テーマフォントを管理する」というメニューもあります。これはWordPress 6.5のフォントライブラリ機能で、ブロックテーマを作成するとアクセスできるようになります。

いずれにしても、「ブロックテーマを作成」画面でテーマを生成するための設定を行います。今回はすべての項目に触れませんが、ここでは「Clone Twenty Twenty-Four」を選択します。すると、一連の設定フィールドが出現します。

ブロックテーマの作成設定
ブロックテーマの作成設定

これらは、style.cssファイル内のテーマ識別フィールドで、名前、スクリーンショット、URL、そしてWordPressのテーマディレクトリ用のタグを選択します。

設定を保存したら、再び「外観」>「テーマ」画面に戻り、新たなテーマが表示されているかどうかを確認します。

WordPressのテーマ画面
WordPressのテーマ画面

テーマのZIPファイルがダウンロードされる場合は、WordPressにアップロードしてください(テーマをエクスポートすることもできますが今回は触れません)。

Create Block Themeの設定と使い方のヒント

ブロックテーマのカスタマイズ方法については割愛しますが、Create Block Themeを使用するヒントをいくつか挙げておきます。

3つ目の点については、配布する目的のテーマであれば、親テーマで作業したいところですが、自社のサイト用であれば、子テーマだけを編集することもできます。一般的な考え方として、テーマに機能やスタイルが多数含まれていない限りは、親テーマを編集するのがベストプラクティスです。

3. マイクロサービスを抽出する

ブロックテーマを準備したら、マイクロサービスを抽出します。まずは、何をマイクロサービス化するかを決定する必要があります。

これは複雑で主観的な決断になる可能性があり、要件を慎重に考慮することが重要になりますが、以下のような注意点も参考にしてみてください。

  • サイトの機能─サイトが提供する機能を洗い出し、支払いなどの重要な機能はマイクロサービスに分割する。
  • 独立したスケーラビリティ─独立したスケーリングに依存している既存のサービス(キャッシュなど)は、マイクロサービスに適している。
  • 技術の多様性─ECプラットフォームやバックエンドコンポーネントなど、WordPressのPHPアーキテクチャから移行する必要があるものもマイクロサービスに適している。
  • データの分離─独自のデータストレージを必要とするサービスも然り。他のサービスとデータを共有する必要がない場合も同様。

検索、支払い処理、認証など、特定のAPIを提供するマイクロサービスを作成するのは良いアイデアです。これらのサービスが他のファーストパーティ/サードパーティのAPIと連携することができれば、より柔軟で価値のあるものになります。

マイクロサービスの開発とデプロイ

マイクロサービスを開発してデプロイするには、以下のような他のツールも必要になります。

  • Dockerは、マイクロサービスをコンテナ化するソリューションで、マイクロサービスとその依存関係をまとめてパッケージ化し、デプロイと拡張を簡素化できる。
  • 各マイクロサービスにはDockerfileが必要になり、依存関係、設定、実行環境を指定する。
  • コンテナのオーケストレーションと管理にはKubernetesを使用する(Kinstaでは、Kubernetesのビルトインサポートを備えた強力なホスティングプラットフォームを提供)。
  • 継続的インテグレーションとデプロイメント(CI/CD)パイプラインで、ビルド、テスト、デプロイメントを自動化。CI/CDプロセスの合理化には、GitLabTravis CIなどのツールが有用。
  • サーバーレス機能は本格的なサーバーが不要なため、マイクロサービスに適している。AWS Lambda、Google Cloud Functions、Azure Functionsなどのプラットフォームで、サーバーのプロビジョニングや管理なしにコードを実行できる。
  • APIゲートウェイは、マイクロサービスに単一のエントリーポイントを提供してくれる。KongAmazon API Gatewayのようなツールは、APIの管理とセキュリティに役立つ。また認証、レート制限、リクエストルーティングなどのタスクを処理することも可能。

この時点で、WordPressサイトとマイクロサービスは互いに独立している状態です。最後に、両者を統合していきます。

4. マイクロサービスとWordPressの統合

マイクロサービスを開発してデプロイしたら、WordPressと統合します。これを行うには、マイクロサービスが公開するエンドポイントにWordPressからAPIリクエストを行うため、REST APIの知識が必要になります。

WordPressでAPIリクエストを行う一般的な方法は、wp_remote_get()またはwp_remote_post()を使用することです。これでHTTPリクエストを送信し、レスポンスを処理することができます。いくつかコード例を見てみます。

// APIエンドポイントURL

$api_url = 'https://api.example.com/endpoint';

// APIリクエストパラメータ

$params = array(
    'param1' => 'value1',
    'param2' => 'value2',
);


// wp_remote_getを使用してAPIリクエストを行う
$response = wp_remote_get(add_query_arg($params, $api_url));

// リクエストが成功したかどうかを確認
if (is_wp_error($response)) {
    // Handle the error
    $error_message = $response->get_error_message();

    // エラーメッセージを記録または表示
} else {
    // APIレスポンスを処理
    $response_body = wp_remote_retrieve_body($response);

    $data = json_decode($response_body, true);

    // 必要に応じて取得したデータを使用

    // ...
}

マイクロサービスでは、メインスレッドのブロックを回避するため、非同期データ取得がよく活用されます。WordPressではこれを実行するため、API Fetchパッケージ、およびWordPress 6.3で導入されたasyncdeferを使用します。コードは次のようになります。

import apiFetch from '@wordpress/api-fetch';

// マイクロサービスのAPIエンドポイントURL
const microserviceUrl = 'https://api.example.com/microservice';
...


// マイクロサービスにAPIリクエストを行う
apiFetch({
  path: microserviceUrl,
  method: 'GET',
  data: params,
})

  .then((response) => {
    // レスポンスを処理
    console.log(response);

    // マイクロサービスから取得したデータを使用

    // ...
  })
...

また、動的なユーザーインターフェース(UI)の更新には、AJAXの使用する手もあります。

当然ながら、適切な認証とセキュリティ強化策も重要です。WordPress REST APIには、Cookie、JSON Web Token(JWT)、アプリケーションパスワードなど、セッションを認証する方法がいくつかあります。外部のソリューションに依存することを考えると、マイクロサービスとサイトの安全性の確保は必要不可欠です。

独自のブロックテーマを使用する際には、この機能を活用しない手はありません。マイクロサービスをブロックに追加できるということは、サイトのあらゆる場所にマイクロサービスを組み込むことができることを意味し、さらに一歩進んで、その機能をプラグインに組み込むことも可能です。

このプロセスには、ブロックの登録コンテンツのレンダリング、データ処理の3つの要素があります。今回は例としてJavaScriptを使用し、registerBlockType関数で登録とレンダリングを行ってみます。

// ブロックを構築し、ブロックエディター内でアクセスできるようにするJavaScript関数
( function( blocks, element ) {
    var el = element.createElement;

    blocks.registerBlockType( 'my-micro/stripe-api', {
        title: 'Stripe Payment Gateway',
        icon: 'dashicons-cart',
        category: 'embed',

        edit: function() {
            return el(
                'div',
                {},
                '' // ブロックエディター内に表示するマイクロサービスのビジュアル要素を作成
            );
        },
…

今回は、このようなブロックを登録する基本的な例のみをご紹介しましたが、Create Block Theme、マイクロサービス、WordPressは、簡単に組み合わせることができるという点はお分かりいただけたかと思います。そして、優れたホスティングサービスは、マイクロサービスアーキテクチャにさらに利点をもたらします。

KinstaでWordPressサイトとマイクロサービスを管理・拡張する

Kinstaのエコシステムは、マイクロサービスアーキテクチャを使ったWordPressサイトの管理を支援します。その中核になるのはアプリケーションホスティングで、コンテナ化されたマイクロサービスを簡単にデプロイし、様々な機能を使って効率的に保守管理することができます。

例えば、オートスケーリング機能は、トラフィック急増に対応するためのリソースを監視し、マイクロサービスの需要に応じてスケールアップまたはスケールダウンします。これにより費用を抑えながら、高いパフォーマンスを維持することができます。

また、以下のような主要データベースタイプに対応した、マネージドデータベースホスティングも提供しています。

後者にはインメモリキャッシュ、メッセージブローカー、ベクターデータベース、ドキュメントデータベースなど、さまざまな用途があります。

Redis
Redis

Kinstaを利用することで、手間をかけずにWordPressサイトとマイクロサービスの両方のデータベースを扱うことができます。業界最高クラスのキャッシュ機能、DockerとKubernetesのサポート、洗練された専用コントロールパネル「MyKinsta」など、必要な機能をすべて手にすることができます。

まとめ

WordPressはモノリシックアーキテクチャですが、マイクロサービスを取り入れることができます。マイクロサービスアーキテクチャは、スケーラビリティや柔軟性の向上、開発プロセスの高速化などのメリットをもたらします。

Create Block Themeプラグインを使用することで、クリーンで安全なコードベースを作成することができます。マイクロサービスはサイトを複雑化しますが、独自のブロックテーマを使用すれば、要件に応じたサービスを実装可能です。さらに、DevKinstaやKinstaのアプリケーションホスティングなどの開発ソリューションと組み合わせて、強力で最新のウェブアプリケーションを作成するのに適した基盤を構築することができます。

マイクロサービスアーキテクチャとCreate Block Themeプラグインの相性についてご意見がありましたら、以下のコメント欄で共有してください。

Jeremy Holcombe Kinsta

Kinstaのコンテンツ&マーケティングエディター、WordPress開発者、コンテンツライター。WordPress以外の趣味は、ビーチでのんびりすること、ゴルフ、映画。高身長が特徴。