web-dev-qa-db-ja.com

マイクロサービスのバージョニング

実行時に同じサービスの複数のバージョン管理されたデプロイメントをサポートすること、およびコンシューマーが異なるバージョンを使用する方法について、マイクロサービスベースのアーキテクチャでバージョン管理に適応するためのベストプラクティスは何ですか? 1)前述のアプローチの1つとしてルーティングベースのバージョニングを使用する場合 here 次に、次の欠点があると思います

  1. 内部サービスは、消費のためにリバースプロキシを経由する必要があります。
  2. 消費者は常に必要なバージョン管理に注意する必要があります。

バージョン情報をユーザーに公開することはベストプラクティスですか?

いずれにせよ、私が感じるように、次のことが常に当てはまります。

  1. MAJORバージョン変更の場合、コンシューマーを変更する必要があります。
  2. マイナーバージョン変更(下位互換性)の場合、変更が必要なのは、追加機能を必要とするコンシューマーのみです。
  3. PATCHバージョンの変更の場合、これはオプションであり、おそらくすべての消費者がそれを利用するためにシームレスになります。

上記を可能にするために、どのようなマイクロサービスのバージョン管理戦略が役立ちますか?

注-これを複数の質問に分割する必要がある場合は、遠慮なくお知らせください。

15
Divs

今のところ問題は解決していないと言っても差し支えないと思います。マイクロサービスアーキテクチャでは、各サービスを疎結合にする必要があります。プロデューサーを変更するときに、コンシューマーを追い詰めて変更する必要がある場合は、設計に欠陥があることを示しています。リンクに示されているルーティングベースのバージョン管理には、「いくつかの欠点」以上のものがあるようです。

サービス全体をバージョン化するか、APIのみをバージョン化しますか?

サービス全体をバージョン管理する場合、常にかなりの量のワームを開くことになります。サービスAの最初のバージョン(v1)を実装したとします。しばらくして、ビジネスのために新しいバージョン(v2)を実装しなければならなくなったとします。このサービスのv2でバグが発見された場合はどうなりますか?チームは、同じバグがv1にも存在しないことを確認する必要があります。含まれている場合は、v1も修正して再デプロイする必要があります。単にコピーして貼り付けるだけの場合でも、両方のバージョンを再テストして再デプロイする必要があります。また、バージョン間にリファクタリングがあり、v1を修正する方法がv2を修正する方法と異なる場合はどうなりますか?また、2つのバージョンの代わりに5または10がある場合はどうなりますか?私よりおかしな誰かが、「これはすぐにスケーリングされた」ミームを作成する必要があります。

このオプションが与える頭痛の種の表面をスクラッチするだけで、基本的には、APIのみをバージョン管理することですでに決定できます。ただし、基本的には、サービスをコードレベルでバージョン管理する場合:

  1. チームはサービスの1つのバージョンをサポートする必要があるだけです(バグは1回だけ修正されます)
  2. サービスのさまざまな、場合によっては非常に異なるバージョンの大量のサービスを理解する必要がないため、チームの認知能力の低下
  3. 少ないリソース消費
  4. バージョン間ですべてが一貫していることの保証(保証されていない場合でも、少なくとも可能性ははるかに高い)

クライアントが消費するapiのバージョンを通信する方法

この回答では、REST apisについてのみ言及します。これは、私が十分に理解しているためです。APIのバージョン管理には、基本的に4つの方法があります(私が考えることができます):

  1. URIのバージョン管理: " http:// Host/serviceA/v3/whatever "
  2. Acceptヘッダーのバージョン
  3. カスタムヘッダーのバージョン
  4. パラメータとしてのバージョン

これ チュートリアル は、これらのそれぞれについて、私よりも欠点を説明しますが、基本的にこれらの誰もがう​​まくやるべきです=)

どのように(f ***** g hell)同じコードで無数のサービスバージョンを維持できますか? (クレイジーですか???)

サービス自体は1つだけです。あなたがしなければならないのは、アダプターの設計パターンを適用して、サービスのビジネス層と相互作用するインとアウトの異なるバージョンが存在するようにすることです。この方法では、いくつかのオブジェクトのいくつかのバージョンがあり、サービスのコアに対して透過的です。それは質問で言及された article の同じ結論であり、それを紹介するためのきちんとした例さえ持っています。

13
Roger Gouveia

ベストプラクティスはありません。それは、特定のケースでバージョニングがどのように機能するかに依存します。

Shawn Wildermuthが pluralsightビデオ でAPIのバージョン管理について話しました。マイクロサービスの実装の詳細はわかりませんが、rest apiを使用している場合は、実際のペイロードのバージョニングを試すことができます

Acceptヘッダーを使用してこれを行うこともできます。 Acceptを使用すると、確認したいAPIに対してバージョンヘッダーをAcceptヘッダーに付けることができます。また、コンテンツタイプでもこれを行うことができます。ベンダーのapplication/vndは、返されるデータのバージョンを指定します。これにより、アプリケーションがそれを送信したときに、ペイロードのバージョンがわかるようになります。また、API、実際のURI呼び出し、および返されるデータの形状の両方をバージョン管理する必要があるため、これはバージョン管理における重要な手法です。

ご使用の環境で、顧客やユーザーとうまく機能するメカニズムを見つけたら、それを使用してください。

0
MJK

マイクロサービスベースのアーキテクチャでバージョニングに適応するためのベストプラクティスは何ですか

私のマイクロサービスプロジェクトで使用する1つの戦略は、ルーティングによるバージョン管理です。

JSON RPC 2.0を使用しているため、RESTとは少し異なりますが、適用できます。

メジャーバージョン管理のみを使用し、古いバージョンと新しいバージョンを同時に使用して、消費者が更新できる時間を確保します。

注意事項

  • 3つ以上のバージョンのサービスを本番環境で使用することは避けてください(モデルの更新がある場合は管理が非常に困難です)。

  • 使用しているバージョンが非推奨であることを消費者に伝える方法を見つけてください。

一部のマイクロサービスアーキテクチャはバージョニングなしで機能することは知っていますが、これは、コンシューマーとプロデューサーの間に強い結合があることを意味するため、このアプローチはお勧めしません。

2番目の質問に答えるには

消費者はどのようにして異なるバージョンを使用できるでしょうか?

消費者は一度に1つのバージョンのみを使用する必要があるため、不可能に思えます。

実行時にバージョンを使用できることを知りたい場合は、サービスの検出と組み合わせて機能の切り替えを実行できます。

ルートxが存在する場合、コンシューマは定期的にサービスディスカバリを要求します。 trueの場合は機能を使用し、それ以外の場合は現在のバージョンを続行します。うまくいくかもしれませんが、管理するのはちょっと難しいです。

0
David Level

さまざまな戦略を組み合わせることができます

メジャーな変更には、ルーティングベースのバージョン管理を使用できます

他の場合はアダプターベースのバージョン管理を使用できます

0
Vijay Parmar