マイクロサービスに関しては、サービスの開発ライフサイクルも独立している必要があります。*
異なるSLDCと異なる開発チーム
実際のMSシステムでは、エコシステムの開発に関与する複数のチームが存在し、各チームが1つ以上のサービスを担当しています。順番に、これらのチームは異なるオフィス、都市、国、計画に配置される可能性があります...おそらく、彼らはお互いのことさえ知らないので、知識やコードを共有することを非常に難しくしています(可能であれば)。しかし、これは非常に便利です。なぜなら、共有コードは一種の共有の推論を暗示し、特定のチームにとって意味のあるものは別のチームのために作る必要がないということを思い出すことが重要だからです。たとえば、DTO Customerを指定すると、プレイ中のサービスによって異なる場合があります。これは、顧客が各サービスとは異なる方法で解釈(または表示)されるためです。
さまざまなニーズ、さまざまなテクノロジー
また、分離されたSLDCにより、チームはニーズに最適なスタックを選択できます。特定のテクノロジーで実装されたDTOを課すと、チームが選択する能力が制限されます。
DTOはビジネスルールでもサービス契約でもありません
DTOは本当に何ですか?データを一方から他方に移動する以外の目的のないプレーンオブジェクト。ゲッターとセッターのバッグ。まったく知識がないため、全体として再利用する価値のある種類の「知識」ではありません。また、不安定なため、カップリングの候補としても不適切です。
Dherikが述べたことに反して、サービスは、他のサービスを同時に変更する必要なく、DTOを変更できる必要があります。サービスは、寛容な読者、寛容な作家、失敗に寛容でなければなりません。それ以外の場合は、サービスアーキテクチャが意味をなさないような方法で結合を引き起こします。Dherikの答えとは逆に、3つのサービスがまったく同じDTOを必要とする場合、サービスの分解中に何かがうまくいかなかった可能性があります。
異なるビジネス、異なる解釈
サービス間に横断的な概念が存在する可能性がありますが、すべてのサービスがそれらを同じ方法で解釈することを強制する標準モデルを課す必要があるわけではありません。
ケーススタディ
弊社には、カスタマーサービス、販売、配送の 3つの部門があるとします。これらのそれぞれが1つ以上のサービスをリリースするとします。
顧客サービスは、そのドメイン言語のために、顧客が人である顧客の概念を中心にサービスを実装します。たとえば、顧客は、名前、姓、年齢、性別、電子メール、電話などとしてモデル化されます。
さて、Sales and Shippingはそれぞれのドメイン言語に従ってサービスをモデル化します。これらの言語では、概念顧客も表示されますが、微妙な違いがあります。彼らにとって、顧客 は(必ずしも)人ではありません。以下のために 販売、顧客がある文書番号クレジットカードと請求先住所のため、出荷フルネームと配送先住所を過ぎます。
私たちが強制した場合の販売および出荷をの標準的なデータモデルを採用する顧客サービスを、我々は、彼らが全体の表現を維持し続けなければならない場合には不必要な複雑さを導入してしまう可能性があり、不必要なデータを扱うためにそれらを強制している顧客と同期してデータを顧客サービス。
関連リンク
*ここに、このアーキテクチャの長所があります
proto
gRPC のファイルまたはavro
Kafka のスキーマを共有し、両方のサービスでDTOを生成してもかまいませんが、2つのプロジェクト間で共有ライブラリを共有することはありません。