2016-08-29 2 views
2

У меня есть 2 Главные пункты входа в одном приложении.Как запустить весеннюю загрузку в качестве клиентского приложения?

первый главный запускает сервер, сопоставляет контроллеры и запускает рабочие потоки. Эти рабочие получают сообщения из облачных очередей.

В случае повышенной нагрузки, я хочу иметь возможность добавлять дополнительных работников для выполнения моей работы. Таким образом, у меня есть второй основной пункт в моем приложении, который я хочу, чтобы иметь возможность запускать без запуска сервера по умолчанию в spring-boot (в качестве клиентского приложения), чтобы избежать конфликта портов (и, очевидно, что приведет к неудаче).

Как это достичь?

+1

Было бы лучше запустить это в Spring Cloud и позволить ему управлять горизонтальным масштабированием для вас. https://spring.io/guides/gs/spring-cloud-and-lattice/ – duffymo

+0

Другие облака, такие как aws (beanstalk), также могут управлять горизонтальным масштабированием. – amitection

+1

Несомненно. Я хочу сказать, что вы должны позволить им это сделать; не пытайтесь справиться с этим сами. Будьте ленивы - используйте то, что доступно. – duffymo

ответ

7

Запуск из командной строки с server и client профилей

использовать ту же банку и ту же точку входа с 2-х различных профилей, вы должны просто предоставить профиль Spring во время выполнения, чтобы иметь четкое применение - $ {профиль } .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/основные/ресурсы/application-server.properties:

spring.application.name=server 
server.port=8080 

SRC/главная/ресурсы/приложение-клиент.свойства:

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 { 
    //... 
} 

Запуск от IDE с 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/основной/ресурсы/application-server.properties:

spring.application.name=server 
server.port=8080 

SRC/основные/ресурсы/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); 
    } 
} 
+0

Как запустить эти два разных приложения «Сервер» и «Клиент» с терминала? Нужно ли иметь две разные сборки, или я могу это сделать, просто используя «-cp»? – amitection

+0

Я прошел через [это] (http://stackoverflow.com/questions/19882752/how-to-configure-pom-xml-to-run-2-java-mains-in-1-maven-project), но он похоже, не работает с весенним сапогом. – amitection

+0

обновлен ответ – alexbt

Смежные вопросы