docker-compose を使用して Apollo カスタム環境をデプロイする詳細なチュートリアル

docker-compose を使用して Apollo カスタム環境をデプロイする詳細なチュートリアル

アポロ コンフィギュレーション センターとは何ですか?

Apollo は、Ctrip のフレームワーク部門が開発したオープンソースの構成管理センターです。さまざまなアプリケーション環境とクラスターの構成を一元管理できます。構成が変更されると、リアルタイムでアプリケーション側にプッシュでき、標準化された権限、プロセスガバナンスなどの機能を備えています。

アポロの特徴

  • さまざまな環境やクラスターの構成を一元管理

Apollo は、さまざまな環境、クラスター、名前空間の構成を集中管理するための統合インターフェースを提供します。
異なるクラスターにデプロイされた同じコードは、Zookeeper のアドレスなど、異なる構成を持つことができます。名前空間は、複数の異なるアプリケーションが同じ構成を共有することを簡単にサポートできると同時に、アプリケーションが共有構成を上書きできるようにもします。

  • 構成の変更はリアルタイムで有効になります(ホットリリース)

ユーザーがApolloで設定を変更して公開すると、クライアントは最新の設定をリアルタイム(1秒)で受信し、アプリケーションに通知することができます。

  • バージョンリリース管理

すべての構成リリースにはバージョンの概念があり、構成のロールバックを簡単にサポートできます。

  • グレースケールリリース

構成のグレースケールリリースをサポートします。たとえば、[リリース] をクリックすると、一部のアプリケーション インスタンスにのみ有効になり、一定期間問題なく観察された後、すべてのアプリケーション インスタンスにプッシュされます。

  • 権限管理、リリースレビュー、運用監査

アプリケーションと構成管理のための完全な権限管理メカニズムがあります。構成管理も編集と公開の 2 つの部分に分かれており、人的エラーが削減されます。
すべての操作に監査ログがあり、問題を簡単に追跡できます。

  • クライアント構成情報の監視

インターフェース上の設定を使用しているインスタンスを簡単に確認できます。

  • Javaおよび.Netネイティブクライアントを提供する

.Netネイティブクライアントは、アプリケーションの統合に便利で、Httpインターフェイスを提供し、非Javaおよび.Netアプリケーションも簡単に使用できます。

  • オープンプラットフォームAPIを提供する

Apollo 自体は、複数の環境、複数のデータ センターの構成管理、権限、プロセス ガバナンスなどの機能をサポートする、比較的完全な統合構成管理インターフェイスを提供します。ただし、普遍性のために、Apollo は設定変更にあまり多くの制限を課していません。基本形式に準拠している限り、保存できます。データベースのユーザー名、パスワード、Redis サービス アドレスなど、さまざまな設定値を対象に検証することはありません。このタイプのアプリケーション設定の場合、Apollo は、オープン プラットフォーム API を通じてアプリケーション側が Apollo で設定を変更および公開することをサポートし、完全な認証と権限制御を備えています。

  • シンプルな導入

基本サービスとして、構成センターには非常に高い可用性要件があるため、Apollo の外部依存関係をできるだけ少なくする必要があります。現在、外部依存関係は MySQL のみであるため、展開は非常に簡単です。Java と MySQL がインストールされていれば、Apollo を実行できます。
Apolloは、ワンクリックで必要なインストールパッケージをすべて生成できるパッケージスクリプトも提供し、カスタムランタイムパラメータをサポートしています。

クライアントアーキテクチャ

アーキテクチャとモジュール

1: Config Serviceは、構成の読み取りやプッシュなどの機能を提供し、サービスオブジェクトはApolloクライアントです。

  • 構成取得インターフェースを提供する
  • 構成更新プッシュ インターフェイスを提供します (Http ロング ポーリングに基づく)

サーバーは Spring DeferredResult を使用して非同期性を実現し、長い接続の数を大幅に増やします。Tomcat 埋め込みの現在のデフォルト構成は、最大 10,000 接続です (調整可能)。4C8G 仮想マシンは 10,000 接続をサポートできるため、要件を満たしています (1 つのアプリケーション インスタンスは 1 つの長い接続のみを開始します)。

  • インターフェースサービスオブジェクトはApolloクライアントである

2. 管理サービスは、設定変更や公開などの機能を提供し、そのサービスオブジェクトはApollo Portal(管理インターフェース)です。

  • 構成管理インターフェースを提供する
  • 構成の変更、公開、その他のインターフェースを提供する
  • インターフェースサービスオブジェクトはポータルです

3. メタサーバー Eurekaのサービス検出インターフェースをカプセル化するために、Eureka上にメタサーバーを構築しました。

  • ポータルはドメイン名を介してメタサーバーにアクセスし、管理サービスのサービスリスト(IP + ポート)を取得します。
  • クライアントはドメイン名を介してメタサーバーにアクセスし、Config Serviceのサービスリスト(IP+ポート)を取得します。
  • Meta Serverは、Eurekaクライアントに相当するEurekaからConfig ServiceとAdmin Serviceのサービス情報を取得します。
  • Meta Server ロールを追加する目的は、サービス検出の詳細をカプセル化することです。ポータルとクライアントでは、背後にある実際のサービス登録および検出コンポーネントを気にすることなく、常に HTTP インターフェイスを介して管理サービスと構成サービスのサービス情報を取得します。
  • Meta Server は単なる論理的な役割です。デプロイされると、Config Service と同じ JVM プロセス内に存在するため、IP とポートは Config Service と一致します。

4: Eureka Javaのサービス検出コンポーネント

  • EurekaとSpring Cloud Netflixに基づくサービス登録と検出
  • 構成サービスと管理サービスはEurekaにサービスを登録し、ハートビートを維持します。
  • 簡単にするために、Eureka は現在、Config Service (Spring Cloud Netflix 経由) と同じ JVM プロセスにデプロイされています。

5: ポータル

  • ユーザーが構成を管理するためのWebインターフェースを提供します
  • Meta Server を通じて管理サービス リスト (IP+ポート) を取得し、IP+ポートを通じてサービスにアクセスします。
  • ポータル側で負荷分散とエラー再試行を実行する

6. クライアント

  • Apolloが提供するクライアントプログラムは、アプリケーションの設定取得やリアルタイム更新などの機能を提供する。
  • Meta Server を通じて Config Service サービス リスト (IP+ポート) を取得し、IP+ポートを通じてサービスにアクセスします。
  • クライアント側で負荷分散とエラー再試行を実行する

展開する

  1. 現在、dev、devmt、uatなど複数の開発環境があります。Apolloは複数の環境にデプロイできるため、デプロイする環境を指定する必要があります。
  2. Apollo は複数の環境に展開されます。環境に応じて、Config Service と Admin Service を個別に展開する必要があります。Portal は 1 つのコピーのみで展開して、すべての環境を管理できます。
  3. GitHub ダウンロード: https://github.com/ctripcorp/apollo ソースコード
  4. カスタム環境変数のソースコードの変更、コードの具体的なパスについてはソースコードのgithubドキュメントファイルを確認することをお勧めします。

Env com.ctrip.framework.apollo.core.enums DEVMTを追加

パブリック列挙型Env{
  LOCAL、DEV、FWS、FAT、UAT、LPT、PRO、TOOLS、UNKNOWN、DEVMT;

  パブリック静的Env fromString(String env) {
    Env 環境 = EnvUtils.transformEnv(env);
    Preconditions.checkArgument(environment != UNKNOWN、String.format("Env %s が無効です", env));
    環境を返す。
  }
}

EnvUtils com.ctrip.framework.apollo.core.enums DEVMTを追加

パブリックファイナルクラスEnvUtils {
  
  パブリック静的Env transformEnv(String envName) {
    StringUtils.isBlank(envName) の場合 {
      Env.UNKNOWN を返します。
    }
    スイッチ (envName.trim().toUpperCase()) {
      ケース「LPT」:
        Env.LPT を返します。
      ケース「FAT」:
      ケース「FWS」:
        Env.FAT を返します。
      ケース「UAT」:
        Env.UAT を返します。
      ケース「PRO」:
      case "PROD": //念のため
        Env.PRO を返します。
      ケース「DEV」:
        Env.DEV を返します。
      ケース「LOCAL」:
        Env.LOCAL を返します。
      ケース「TOOLS」:
        Env.TOOLS を返します。
      ケース「DEVMT」:
        Env.DEVMT を返します。
      デフォルト:
        Env.UNKNOWN を返します。
    }
  }
}

LegacyMetaServerProvider com.ctrip.framework.apollo.core.internals DEVMTを追加

プライベートvoid初期化() {
    プロパティ prop = new Properties();
    プロパティ = ResourceUtils.readConfigFile("apollo-env.properties", プロパティ);

    ドメイン.put(Env.LOCAL、getMetaServerAddress(prop、"local_meta"、"local.meta"));
    ドメインを Env.DEV に渡します。
    ドメイン.put(Env.FAT、getMetaServerAddress(prop、"fat_meta"、"fat.meta"));
    ドメイン.put(Env.UAT、getMetaServerAddress(prop、"uat_meta"、"uat.meta"));
    ドメイン.put(Env.LPT、getMetaServerAddress(prop、"lpt_meta"、"lpt.meta"));
    domains.put(Env.PRO, getMetaServerAddress(prop, "pro_meta", "pro.meta"));
    ドメイン.put(Env.SIT、getMetaServerAddress(prop、"devmt_meta"、"devmt.meta"));
  }

チェックして、JAVA JDKとMavenをインストールし、ソースコードフォルダのスクリプトに入り、ビルドファイルを実行してapolloをコンパイルしてパッケージ化します。

以下に示すように、apollo-configservice/target、apollo-adminservice/target、apollo-portal/target、zipファイル、およびファイルの下のDockerfileを指定されたフォルダーにコピーします。

configservice、adminservice、portal、および Dockerfile ファイルのバージョン番号を、zip ファイルのバージョン番号と一致するように変更します。

ソース コードの Scripts フォルダーの下にある sql デプロイメント スクリプトを見つけて、Mysql で実行します。

apolloconfigdbを変更します。eureka.service.urlのアドレスはConfigserviceがデプロイされているアドレスです。例:http://192.168.xx.xxx:8081/eureka/、

ポータルの apollo.portal.envs を次のように変更します: dev、devmt などの複数環境のデプロイメント用の環境変数

ポータルのapollo.portal.meta.serversを、デプロイされたConfigserviceのアドレスに変更します。例:

{
    "DEV":"http://192.168.xx.xxx:8081",
    "DEVMT":"http://192.168.xx.xxx:8082"
}

docker-compose.ymlを書く

バージョン: "3"
サービス:
  アポロ構成サービス:
    コンテナ名: apollo-configservice
    ビルド: apollo-configservice/ 
    画像: apollo-configservice
    ポート:
      -8081:8080
    ボリューム:
      - /root/apollo/apollocompose/logs:/opt/logs
    環境:
      - SPRING_DATASOURCE_URL= jdbc:mysql://192.168.xx.xxx:3306/apolloconfigdbdev?characterEncoding=utf8&serverTimezone=Asia/Shanghai
      -SPRING_DATASOURCE_USERNAME=xxxxxx
      -SPRING_DATASOURCE_PASSWORD=xxxxxx

  アポロ管理サービス:
    コンテナ名: apollo-adminservice
    ビルド: apollo-adminservice/ 
    画像: apollo-adminservice
    ポート:
      -8091:8090
    ボリューム:
      - /root/apollo/apollocompose/logs:/opt/logs
    環境:
      - SPRING_DATASOURCE_URL= jdbc:mysql://192.168.xx.xxx:3306/apolloconfigdbdev?characterEncoding=utf8&serverTimezone=Asia/Shanghai
      -SPRING_DATASOURCE_USERNAME=xxxxxx
      -SPRING_DATASOURCE_PASSWORD=xxxxxx
  
  アポロ-configservice-uat:
    コンテナ名: apollo-configservice-uat
    ビルド: apollo-configservice/ 
    画像: apollo-configservice
    ポート:
      -8082:8080
    ボリューム:
      - /root/apollo/apollocompose/logs:/opt/logs
    環境:
      - SPRING_DATASOURCE_URL= jdbc:mysql://192.168.xx.xxx:3306/apolloconfigdbuat?characterEncoding=utf8&serverTimezone=Asia/Shanghai
      -SPRING_DATASOURCE_USERNAME=xxxxxx
      -SPRING_DATASOURCE_PASSWORD=xxxxxx

  アポロ管理サービスUAT:
    コンテナ名: apollo-adminservice-uat
    ビルド: apollo-adminservice/ 
    画像: apollo-adminservice
    ポート:
      -8092:8090
    ボリューム:
      - /root/apollo/apollocompose/logs:/opt/logs
    環境:
      - SPRING_DATASOURCE_URL= jdbc:mysql://192.168.xx.xxx:3306/apolloconfigdbuat?characterEncoding=utf8&serverTimezone=Asia/Shanghai
      -SPRING_DATASOURCE_USERNAME=xxxxxx
      -SPRING_DATASOURCE_PASSWORD=xxxxxx
  
  アポロポータル:
    コンテナ名: アポロポータル
    ビルド: apollo-portal/
    画像: アポロポータル
    再起動: 常に
    依存:
      - アポロ管理サービス
    環境:
      - SPRING_DATASOURCE_URL= jdbc:mysql://192.168.xx.xxx:3306/apolloportaldb?characterEncoding=utf8&serverTimezone=Asia/Shanghai
      -SPRING_DATASOURCE_USERNAME=xxxxxx
      -SPRING_DATASOURCE_PASSWORD=xxxxxx
    ボリューム:
      - /root/apollo/apollocompose/logs:/opt/logs
      - /root/apollo/apollocompose/apollo-env.properties:/apollo-portal/config/apollo-env.properties
    ポート:
      -8071:8070

ローカルの apollo-env.properties 環境変数構成を、カスタム構成または Ctrip によって定義された環境変数と一致するように変更します。

dev.meta = http://localhost:8081 です
devmt.meta = http://localhost:8082 です。

docker-composeを実行します。起動に遅延がありますので、もう少しお待ちください。

落とし穴

カスタム環境変数には、ソース コードのダウンロード、コンパイル、SQL スクリプト、およびデータベース接続構成が必要です。必ず公式 Web サイトで最新の接続構成を使用してください。バージョンによって SQL スクリプトが一致しない場合があります。デプロイメント マシンには十分な実行メモリが必要です。デプロイメントと起動後、configservice、adminservice、portal、Mata サービス、および Eureka は通信する必要があるため、起動後に遅延が発生します。デプロイメントが成功したかどうかを確認するには、しばらくお待ちください。サーバー ポートについては、ファイアウォールで対応するポート 8080、8090、8071、および指定したポートを開く必要があります。

学習リンク

楊波氏のアーキテクチャ分析記事: https://blog.csdn.net/yang75108/article/details/86989524?spm=1001.2014.3001.5501

Apollo 設計ドキュメント: https://www.apolloconfig.com/

Apollo はカスタム環境を構築します: https://www.jianshu.com/p/f84da093944f

上記は、Apolloカスタム環境のdocker-composeデプロイメントの詳細です。Apollo環境のdocker-composeデプロイメントの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • docker compose デプロイメントにおけるマスタースレーブレプリケーションの実装
  • Docker Compose を使用して Confluence を構築するチュートリアル
  • docker compose を使用して consul クラスタ環境を構築する例
  • Docker Compose ワンクリック ELK デプロイ方式の実装
  • docker-compose が遅すぎる場合の解決策の詳細な説明
  • Docker Compose の実践とまとめ

<<:  スクロールバーを非表示にしながらもスクロール効果を維持する純粋な CSS (モバイルと PC)

>>:  2008 年の Web デザインにおける 10 の経験

推薦する

Vue から React への変換入門ガイド

目次デザインコンポーネント通信ライフサイクルイベント処理品格とスタイルクラススタイル条件付きレンダリ...

MySQL にテーブルデータを挿入するときに中国語の文字化けが発生する問題を解決する方法

1. 問題開発中に、他のデータベースから MySQL データベース テーブルにデータを挿入すると、次...

SecureCRT に基づくリモート Linux ホストへのファイルのアップロードとダウンロードのグラフィカルな手順

wget や curl ツールを使用して、Linux サーバーで大規模なネットワーク ファイルを直接...

HTML テーブルタグチュートリアル (11): 水平方向の配置属性 ALIGN

水平方向では、テーブルの配置を左、中央、右に設定できます。基本的な構文<テーブル配置=&quo...

Tomcat クラスローダーの実装方法とサンプルコード

Tomcat は内部的に複数の ClassLoader を定義し、アプリケーションとコンテナーが異な...

XHTML 特殊文字コレクション

注意&#160;ノーブレークスペース = ノーブレークスペース、 iexcl ¡ &...

JavaScriptの浅いコピーと深いコピーについての簡単な説明

目次1. 直接譲渡2. 浅いコピー3. ディープコピー1. JSONオブジェクトメソッド2. 再帰コ...

Dockerコンテナを使用する簡単な例

目次1. イメージをプルする2. イメージを実行する3. コンテナ内でアプリケーションをテストする4...

HTML の隠しフィールドの紹介と例

基本的な構文: <input type="hidden" name=&qu...

docker ポートを追加して dockerfile を取得する方法

DockerイメージからDockerfileを取得する docker 履歴 --format {{....

イメージを再構築せずにDockerにポートを動的に追加する方法

操作中に Docker コンテナの公開ポートを変更または追加する必要がある場合がありますが、実行中の...

タグのhref属性とonclickイベントの使用例

a タグは主にページ ジャンプを実装するために使用され、これは href 属性または onclick...

HTML の小さなタグの使用に関するヒント

<em></em> などのフレーズ要素を使用すると、意図した視覚スタイルを維...

BootStrap グリッド間に隙間を残す解決策

目次[例を見る]: 【本来の効果は以下の通り】理由は次のとおりです。 【解決】:要約するBootSt...

標準的なHTMLの書き方は、Dreamweaverによって自動的に生成されるものとは異なります。

コードをコピーコードは次のとおりです。 <!--doctype はドキュメント タイプ htm...