春のアプリケーション統合への道 (1): 石を求めて川を渡る | JD Cloud テクニカルチーム

同社はコスト削減と効率化を推進しているが、さまざまな方法を試した結果、アプリケーションが多すぎることが判明した。ディザスタリカバリ用に各アプリケーションを複数のコンピュータルームに展開するには、少なくとも 4 台のマシン (コンテナと呼ばれる方が適切である) が必要になる。次に、同様のアプリケーションを統合して、メンテナンス プロジェクトを削減し、マシンの使用率を向上させることがオプションになります。

3 回の異なる試みの後、最終的に実現可能な解決策が模索されました。記録して共有し、子供用靴の研究開発に関連するニーズがある方のお役に立てれば幸いです。以下に、考えられる 4 つの解決策をそれぞれ紹介します。さらに、デモンストレーションを容易にするために、2 つのデモンストレーション プロジェクトが特別に用意されています。

diguage/merge-demo-boot — マージ プロジェクト (以降ブートと呼びます)。

diguage/merge-demo-web – マージされたプロジェクト (以下、Web と呼びます)。

1. Jar パッケージのリファレンス

この方法が印象を与える最も簡単な方法かもしれません。よく考えてみると、保守性の観点からこの方法が最も面倒ですが、その理由は次のとおりです。

1. Web プロジェクトが更新されるたびに、再パッケージ化して新しいバージョンとしてリリースする必要があり、ブート プロジェクトも更新してリリースする必要があります。一回、パンツを二回脱いでください。本当に面倒なんです。

2. 以下で説明するのと同様に、コンテナを共有するかどうかという Web プロジェクトの読み込みの問題も考慮する必要があります。 コンテナの共有 - これはコンテナについて考える最も一般的な方法です。しかし、この方法では、Bean の競合の問題を解決する必要があります。共有コンテナなし - このアプローチでは、Web コンテナのロード方法に対処する必要があります。デフォルトは認識されないはずです。

これらの考慮事項に基づいて、このアプローチは単純に放棄されました。

2. 倉庫が統合され、共通のコンテナのセットが使用されます。

今回初めて試してみました。これは、最も多くの問題が発生する解決策でもあります。

1. 2 つのウェアハウスを結合します。

1. Web ウェアハウスのアドレスをブート プロジェクトに設定します。 git Remote add web [email protected] :diguage/merge-demo-web.git;

2. ブート プロジェクトで、ブランチを切り出します。 git switch -c web;

3. Web ブランチの送信をクリアします: git update-ref -d HEAD で、送信を行います。

4. Web プロジェクトのコードを Web ブランチにクローンします: git pull --rebase --allow-unpopular-histories Web マスター; 無関係なリポジトリが統合されます。

5. ブート プロジェクトの master ブランチからマージ ブランチを切り出します。 git switch -c merge;

6. Web プロジェクトをブート プロジェクトにマージします: git merge --allow-unpopular-histories web; 無関係なウェアハウスをマージできるようにするには、ここに --allow-unpopular-histories パラメーターを追加する必要があることに注意してください。

7. コードの競合を処理し、マージを完了します。

2. 設定ファイルをマージして整理します。同じ名前の構成ファイルが競合しないようにするには、Web プロジェクトの構成ファイルをフォルダー (ここでは Web ディレクトリに設定) に合わせて調整する必要があります。次に、Web プロジェクトの構成ファイルをブートでロードできるように配置する必要があります。この調整は比較的簡単で、アノテーション @ImportResource({"classpath:web/spring-cfg.xml"}) のみが必要です。

3. 構成ファイルを調整した後、次に発生する問題は、前述の Bean の競合です。両方のプロジェクトが同じデータベースにアクセスするため、Dao 層と Service 層の多くのクラスが同じ名前になります。また、WebプロジェクトではiBATISをベースにDAOを開発し、ブートプロジェクトではMyBATISをベースにDAOを開発します。したがって、Web プロジェクトの関連コードの名前のみを変更できます (より厳密には、Spring Bean の beanName の名前を変更できます)。これにより、新たな問題が発生しました。元のプロジェクトでは、注入メソッドが名前に基づいていたため、多くのコード変更と、関連する Bean 変数の名前変更が必要でした。これにより、事実上、多くの複雑さと不確実性が追加されます。

何度も投げ続けた結果、この方法は断念せざるを得なくなりました。

3. ウェアハウスの統合、Spring Boot 親子コンテナ

上記の方法を検討した後、私は別の解決策を思いつきました。それは、親子コンテナーの使用を検討することです。そこでこの記事を見つけました: Spring Boot Fluent Builder API によるコンテキスト階層この方法はなかなか良さそうなので試してみました。

1. コードのマージとファイルの調整は上記の手順と同様であるため、後で詳しく説明しません。

2. 記事の紹介に従い、親子コンテナー方式を使用して 2 つのプロジェクトを読み込みます。コードは以下のように表示されます。

3. 当初、このメソッドは父と子の 2 つのコンテナに属するものであり、同じ名前の Bean があっても影響はないと考えていました。しかし、練習後に、上記の推測は間違っていたことが判明しました。Spring Boot が起動すると、バックグラウンドでチェックが行われ、2 つのコンテナに同じ名前の Bean がある場合もエラーが報告されます。また、上記のような名前変更が大量に発生します。1 ~ 2 日悩んだ後、私は最終的にこの大きな期待を寄せる方法を諦めました。

package com.diguage.demo.boot;

import org.springframework.boot.WebApplicationType;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

/**
 * @author D瓜哥 · https://www.diguage.com
 */
public class DemoBootApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder()
                .parent(BootConfig.class).web(WebApplicationType.NONE)
                .child(WebConfig.class)
                // 如果有第三个项目,可以作为子容器的兄弟容器加载。
                // .sibling(SiblingConfig.class)
                .run(args);
    }

    @Configuration
    @ImportResource({"classpath:spring-cfg.xml"})
    @ComponentScan(basePackages = "com.diguage.demo.boot")
    public static class BootConfig {
    }

    @Configuration
    @ImportResource({"classpath:web/spring-cfg.xml"})
    public static class WebConfig {
    }
}

| | Spring Boot がバックグラウンドでチェックされているかどうかは、コードを見ずにエラー メッセージに基づいた推測であるため、この推測にはある程度の不確実性があります。機会があれば、コードを調べて、具体的な理由を確認してください。|

革命はまだ成功していません。その内訳は次回聞きましょう…

著者: Jingdong Technology Li Jun

出典:JD Cloud Developer Community 転載の際は出典を明記してください

Bilibiliは2度クラッシュ、テンセントの「3.29」第1レベル事故…2023年のダウンタイム事故トップ10を振り返る Vue 3.4「スラムダンク」リリース MySQL 5.7、莫曲、李条条…2023年の「停止」を振り返る 続き” (オープンソース) プロジェクトと Web サイトが 30 年前の IDE を振り返る: TUI のみ、明るい背景色... Vim 9.1 がリリース、 Redis の父 Bram Moolenaar に捧げ、「ラピッド レビュー」LLM プログラミング: Omniscient 全能&&愚かな 「ポスト・オープンソースの時代が来た。ライセンスの有効期限が切れ、一般ユーザーにサービスを提供できなくなった。チャイナ ユニコムブロードバンドが突然アップロード速度を制限し、多くのユーザーが苦情を申し立てた。Windows 幹部は改善を約束した: Make the Start」メニューもまた素晴らしいです。 パスカルの父、ニクラス・ヴィルトが亡くなりました。
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4090830/blog/10580684
おすすめ