Web 服务模板 Spring 启动时的性能问题



我正在使用WebServiceTemplate使用soap Web服务,它在spring3+中工作良好,性能良好。

spring :- 3.2.4.RELEASE
spring-ws-core :- 2.1.4.RELEASE
spring-ws-support :- 2.1.4.RELEASE
spring-ws-security :-2.1.4.RELEASE

用于调用肥皂服务的类

SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory(MessageFactory.newInstance());
messageFactory.afterPropertiesSet();
WebServiceTemplate webServiceTemplate = new WebServiceTemplate(messageFactory);
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("some package");
marshaller.afterPropertiesSet();
webServiceTemplate.setMarshaller(marshaller);
webServiceTemplate.setUnmarshaller(marshaller);
webServiceTemplate.afterPropertiesSet();
webServiceTemplate.setInterceptors(clientInterceptors);
webServiceTemplate.setMessageSender(webServiceMessageSenderWithAuth);
webServiceTemplate.setDefaultUri(url);
Output result= ((JAXBElement<Output >) webServiceTemplate.marshalSendAndReceive(jaxbRequest)).getValue();

配置文件

@Configuration
public class WebServiceConfiguration {
@Autowired
private SaajSoapMessageFactory messageFactory;
@Autowired
private WebServiceMessageSenderWithAuth webServiceMessageSenderWithAuth;
@Bean
public Wss4jSecurityInterceptor getWss4jSecurityInterceptor(@Value("${WSDL.UserName}") String userName,
@Value("${WSDL.Password}") String password) {
Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
wss4jSecurityInterceptor.setSecurementActions("UsernameToken");
wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText");
wss4jSecurityInterceptor.setSecurementUsername(userName);
wss4jSecurityInterceptor.setSecurementPassword(password);
return wss4jSecurityInterceptor;
}
@Bean
public SaajSoapMessageFactory getSaajSoapMessageFactory() {
return new SaajSoapMessageFactory();
}
@Bean
public ClientInterceptor[] clientInterceptors(Wss4jSecurityInterceptor wsSecurityInterceptor) {
return new ClientInterceptor[] { wsSecurityInterceptor };
}
}

性能结果时序 -- 平均时间约500ms,最大时间:-1 秒

Spring Boot 1.5.20.RELEASE 和 2.2.2.RELEASE

使用弹簧启动时,没有任何更改的相同代码对于第一次调用大约需要 4 秒,如果继续点击相同的代码,那么大约需要 2 秒

弹簧启动的性能结果

第一次通话 :-4 秒

无间隔的后续呼叫(1-10 秒间隔(:-2 秒800 毫秒

它不断减少,同时以更少的间隔一次又一次地点击相同的呼叫,并下降到弹簧 mvc 3 这样的结果,但如果在 5 分钟等间隔后再次尝试,然后再次遵循相同的模式 如果在 5 分钟后尝试相同的方法,则第一次和进一步调用的结果再次相同。

注意:- 使用弹簧启动,我也尝试了 wss4j 而不是wss4j2也尝试了AxiomSoapMessageFactory,但没有运气

  • 我已经尝试过连接保持活力等,但仍然没有运气
缓存

可能是上述结果的因素之一

缓存是一种增强系统性能的机制。它是位于应用程序和持久数据库之间的临时内存。缓存存储最近使用的数据项,以便尽可能减少数据库命中次数。

JVM预热效果

当启动基于 JVM 的应用程序时,它收到的第一个请求通常比平均响应时间慢得多。这种预热效应通常是由于启动时的类加载和字节码解释造成的。

要进一步优化应用程序,请使用Hypersistence 优化器,它允许您通过扫描应用程序配置和映射来充分利用 JPA 和 Spring 引导。

运行超站点优化器非常简单,因为您只需将EntityManagerFactory实例传递给HypersistenceOptimizer对象构造函数,然后调用 init 方法

我想你已经这样做了,但如果你还没有,看看更快的启动并实施那里建议的修复程序。

对于禁用嵌入式雄猫扫描,此处的评论中有一个建议 雄猫 JarScan

在 SpringBoot 应用程序中启用异步调用

@EnableSync
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}

所以问题不在于代码。我终于把它部署在jboss Wildfly上,然后砰。 它只是开始表现得非常好,没有一行更改。

现在大约需要300 毫秒500 毫秒。所以问题出在嵌入式雄猫和嵌入式码头不好

这也可以与MessageSenderbean 的参数有关maxConnectionsPerHost。默认值为2,对于惰性端点来说非常低。

您可以覆盖

@Bean
public HttpComponentsMessageSender messageSender() {
HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
messageSender.setConnectionTimeout(30000);
messageSender.setReadTimeout(30000);
messageSender.setMaxConnectionsPerHost("http://some-soap-url", "20");
return messageSender;
}

最新更新