怎么在一个 JVM 里启动多个 Spring Boot Application? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
siteshen
V2EX    Java

怎么在一个 JVM 里启动多个 Spring Boot Application?

  •  
  •   siteshen 2019-07-22 16:22:29 +08:00 6182 次点击
    这是一个创建于 2348 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司项目使用了微服务架构,会启动十多个的 Spring Boot Application,8G 内存的 MacBook Pro 内存有些紧张。当然有一些的办法,比如连接到开发服务器,设置启动参数降低内存,增加电脑内存等,但此处暂不考虑这些方案

    p>想到的一个办法是只启动一个 JVM (比如总共分配 4G 内存),同时启动多个 App。一番研究之后,看到这个东西:

    org.springframework.boot.SpringApplication(ResourceLoader, Class<T>).run(args)

    但默认应该会去读取 all_in_one/src/resources/application.properties 的内容,只有一个 App 时当然没问题,但希望能启动多个 App。复制配置太麻烦,而每个 App 配置文件都是相同的文件名(如下),没办法通过 classpath 区分。

    app1/src/resources/application.properties app2/src/resources/application.properties

    尝试过自己实现 ResourceLoader,但不知道怎么得到另外一个 jar 包里的 resources 目录。

    package all_in_one; import app1.ServiceAccountApplication; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; class AccountResourceLoader extends DefaultResourceLoader { @Override public Resource getResource(String location) { // 怎么让这块代码应用“看起来”是在 app1.Application.main 里启动,而不是默认是的在 all_in_one.Application.main 一样启动? Resource resource = super.getResource(location); System.out.println("location = " + location + " | " + resource.isReadable()); return resource; } } @SpringBootApplication // @ComponentScan(basePackages = "cn.com.actwill.oa.service.account.*") public class FullApplication { public static void main(String[] args) { System.out.println("hello, world"); SpringApplication application = new SpringApplication(new AccountResourceLoader(), ServiceAccountApplication.class); application.run(args); System.out.println("bye, world"); } } 

    如果解决了使用自定义 ResourceLoader 读取文件的问题,应该就能用多个线程启动不同的 App 了(可能有 Bean 冲突,可能会试着用自定义 BeanFactory 增加 namespace 的方式解决)。

    5 条回复    2019-07-23 11:04:26 +08:00
    gfuzan
        2
    gfuzan  
       2019-07-22 18:00:28 +08:00   1
    用类加载器是可行的.启动多个 Application 就是启动多个线程,这里有一个我做个热启动的程序,他现在只能启动一个 App,可以修改一下.
    github.com/GFuZan/HotStart
    arrow8899
        3
    arrow8899  
       2019-07-23 09:51:16 +08:00
    所以服务都启在本地吗,那如果有 40 个 50 个服务呢,还是搭建一套测试环境吧
    siteshen
        4
    siteshen  
    OP
       2019-07-23 10:42:24 +08:00
    @arrow8899 是的,都在本地启动。如果解决了这个问题,同时还能应用到自动化测试上面,不需要各种 mock 微服务。
    arrow8899
        5
    arrow8899  
       2019-07-23 11:04:26 +08:00
    @siteshen 微服务本来就是拆分和解耦的,感觉你是用微服务在做 SOA。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3056 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:02 PVG 20:02 LAX 04:02 JFK 07:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86