2017-07-18 8 views
1

私はメインアプリケーションと管理アプリケーションをマイクロサービスとして構築しており、api経由で通信しています。私はそれらの2つのアプリの間でいくつかの定数を共有したいと思います。Railsマイクロサービス間でconstansを共有するには?

たとえば、所有者または正規の役割を持つユーザーモデルがあります。管理アプリではユーザーを検索できます。この検索で​​は、ハードコードされたユーザータイプ(所有者、通常)のドロップダウンがあります。これは問題ありませんが、名前を変更すると(例:標準 - >標準)、管理アプリも更新する必要があります。

メインアプリでコアネーミングを変更するたびに、これらの定数を何とか共有したいので、メインアプリのすべての変更が同時に管理者を変更します。まずJSON APIを介して管理者にメインアプリから定数を送信している

:については

は、今私は長所と短所の両方で、2つの解決策を見つけました。私は、クラス変数にすべての定数をフェッチして格納するクラスを構築しているので、アプリケーションのすべての部分から利用できます。このソリューションの良い点はパフォーマンスです(メモのおかげで、APIリクエストは1つしかありません)。後で簡単に使用できます。悪いことに、私はこの場合のテストをどのように扱うか分かりません。もちろん、私のテストではメインアプリにリクエストをしてこのリクエストをスタブすることはできません。メインアプリケーションの定数を変更するたびに、管理アプリでテストを変更する必要があるためです。

私が考えていた第2のアプローチは、すべての定数を格納する宝石を作ることでした。実装が非常に簡単ですが、これは、メインアプリケーションの定数を変更するたびにこのレポを変更する必要があることを意味します。また、私はビッグチームと一緒に仕事をしており、彼らは同時に2つのレポに取り組まなければならないことに満足していません。

これらのソリューションについてどう思いますか?最初はテスト以外の私にとって完璧だと思われるので、実際の値を持たずにこれらの定数をスタブする方法をいくつか考えてみてください。私はまだ宝石の解決策を試していないので、いくつかの障害がある場合は教えてください。 この問題のもう一つの良い解決策があるのでしょうか?

+1

私は個人的にはjson apiの解決策が目立たないように設計されています。誰もが共有機能を宝石で実装しています。 – mudasobwa

+0

https:// githubと似たような感じです。com/spring-cloud/spring-cloud-config設定サーバー。しかしRubyでこのようなことが起こったことはありません –

+0

共有データベーススキーマに存在する 'name'プロパティを持つUserオブジェクトを持つだけでは不思議です。これは大規模に強化されたように聞こえる。 – mcfinnigan

答えて

1

サービス自体の構造に関して、より良い解決策があるかどうかはわかりません。たとえば、2つのサービスの一方が、もう一方のサービス用の定数を返すAPIを持つことがあります。

しかし、質問に答えるには、エンジンを使用するか、定数を単純に共有する可能性が高い、宝石です。 bundle gem <GEM NAME>で新しい宝石を作成し、それを両方のアプリケーションのGemfileに追加することができます。

宝石のサーバー(例:geminabox)を持っているか、コードレポを直接指し示す必要があります。個人的にあなたが倒れ宝石を共有している場合には他の言語でのサービスを書き換えする場合がありますので、私は定数を返すAPIと一緒に行きたい話す

gem 'my-gem', git: '[email protected]:git/my-gem` 

+0

あなたの答えをありがとう!私はあまりにも多くの宝石のアイデアが好きではありませんが、私はAPIを使用するときにテストスイートにそれらの定数を提供する方法を見つけることができません。テストでそれらをハードコーディングすることは、アプリ内のどこにでもハードコーディングすることと同じです。 – Ptr

+0

テストでは、WebMockやMockServer、VCRなどのWebサービスを模擬することができます(VCRは実際のWebサービスからの応答を呼び出してキャッシュします)。したがって、実際のデータが使用されますが、キャッシュされているため、テストは高速です。 – Kris

0
  1. 宝石を書き、それをさまざまなサービスに組み込む。
  2. 同じマシンで実行する場合は、もう1つの可能性はenv varsです。
  3. DB /ストレージ(つまり、memchache/redi)に保管してください。各サービスinitに関連する定数をロードします。
関連する問題