关于添加多个tomcat连接器并将它们分别绑定到单独的控制器的能力,存在一个很好的问题。
安迪·威尔金森的好答案的实质在这里:
public static void main(String[] args) { SpringApplicationBuilder parentBuilder = new SpringApplicationBuilder(ApplicationConfiguration.class); parentBuilder.child(ServiceOneConfiguration.class) .properties("server.port:8080").run(args); parentBuilder.child(ServiceTwoConfiguration.class) .properties("server.port:8081").run(args); }
我想再继续问一个问题:
有没有一种方法可以使每个子应用程序上下文在支持所有标准spring-boot功能(例如配置文件后缀文件名等)的情况下读取某些特定于子应用程序的属性。
具有三个单独的属性文件:
application.properties
child1.properties
child2.properties
并能够为每个上下文设置一个文件。
但是对我来说重要的是,它们必须支持所有的弹簧靴魔术。例如,如果我激活新的配置文件(如传递命令行参数)--spring.profiles.active=dev,那么不仅应该自动加载这三个文件(每个上下文一个),还应自动加载另一组文件(如果存在):
--spring.profiles.active=dev
application-dev.properties
child1-dev.properties
child2-dev.properties
当然,这些文件应按定义顺序等在标准spring-boot的支持路径中搜索。
如果带有某些编码的框是否可能出来?
仅具有一个application.properties文件(支持配置文件等),但是以某种方式将前缀属性映射到子上下文的未前缀属性。
例:
child1.server.port=8081 child1.foo=bar child2.server.port=8082 child2.foo=baz
第一个孩子上下文应该看到这些属性,就像它们只是:
server.port=8081 foo=bar
第二个子上下文应该看到这些属性,就像它们只是:
server.port=8082 foo=baz
因此,标准的spring-boot的自动配置将起作用并正确设置了tomcat的端口等。
我不是在寻找特定的方法(但是,如果您问我,我倾向于第二种方法),但是任何开箱即用的工作或可以用最少的方式进行的工作都可以满足我的要求。
您可以使用spring.config.name以下方法实现第一个建议:
spring.config.name
public static void main(String[] args) { SpringApplicationBuilder parentBuilder = new SpringApplicationBuilder(ParentApplication.class) .web(WebApplicationType.NONE); parentBuilder.run(args); parentBuilder.child(ServiceOneConfiguration.class) .properties("spring.config.name=child1").run(args); parentBuilder.child(ServiceTwoConfiguration.class) .properties("spring.config.name=child2").run(args); }
然后child1{-profile}.properties,您可以分别使用和child2{-profile}.properties配置服务一和服务二。
child1{-profile}.properties
child2{-profile}.properties
例如,使用server.port=8081in child1.properties和server.port=8082in child2.properties,在两个子服务中启动使用自动配置的应用程序时,您应该看到类似于以下内容的输出spring-boot-starter- web:
server.port=8081
server.port=8082
spring-boot-starter- web
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.2.RELEASE) 2019-01-22 13:38:09.690 INFO 80968 --- [ main] com.example.parent.ParentApplication : Starting ParentApplication on … 2019-01-22 13:38:09.692 INFO 80968 --- [ main] com.example.parent.ParentApplication : No active profile set, falling back to default profiles: default 2019-01-22 13:38:09.842 INFO 80968 --- [ main] com.example.parent.ParentApplication : Started ParentApplication in 0.371 seconds (JVM running for 0.644) . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.2.RELEASE) 2019-01-22 13:38:10.046 INFO 80968 --- [ main] com.example.parent.ParentApplication : No active profile set, falling back to default profiles: default 2019-01-22 13:38:10.584 INFO 80968 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) 2019-01-22 13:38:10.604 INFO 80968 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2019-01-22 13:38:10.605 INFO 80968 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.14] 2019-01-22 13:38:10.613 INFO 80968 --- [ main] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/awilkinson/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.] 2019-01-22 13:38:10.668 INFO 80968 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2019-01-22 13:38:10.668 INFO 80968 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 612 ms 2019-01-22 13:38:10.829 INFO 80968 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2019-01-22 13:38:10.981 INFO 80968 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '' 2019-01-22 13:38:10.981 INFO 80968 --- [ main] com.example.parent.ParentApplication : Started ParentApplication in 0.955 seconds (JVM running for 1.784) . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.2.RELEASE) 2019-01-22 13:38:11.003 INFO 80968 --- [ main] com.example.parent.ParentApplication : No active profile set, falling back to default profiles: default 2019-01-22 13:38:11.093 INFO 80968 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8082 (http) 2019-01-22 13:38:11.095 INFO 80968 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2019-01-22 13:38:11.096 INFO 80968 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.14] 2019-01-22 13:38:11.100 INFO 80968 --- [ main] o.a.c.c.C.[Tomcat-1].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2019-01-22 13:38:11.101 INFO 80968 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 97 ms 2019-01-22 13:38:11.135 INFO 80968 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2019-01-22 13:38:11.164 INFO 80968 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8082 (http) with context path '' 2019-01-22 13:38:11.165 INFO 80968 --- [ main] com.example.parent.ParentApplication : Started ParentApplication in 0.183 seconds (JVM running for 1.967)