公司项目使用了微服务架构,会启动十多个的 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 的方式解决)。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.