目次
1。正しい動機から始めます(そして一般的な落とし穴を避けます)
2。絞め殺しパターンを使用して、モノリスを徐々に交換します
3.ドメイン駆動型デザイン(DDD)を使用して、境界コンテキストを特定します
4.適切な通信スタイルを選択します
5.サービス全体でデータの一貫性を処理します
6.観測可能性を早期に構築します
7.展開とCI/CDを自動化します
最終的な考え
ホームページ バックエンド開発 C#.Net チュートリアル モノリスからマイクロサービスまで:.NETアプリケーション用の移行ガイド

モノリスからマイクロサービスまで:.NETアプリケーション用の移行ガイド

Sep 19, 2025 am 05:21 AM

.NETモノマーをマイクロサービスに移動すると、1回限りの書き換えを避ける必要があります。 1.最初に、モバイルマシンの移行を明確にし、共通のトラップを避けて、チームがDevOpsと観察可能性の機能を確保することを保証します。 2。Stranglerモードを使用して、徐々に交換し、APIゲートウェイを介して新しいサービスに新しい機能をルーティングします。 3.ドメイン駆動型の設計を使用して、境界のあるコンテキストを識別し、ビジネスの境界に従ってサービスを分割し、データベースを分離します。 4.適切な通信方法を選択し、ユーザーリクエストにHTTP/RESTを使用し、イベントにAzure Serviceバスなどの非同期メッセージを使用します。 5.イベントの最終的な一貫性、SAGAモード、およびアウトボックスモードを通じて、クロスサービスデータの一貫性を確保します。 6. SerilogやOpentelemetryなどのツールを統合して、ログ、追跡、メトリック監視システムを構築します。 7.各サービスに独立したCI/CDパイプラインを確立し、Dockerを使用してコンテナ化し、Kubernetesなどのプラットフォームに展開します。このプロセスは、1回限りのプロジェクトではなく漸進的な進化であり、システムの安定した動作を検証し、継続的に確保するための小さなステップで完了する必要があります。

モノリスからマイクロサービスまで:.NETアプリケーション用の移行ガイド

.NETモノリスをマイクロサービスに移行することは、一度にすべてを書き直すことではなく、複雑なシステムを管理に分解し、ビジネスの継続を維持しながら独立したサービスに分解することです。正しく行われると、このシフトはスケーラビリティ、チームの自律性、展開速度を向上させます。しかし、そこに到達するには、戦略、忍耐、およびいくつかの重要なパターンが必要です。

これは、実用的で低リスクの方法で移行にアプローチする方法です。


1。正しい動機から始めます(そして一般的な落とし穴を避けます)

コードの単一行を書く前に、尋ねてください:なぜ私たちはマイクロサービスに移動するのですか?

一般的な正当な理由:

  • チームはお互いのコードを踏んでいます。
  • 展開サイクルが長すぎます。
  • アプリの特定の部分は、独立してスケーリングする必要があります。
  • 新しい技術スタックまたは展開モデルを紹介しています。

赤旗:

  • 「他のみんながそれをやっているからです。」
  • DevOpsまたはCI/CDパイプラインはありません。
  • 監視または観察性の欠如。

マイクロサービスは運用上の複雑さを追加します。チームチームが分散型システムを管理する準備ができていない場合は、1つの問題のセットを難しいシステムと交換します。


2。絞め殺しパターンを使用して、モノリスを徐々に交換します

Stranglerパターンにより、リスクの「ビッグバン」を書き直さずに、モノリスの一部を徐々に交換できます。

それがどのように機能するか:

  • 既存のモノリスを走らせ続けます。
  • 新しい機能(または高インパクトモジュール)を新しいマイクロサービスにルーティングします。
  • APIゲートウェイまたは逆プロキシを使用してリクエストをルーティングします。古いパスはモノリスに移動し、新しいパスはマイクロサービスに移動します。
  • 時間が経つにつれて、モノリスからより多くの機能が「絞め殺され」ます。

.NETの例:モノリスが注文と在庫モジュールと在庫モジュールがしっかりとなっているとします。あなたはできる:

  • ASP.NETコアWeb APIを使用して、インベントリをスタンドアロンサービスに抽出します。
  • 別のアプリとして展開します(例:KubernetesまたはAzure App Service)。
  • プロセスのロジックを使用する代わりに、モノリスを更新して新しいインベントリAPIを呼び出します。
  • 最終的には、古い在庫コードを非難します。

OcelotやYarp(さらに別の逆プロキシ)などのツールは、移行中にトラフィックをルーティングするのに役立ちます。


3.ドメイン駆動型デザイン(DDD)を使用して、境界コンテキストを特定します

すべてのクラスやフォルダーがサービスになるわけではありません。 DDDを使用して自然の境界を見つけます。

聞く:

  • システムのどの部分が一緒に変化しますか?
  • どのデータが緊密に結合されていますか?
  • 誰がこの機能(チームの境界)を所有していますか?

たとえば、eコマースアプリで:

  • 注文→注文サービス
  • 支払い→支払いサービス
  • ユーザー→IDサービス
  • 製品カタログ→カタログサービス

各サービスはデータを所有する必要があります。共有データベースは避けてください。 .netでは、これは次のことを意味します。

  • 各サービスには独自のDBContextがあります。
  • 孤立したデータベースでエンティティフレームワークコアを使用します。
  • 直接DBアクセスよりも非同期通信(たとえば、メッセージングを介して)を好む。

4.適切な通信スタイルを選択します

モノリスでは、メソッドコールは処理されていて高速です。マイクロサービスでは、ネットワークコールを処理する必要があります。

.NETのオプション:

  • HTTP/REST - シンプルで広くサポートされています。 HttpClientまたはrefitを使用します。
  • GRPC - より速く、契約最初、内部サービスに最適です。 .NET 5に組み込まれています。
  • メッセージング(例:Rabbitmq、Azure Service Bus) - 非同期、デカップされた通信を有効にします。

ベストプラクティス:

  • ユーザー向けAPIを使用したリクエスト/応答には、同期(HTTP)を使用します。
  • バックグラウンドタスクまたはサービス間イベントにAsyncメッセージングを使用します(たとえば、「OrderCreated」→トリガーインベントリ控除)。

.NETのAzure Service Busの例:

 //イベントの公開
await sender.sendmessageasync(new servicebusmessage(jsonserializer.serialize(order)));

MassTransitやNServiceBusなどのライブラリを使用して、メッセージングパターンを簡素化します。


5.サービス全体でデータの一貫性を処理します

最大の課題の1つは、分散トランザクションを簡単に使用することはできません。

ソリューション:

  • 最終的な一貫性- データが一時的に同期していない可能性があることを受け入れます。
  • SAGAパターン- 補償アクションで長い操作をステップに分割します。
  • アウトボックスパターン- イベントを同じDBトランザクションに保存し、確実に公開します。

.NETでは、以下を使用してアウトボックスを実装できます。

  • 発信イベントを保存するテーブル。
  • 投票して公開するバックグラウンドサービス( IHostedService )。

これにより、デュアルの書き込みが回避され、信頼性が保証されます。


6.観測可能性を早期に構築します

分散システムを使用すると、デバッグが難しくなります。

.NETのための重要なツール:

  • ロギング- 構造化されたロギングでセリログを使用します。
  • トレース- ASP.NETコアのオペンテレメトリーを有効にして、サービス全体でリクエストを追跡します。
  • メトリック- PrometheusのエンドポイントをOpenTelemetry.Exporter.Prometheusで公開します。
  • 健康チェック- プログラムでMapHealthChecks()を使用します。

例:

 builder.services.addopentelemetrytracing(tracing => {
    tracing.addaspnetcoreinstrumentation()
           .addhttpclientinstrumentation()
           .addotlpexporter(); // JaegerまたはGrafana Tempoに送信します
});

初日からこれを設定します。後で自分に感謝します。


7.展開とCI/CDを自動化します

各マイクロサービスは独立して展開できる必要があります。

.netでは、これは次のことを意味します。

  • サービスごとに1つのgitリポジトリ(または、慎重なパイプラインを備えたモノレポを使用します)。

  • 個別のCI/CDパイプライン(Azure Devops、GitHubアクション)。

  • Dockerでコンテナライズ:

     mcr.microsoft.com/dotnet/aspnet:8.0からベースとして
    workdir /app
    8080を公開します
    
    mcr.microsoft.com/dotnet/sdk:8.0からビルドとして
    WorkDir /SRC
    コピー 。 。
    dotnet publish -c lelease -o /app /outを実行します
    
    ファイナルとしてベースから
    workdir /app
    コピー -  from = build /app /out。
    EntryPoint ["dotnet"、 "orderservice.dll"]]

    Kubernetes、Azureコンテナアプリなどに展開します。


    最終的な考え

    .NETモノリスからマイクロサービスに移行することは、プロジェクトではなく旅です。小さいスタート:1つの適切なモジュールを選択し、Stranglerパターンを使用して安全に抽出し、運用上のオーバーヘッドを検証します。

    チームの自律性、独立した展開能力、回復力に焦点を当てます。テクノロジーだけではありません。

    .NETエコシステムを賢明に使用します。ASP.NETコア、エンティティフレームワーク、オペンテレメトリ、および最新のクラウドプラットフォームを活用して、摩擦を軽減します。

    モノリスを一晩交換することではありません。システムの進化を容易にすることです。一度に1つのサービスです。

    基本的に、小さな一歩を踏み出し、インパクトを測定し、ライトを維持します。

    以上がモノリスからマイクロサービスまで:.NETアプリケーション用の移行ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Stock Market GPT

Stock Market GPT

AIを活用した投資調査により賢明な意思決定を実現

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

C#のappsettings.jsonからアプリの設定を読む方法は? C#のappsettings.jsonからアプリの設定を読む方法は? Sep 15, 2025 am 02:16 AM

答えは、microsoft.extensions.configurationを使用してappsettings.jsonを読むことです。 1. appsettings.jsonを作成し、コピープロパティを設定します。 2。microsoft.extensions.configuration.jsonパッケージをインストールします。 3。構成を構成Builderでロードします。 4.インデクサーまたはgetConnectionStringを介して値を読みます。 5.強く型と入力された構成クラスを使用するか、バインディングを取得することをお勧めします。

C#文字列対StringBuilderのパフォーマンスと使用法。 C#文字列対StringBuilderのパフォーマンスと使用法。 Sep 16, 2025 am 05:24 AM

usestringforminimal、statictextoperations; usestringbuilderforfrequentModificationsinloopsorlge-scaleconcatenation stoepperformance anducememoryallocationを使用します。

C#でHTTPCLIENTクラスを正しく使用する方法は? C#でHTTPCLIENTクラスを正しく使用する方法は? Sep 15, 2025 am 01:23 AM

httpclientは、頻繁に作成されるのではなく、長時間再利用する必要があります。ソケットの使い果たしを避けるために、ihttpclientfactoryインジェクション管理を使用することをお勧めします。 DIがない場合は、静的インスタンスを使用して、合理的なライフサイクルを確保します。

モノリスからマイクロサービスまで:.NETアプリケーション用の移行ガイド モノリスからマイクロサービスまで:.NETアプリケーション用の移行ガイド Sep 19, 2025 am 05:21 AM

.NETモノマーをマイクロサービスに移動すると、1回限りの書き換えを避ける必要があります。 1.最初に、モバイルマシンの移行をクリアし、共通のトラップを避けて、チームがDevOpsと観察可能性の機能を確保することを保証します。 2。Stranglerモードを使用して、徐々に交換し、APIゲートウェイを介して新しいサービスに新しい機能をルーティングします。 3.ドメイン駆動型の設計を使用して、境界のあるコンテキストを識別し、ビジネスの境界に従ってサービスを分割し、データベースを分離します。 4.適切な通信方法を選択し、ユーザーリクエストにhttp/RESTを使用し、イベントにAzureserviceBusなどの非同期メッセージを使用します。 5.イベントの最終的な一貫性、SAGAモード、およびアウトボックスモードを通じて、クロスサービスデータの一貫性を確保します。 6.セリログ、オペンテレメトリー、およびその他のツールの早期統合日付を作成する

c#linqのfirst()とfirstordefault()の違いは何ですか? c#linqのfirst()とfirstordefault()の違いは何ですか? Sep 16, 2025 am 12:33 AM

first()throwsAnexceptionifnoelementisfound、whilefirstordefault()returnSadeFaultValue; usefirst()whentheSequenceisexpectedTobenon-empty、andfirstordefault()tohandleempty seavecencefuly。

C#のさまざまなアクセス修飾子は何ですか? C#のさまざまなアクセス修飾子は何ですか? Sep 21, 2025 am 01:43 AM

パブリックメンバーには、任意のコードでアクセスできます。 2.Privateはクラス内でのみアクセスできます。 3.保護されているため、クラスと派生クラスへのアクセスが可能になります。 4.内部は、同じアセンブリ内のアクセスに限定されます。 5.ProtectedEnternalalは、派生クラスまたは同じアセンブリへのアクセスに使用される保護および内部の連合です。

C#でキャンセルトークンを作成して使用する方法は? C#でキャンセルトークンを作成して使用する方法は? Sep 21, 2025 am 01:49 AM

CancellationTokenSourceを作成して、キャンセルトークンを取得します。これは、他のスレッドまたはコンポーネントに通知して操作をキャンセルするために使用されます。 2。トークンをキャンセル(task.runなど)をサポートする非同期方法に渡します。タスクは、キャンセル要求を定期的にチェックして、優雅な終了を達成することができます。

C#でパターンマッチングを使用する方法は? C#でパターンマッチングを使用する方法は? Sep 20, 2025 am 04:32 AM

patternMatchinginc#isafeatureusedtocheckobjectsagainstpatternsandextract information concisely.1.typepternsallowchecking andcastinginonestep、asshownwithif(valueisstringstr).2.constantpatternscomparevaluesagainstantcontantsdistantdireccingif(

See all articles