如何将 spring-boot 作为客户端应用程序运行?
Posted
技术标签:
【中文标题】如何将 spring-boot 作为客户端应用程序运行?【英文标题】:How to run spring-boot as a client application? 【发布时间】:2017-01-05 10:28:21 【问题描述】:我在单个应用程序中有 2 个主要入口点。
第一个 main 启动服务器,映射控制器并启动一些工作线程。这些工作人员从云队列接收消息。
如果负载增加,我希望能够增加额外的工人来完成我的工作。所以我在我的应用程序中有一个 second Main 入口点,我希望能够在 spring-boot(作为客户端应用程序)中启动 而不启动默认服务器,以便以避免端口冲突(显然这会导致失败)。
我如何实现这一目标?
【问题讨论】:
最好在 Spring Cloud 中运行它,让它为你管理水平缩放。 spring.io/guides/gs/spring-cloud-and-lattice aws (beanstalk) 等其他云也可以管理水平缩放。 当然。我的观点是你应该让他们去做;不要试图自己管理。懒惰 - 使用可用的东西。 【参考方案1】:使用server
和client
配置文件从命令行启动
要对 2 个不同的配置文件使用相同的 jar 和相同的入口点,您只需在运行时提供 Spring 配置文件,以加载不同的 application-$profile.properties(并可能触发条件 Java 配置)。
定义 2 个弹簧轮廓(client
和 server
):
application-$profile.properties
客户端的属性将禁用 Web 容器
只有一个 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
配置文件从 IDE 启动
发射器:
@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
),每个都有自己的 main,这是一个类似的设置 这允许您配置不同的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);
【讨论】:
如何从终端运行这两个不同的应用程序“服务器”和“客户端”?我是否需要有两个不同的构建,或者我可以简单地使用“-cp”吗? 我通过了this,但它似乎不适用于spring-boot。 天才!正是我想要的。非常感谢!以上是关于如何将 spring-boot 作为客户端应用程序运行?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不包含所有spring-boot库的情况下将spring-boot应用程序部署到nexus?
清单错误将 spring-boot 启动为 java 应用程序
如何将 Gatling 与现有的 Spring-Boot + Gradle 应用程序集成