我有一个简单的(这就是我认为的)Spring 启动应用程序。有4层:
休息控制器
应用服务(由 Rest Controller 调用)
域服务(由应用服务调用。它连接到数据库-存储库层)
Adapter Service(由应用服务通过 Hystrix 进行呼出调用)
现在的问题是它最多只能处理 15 个并行调用。如果在处理这些调用时有任何额外的 REST API 请求到达,它会将其发送到应用程序服务层,然后等待。一旦这 15 个并行调用中的一个返回,新请求就会继续调用域服务层并返回。
我尝试了多种方法:
在 application.properties 文件中增加服务器的空闲线程
server.tomcat.min-spare-threads=1000
server.tomcat.max-connections=1000
server.tomcat.max-threads=1000
执行此操作后,我看到 http-nio-* 线程数增加到 1000,但挂起问题并未解决。
我在网上找到了这个片段来自定义 tomcat 容器,但它也没有帮助:
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> containerCustomizer() {
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Arrays.stream(connector.getProtocolHandler().findUpgradeProtocols())
.filter(upgradeProtocol -> upgradeProtocol instanceof Http2Protocol)
.map(upgradeProtocol -> (Http2Protocol) upgradeProtocol)
.forEach(http2Protocol -> {
http2Protocol.setMaxConcurrentStreamExecution(1000);
});
}
});
}
};
}
我尝试通过代码配置线程池
@Bean(name = "taskExecutor")
public TaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(200);
executor.setMaxPoolSize(300);
executor.setQueueCapacity(300);
executor.setThreadNamePrefix("anniversary");
executor.initialize();
System.out.println("******* name " + executor.getThreadNamePrefix());
System.out.println("********** core pool size " + executor.getCorePoolSize());
return executor;
}
但这都没有帮助,我相信问题不在于线程数,而在于其他地方,因为请求无法从一项服务转到另一项服务。有数百个 http-nio-* 线程处于等待状态,当一个新请求进来时,它分配了自己的线程,我可以在调试模式下看到这一点。
任何指针、帮助、提示都非常感谢。Spring boot 服务到服务调用需要什么资源?
德玛西亚99
相关分类