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 の経験

推薦する

MySQL 8.0.15 のインストールと設定のグラフィックチュートリアル

この記事ではMySQL 8.0.15のインストールと設定方法を参考までに記録します。具体的な内容は以...

Linux ssh サービス情報と実行ステータスを表示する方法

Linux での ssh サービス構成など、ssh サーバー構成に関する記事は多数あります。ここでは...

MacOS で Docker を使用して MySQL マスター スレーブ データベースを作成する方法

1. MySQLイメージを取得するターミナルから最新のMySQLイメージを取得するdocker pu...

MySQL 5.5 で範囲パーティションを追加および削除する例

導入RANGE パーティション分割は、指定された連続した間隔範囲に基づいています。RANGE の初期...

Nginx を使用してフロントエンドのクロスドメイン問題を解決する方法

序文Vue アプリケーションなどの静的ページを開発する場合、クロスドメインになる可能性のあるインター...

MySQL 数千万のビッグデータに対するSQLクエリ最適化の知識ポイントのまとめ

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

Nginxのアクセスボリューム制御の詳細な説明

目的リクエスト アクセス ボリュームを制御するための Nginx ngx_http_limit_co...

Docker は 2003 年の問題を解決するために MySQL リモート接続を導入しました

MySQLへの接続ここでは、リモート接続に navicat を使用します。MySQL に接続する前に...

JSコンストラクタとインスタンス化およびプロトタイプ導入の関係

目次1. コンストラクタとインスタンス化2. コンストラクターとインスタンス化の関係は何ですか? 3...

HTML/CSSにおける記号論の詳細な説明

この記事では、ソシュールの言語哲学などの理論に基づいて、CSS の class 属性は不要であると主...

Webフロントエンド開発経験の概要

XMLファイルは、可能な限りutf-8でエンコードする必要があります。gb2312には、?など、保存...

HTML レイヤード ボックス シャドウ効果のサンプル コード

まず、画像を見てみましょう。今日はこのエフェクトを作成します。 実は、何でもないんです。Web ペー...

Ubuntu の仮想環境に Django をインストールする方法

Ubuntu コマンドライン ウィンドウで次の操作を実行します。 1. 仮想環境をインストールする...

jsを使用してサーバーに写真をアップロードする

この記事の例では、参考のために画像をサーバーにアップロードするためのjsの具体的なコードを共有してい...