同社はコスト削減と効率化を推進しているが、さまざまな方法を試した結果、アプリケーションが多すぎることが判明した。ディザスタリカバリ用に各アプリケーションを複数のコンピュータルームに展開するには、少なくとも 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」メニューもまた素晴らしいです。 パスカルの父、ニクラス・ヴィルトが亡くなりました。