栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring RestTemplate 集成 ClientHttpRequestFactory 提升QPS

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring RestTemplate 集成 ClientHttpRequestFactory 提升QPS

1 工程概述

1.1 pom
 
        org.springframework.boot
        spring-boot-starter-parent
        2.5.5
         
    

    

        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            org.projectlombok
            lombok
        
        
            com.alibaba
            fastjson
            1.2.71
        
        
            org.apache.commons
            commons-collections4
            4.2
        
        
            org.apache.commons
            commons-lang3
        
        
            org.springframework.boot
            spring-boot-starter-logging
        

        
            org.apache.httpcomponents
            httpclient
        
        
            org.apache.httpcomponents
            httpcore
        

    
1.2 RestTemplateConfig 配置
@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

1.3 TestController
@RestController
@RequestMapping("/demo")
public class TestController {

    @Autowired
    private RestTemplate restTemplate;


    @GetMapping("/test")
    public String test() {
        ResponseEntity forEntity = restTemplate.getForEntity("http://127.0.0.1:9000/demo/hello_world", String.class);
        return String.valueOf(forEntity.getStatusCodevalue());
    }


    @GetMapping("/hello_world")
    public String helloWorld()  {
        return "hello world";
    }

}
1.4 application.yml
server:
  port: 9000
  
1.5 主启动类
@SpringBootApplication
public class SpringDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringDemoApplication.class);
    }

}
1.6 测试

2 测试qps

jemeter: 60线程 5000次请求 10秒完成

结果: 700左右qps(并且持续下降),错误率还很高。

原因分析:

每次请求都会创建一个ClientHttpRequest,未能达到request复用,及其耗资源:

3 集成 ClientHttpRequestFactory
@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory) {
        return new RestTemplate(requestFactory);
    }


    @Bean
    public ClientHttpRequestFactory httpRequestFactory() {
        return new HttpComponentsClientHttpRequestFactory(httpClient());
    }

    @Bean
    public HttpClient httpClient() {

        Registry registry = RegistryBuilder.create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
        //设置连接池最大是100个连接
        connectionManager.setMaxTotal(1000);
        connectionManager.setDefaultMaxPerRoute(500);
        RequestConfig requestConfig = RequestConfig.custom()
                //返回数据的超时时间
                .setSocketTimeout(20000)
                //连接上服务器的超时时间
                .setConnectTimeout(10000)
                //从连接池中获取连接的超时时间
                .setConnectionRequestTimeout(1000).build();

        return HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).setConnectionManager(connectionManager).build();
    }
}

结果: 1100 qps 并且稳定,没有错误。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677470.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号