公司项目使用了微服务架构,会启动十多个的 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 的方式解决)。
1
BCy66drFCvk1Ou87 2019-07-22 17:30:03 +08:00 1
|
2
gfuzan 2019-07-22 18:00:28 +08:00 1
用类加载器是可行的.启动多个 Application 就是启动多个线程,这里有一个我做个热启动的程序,他现在只能启动一个 App,可以修改一下.
github.com/GFuZan/HotStart |
3
arrow8899 2019-07-23 09:51:16 +08:00
所以服务都启在本地吗,那如果有 40 个 50 个服务呢,还是搭建一套测试环境吧
|