1.2 RestTemplateConfig 配置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
@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: 90001.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复用,及其耗资源:
@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 并且稳定,没有错误。



