RestTemplate的使用代码(客户端):
(spring 启动类 和 keepalive策略)
/** * SpringBoot启动类 */ @SpringBootApplication @Slf4j public class CustomerServiceApplication implements ApplicationRunner { @Autowired private RestTemplate restTemplate; public static void main(String[] args) { new SpringApplicationBuilder() .sources(CustomerServiceApplication.class) .bannerMode(Banner.Mode.OFF) .web(WebApplicationType.NONE) .run(args); } @Bean public HttpComponentsClientHttpRequestFactory requestFactory() { PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS); connectionManager.setMaxTotal(200); connectionManager.setDefaultMaxPerRoute(20); CloseableHttpClient httpClient = HttpClients.custom() .setConnectionManager(connectionManager) .evictIdleConnections(30, TimeUnit.SECONDS) .disableAutomaticRetries() // 有 Keep-Alive 认里面的值,没有的话永久有效 //.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE) // 换成自定义的 .setKeepAliveStrategy(new CustomConnectionKeepAliveStrategy()) .build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); return requestFactory; } @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { // return new RestTemplate(); return builder .setConnectTimeout(Duration.ofMillis(100)) .setReadTimeout(Duration.ofMillis(500)) .requestFactory(this::requestFactory) .build(); } @Override public void run(ApplicationArguments args) throws Exception { URI uri = UriComponentsBuilder .fromUriString("http://localhost:8080/coffee/?name={name}") .build("mocha"); RequestEntity<Void> req = RequestEntity.get(uri) // .accept(MediaType.APPLICATION_XML) .build(); ResponseEntity<String> resp = restTemplate.exchange(req, String.class); log.info("Response Status: {}, Response Headers: {}", resp.getStatusCode(), resp.getHeaders().toString()); log.info("Coffee: {}", resp.getBody()); } } /** * KeepAlive策略 */ public class CustomConnectionKeepAliveStrategy implements ConnectionKeepAliveStrategy { private final long DEFAULT_SECONDS = 30; @Override public long getKeepAliveDuration(HttpResponse response, HttpContext context) { return Arrays.asList(response.getHeaders(HTTP.CONN_KEEP_ALIVE)) .stream() .filter(h -> StringUtils.equalsIgnoreCase(h.getName(), "timeout") && StringUtils.isNumeric(h.getValue())) .findFirst() .map(h -> NumberUtils.toLong(h.getValue(), DEFAULT_SECONDS)) .orElse(DEFAULT_SECONDS) * 1000; } }
运行结果: