単一のアプリケーションに2つのメインエントリポイントがあります。
最初のメインサーバーを起動し、コントローラーをマップして、いくつかのワーカースレッドを起動します。これらのワーカーは、クラウドキューからメッセージを受信します。
負荷が増加した場合は、作業を行うためにワーカーを追加できるようにしたいと思います。したがって、アプリケーションに2番目のメインエントリポイントがあり、起動できるようにしますデフォルトサーバーを起動せずにスプリングブート(クライアントアプリケーションとして)に次のようになります。ポートの競合を回避するため(そして明らかに失敗につながる)。
どうすればこれを達成できますか?
server
およびclient
プロファイルを使用してコマンドラインから起動する同じjarと同じエントリポイントを2つの異なるプロファイルで使用するには、実行時にSpringプロファイルを指定するだけで、個別のアプリケーション-$ {profile} .propertiesがロードされます(場合によっては条件付きJava構成がトリガーされました)。
2つのばねプロファイル(client
およびserver
)を定義:
application-${profile}.properties
があります単一のSpringBootAppとエントリポイントがあります:
@SpringBootApplication
public class SpringBootApp {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(SpringBootApp.class)
.run(args);
}
}
このクラスをメインクラスにします。
src/main/resources/application-server.properties:
spring.application.name=server
server.port=8080
src/main/resources/application-client.properties:
spring.application.name=client
spring.main.web-environment=false
コマンドラインから両方のプロファイルを起動します:
$ Java -jar -Dspring.profiles.active=server YourApp.jar
$ Java -jar -Dspring.profiles.active=client YourApp.jar
アクティブなプロファイルに基づいて、@Configuration
クラスが条件付きでトリガーされる場合もあります。
@Configuration
@Profile("client")
public class ClientConfig {
//...
}
server
およびclient
プロファイルを使用して起動ランチャー:
@SpringBootApplication
public class SpringBootApp {
}
public class LauncherServer {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(SpringBootApp.class)
.profiles("server")
.run(args);
}
}
public class ClientLauncher {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(SpringBootApp.class)
.profiles("client")
.web(false)
.run(args);
}
}
追加の構成クラス(クライアントまたはサーバーに固有)を指定できます。
new SpringApplicationBuilder()
.sources(SpringBootApp.class, ClientSpecificConfiguration.class)
.profiles("client")
.web(false)
.run(args);
src/main/resources/application-server.properties:
spring.application.name=server
server.port=8080
src/main/resources/application-client.properties:
spring.application.name=client
#server.port= in my example, the client is not a webapp
2つのSpringBootApp(
ClientSpringBootApp
、ServerSpringBootApp
)があり、それぞれに独自のメインがあります。これは同様のセットアップであり、異なるAutoConfiguration
またはComponentScan
:
@SpringBootApplication
@ComponentScan("...")
public class ServerSpringBootApp {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(ServerSpringBootApp.class)
.profiles("server")
.run(args);
}
}
//Example of a difference between client and server
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@ComponentScan("...")
public class ClientSpringBootApp {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(ClientSpringBootApp.class)
.profiles("client")
.web(false)
.run(args);
}
}