2017-08-18 17 views
0

2つの独立したWebサービスで構成されるREST APIをSpringブートで構築しました。私はこれら2つのWebサービスが同じマシン上でホストされるかどうかはわかりませんので、すべてのサービスに対してリモートおよびローカル実装を行いたいと思います。例以下:REST APIサービスのリモートまたはローカル実装の自動実行

ローカルサービスの実装:

public class LocalExampleService implements ExampleService{ 

    public Item getItem(long id){ 
     //Get item using implementation from another local project 
    } 
} 

リモートサービスの実装:

public class RemoteExampleService implements ExampleService{ 

    @Value("${serviceURL}") 
    private String serviceURL; 

    public Item getItem(long id){ 
     //Get item calling remote service 
    } 
} 

コントローラー:

public class MyController{ 
    @Autowired 
    private ExampleService exampleService; 
} 

Webサービスは、ローカルおよびリモートの実装とIとの多くのサービスを提供していますどのタイプの実装を選択すべきかをSpringに知らせたいすべてのサービス。

私はプロパティファイルにURLを置くことを考えていました。そして、初期化の際に、アプリケーションはプロパティにurlが含まれているかどうかをチェックしてから、適切にサービスをautowireします。しかし、私は、autowiringするすべてのサービスのロジックを記述する必要があります。

正しいサービス実装を自動的にオートワイヤリングする最適なオプションは何ですか?このhttps://github.com/StanislavLapitsky/SpringSOAProxy

アイデアのようなものを実装する

+0

もっと説明できますか?あなたはアプリケーションの1つのインスタンスが一度に1つまたは他のものを必要とするだけであることを意味しますか?または実行時に必要なものを決定する必要がありますか? – Brian

+0

@Brian私は2つの別々のWebサービスを持っています。両方のWebサービスが同じマシン上でホストされている場合、Springはサービスのローカル実装をautowireする必要があります(RESTを介して他のサービスを呼び出します)。 –

答えて

2

スプリングプロファイルを使用して、どのバージョンの実装をスプリングプロパティで使用するかを制御できます。ばね特性で

は、すべてのサービスの実装は、プロファイルの注釈を必要と

エントリの下
spring.profiles.active=NAME_OF_ACTIVE_PROFILE 

を追加します。あなたのプロジェクトが地元そうでない場合は、リモートを挿入する代わりにNAME_OF_ACTIVE_PROFILEのプロパティで、サービスのローカル実装を使用する必要がある場合

@Component 
@Profile("local") 
public class LocalExampleService implements ExampleService{} 

@Component 
@Profile("remote") 
public class RemoteExampleService implements ExampleService{} 

:それはあなたのサービスの実装は次のようになります方法です。

完全自動自動配線の場合、起動時にローカル実装クラスが存在するかどうかをチェックし、適切にプロファイルを設定するメソッドを追加する必要があります。これを行うには、スプリングブートメインメソッドでコードを変更する必要があります。

public static void main(String[] args){ 
    String profile = checkCurrentProfile(); //Method that decides which profile should be used 
    System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, profile); 
    SpringApplication.run(MyApplication.class, args); 
} 

この方法を選択すると、プロパティファイルに前のエントリは必要ありません。

0

私の試みは、春のBeanがローカルで自動的にリモートで同じサービスを呼び出すために内部RestTemplateを使用してプロキシを作成して見つけることができないかどうかを確認することです。

契約サービスインターフェイスとDTOを定義し、各サービスに使用するURLを指定するURLリゾルバを定義する必要があります。

関連する問題