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

2019-07-22 16:22:29 +08:00
 siteshen

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

想到的一个办法是只启动一个 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 的方式解决)。

5559 次点击
所在节点    Java
5 条回复
HuasLeung
2019-07-22 17:30:03 +08:00
gfuzan
2019-07-22 18:00:28 +08:00
用类加载器是可行的.启动多个 Application 就是启动多个线程,这里有一个我做个热启动的程序,他现在只能启动一个 App,可以修改一下.
github.com/GFuZan/HotStart
arrow8899
2019-07-23 09:51:16 +08:00
所以服务都启在本地吗,那如果有 40 个 50 个服务呢,还是搭建一套测试环境吧
siteshen
2019-07-23 10:42:24 +08:00
@arrow8899 是的,都在本地启动。如果解决了这个问题,同时还能应用到自动化测试上面,不需要各种 mock 微服务。
arrow8899
2019-07-23 11:04:26 +08:00
@siteshen 微服务本来就是拆分和解耦的,感觉你是用微服务在做 SOA。😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/585134

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX