如何将 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】:

使用serverclient 配置文件从命令行启动

要对 2 个不同的配置文件使用相同的 jar 和相同的入口点,您只需在运行时提供 Spring 配置文件,以加载不同的 application-$profile.properties(并可能触发条件 Java 配置)。

定义 2 个弹簧轮廓(clientserver

每个都有自己的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 
    //...


使用 serverclient 配置文件从 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,这是一个类似的设置 这允许您配置不同的AutoConfigurationComponentScan

@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 应用程序

如何使用Spring-boot处理越来越多的STOMP主题

如何将 Gatling 与现有的 Spring-Boot + Gradle 应用程序集成

如何使用 IntelliJ IDEA 社区版调试 spring-boot 应用程序?

将spring boot应用程序用作unix服务时如何调整jvm