返回顶部
首页 > 资讯 > 后端开发 > Python >java实用型-高并发下RestTemplate的正确使用说明
  • 454
分享到

java实用型-高并发下RestTemplate的正确使用说明

2024-04-02 19:04:59 454人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言一、RestTemplate是什么?二、如何使用1.创建一个bean2.使用步骤三、高并发下的RestTemplate使用1.设置预热功能2.合理设置maxtotal数量总结

前言

如果java项目里有调用第三方的Http接口,我们可以使用RestTemplate去远程访问。也支持配置连接超时和响应超时,还可以配置各种长连接策略,也可以支持长连接预热,在高并发下,合理的配置使用能够有效提高第三方接口响应时间。

一、RestTemplate是什么?

RestTemplate是spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

二、如何使用

1.创建一个bean

以下代码配置比较简单,只设置了连接超时时间和响应超时时间



@Configuration
public class RestTemplateConfiguration {
    @Bean(name = "restTemplate")
    public RestTemplate restTemplate() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        //设置连接超时时间1s
        factory.setConnectTimeout(1000);
        //设置读取时间1s
        factory.setReadTimeout(1000);
        return new RestTemplate(factory);
    }
}

2.使用步骤

在需要使用的地方使用@Resource或者@Autowired注入进来


@Resource
private RestTemplate restTemplate;

然后我们平常调用第三方的接口是get方式和post方式,restTemplate提供getForEntity和postForEntity方法支持这两种方式,直接调用即可,源码分别如下:

getForEntity方法:


 public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
        return (ResponseEntity)nonNull(this.execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables));
    }

postForEntity方法:


public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException {
        RequestCallback requestCallback = this.httpEntityCallback(request, responseType);
        ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
        return (ResponseEntity)nonNull(this.execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables));
    }

源码中还有很多以上两种其他的重载方法,以上是作者平常项目中用的最多的一种,参数有url(第三方http链接)、request是请求所需的参数,responseType是返回类型里的泛型。

只需要解析返回的参数即可。

三、高并发下的RestTemplate使用

在平常的开发中,以上简单的配置可能就够用了,但是在高并发下,对接口响应时间要求很高,所以我们需要尽量的提高第三方接口响应时间。在RestTemplate中可以使用httpClient长连接,关于httpClient长连接的介绍我们可以参考:HTTPclient保持长连接

以下代码我们设置了长连接预热的功能,以及路由并发数:


@Slf4j
@Configuration
public class RestTemplateConfiguration {
    @Bean(name = "restTemplate")
    public RestTemplate restTemplate() {
       return getRestTemplate(3, "https://www.baidu.com/......");
    }
    private RestTemplate getRestTemplate(int maxTotal, String preHeatUrl) {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = httpComponentsClientHttpRequestFactory(maxTotal);
        RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
        //解决首次预热耗时长
        if (StringUtils.isNotEmpty(preHeatUrl)) {
            try {
                restTemplate.postForEntity(preHeatUrl, "", String.class);
            } catch (Exception e) {
                log.error("preHeat url error:{}", e.getMessage());
            }
        }
        return restTemplate;
    }
    
    private HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory(int maxTotal) {
        //Httpclient连接池,长连接保持时间
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(1, TimeUnit.HOURS);
        //设置总连接数
        connectionManager.setMaxTotal(maxTotal);
        //设置同路由的并发数
        connectionManager.setDefaultMaxPerRoute(maxTotal);
        //设置header
        List<Header> headers = new ArrayList<Header>();
        headers.add(new BasicHeader("User-Agent", "Mozilla/5.0 (windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04"));
        headers.add(new BasicHeader("Accept-Encoding", "gzip, deflate"));
        headers.add(new BasicHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"));
        headers.add(new BasicHeader("Connection", "keep-alive"));
        //创建HttpClient
        HttpClient httpClient = HttpClientBuilder.create()
                .setConnectionManager(connectionManager)
                .setDefaultHeaders(headers)
                .setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)) //设置重试次数
                .seTKEepAliveStrategy(new DefaultConnectionKeepAliveStrategy()) //设置保持长连接
                .build();
        //创建HttpComponentsClientHttpRequestFactory实例
        HttpComponentsClientHttpRequestFactory requestFactory =
                new HttpComponentsClientHttpRequestFactory(httpClient);
        //设置客户端和服务端建立连接的超时时间
        requestFactory.setConnectTimeout(10000);
        //设置客户端从服务端读取数据的超时时间
        requestFactory.setReadTimeout(5000);
        //设置从连接池获取连接的超时时间,不宜过长
        requestFactory.setConnectionRequestTimeout(2000);
        //缓冲请求数据,默认为true。通过POST或者PUT大量发送数据时,建议将此更改为false,以免耗尽内存
        requestFactory.setBufferRequestBody(false);
        return requestFactory;
    }

1.设置预热功能

我们可以看到,在getRestTemplate方法中,


return restTemplate;

之前先请求了一次,也就是说在需要使用第三方接口调用的service层注入的时候,提前先调用了一次,根据长连接的特性,一般第一次连接的时间较长,使用完之后,这个连接并不会马上回收掉,在一定的时间还是存活状态,所以在高并发下,经过预热后的接口响应时间会大幅提高。

2.合理设置maxtotal数量

我们可以看到以下代码


//设置总连接数
 connectionManager.setMaxTotal(maxTotal);

我们可以看到这一行,maxTotal是设置总连接数,这个设置需要根据接口的响应时间以及需要支持的QPS来设置,比如接口响应时间是100ms,需要支持的QPS为5000,也就是5000/s,那么一个长连接1s就是能够处理10个请求,那么总共需要maxTotal为500个,这个就是设置的大概数量,但是有时候QPS不是那么稳定,所以具体设置多少得视具体情况而定。

RestTemplate深度解析可以参考:RestTemplate深度解析

总结

以上就是关于RestTemplate的使用介绍,其实平常使用下还好,看不出来什么问题,但是一旦高并发情况下,预热和设置总连接数还有并发数以及其他的相关配置就显得尤为重要,具体的配置还是得经过实验才能得知,没有最好,只有更好,以上就是作者在高并发活动中的一些实际经历,希望可以帮助到你!!!如有错误或未考虑完全的地方,望不吝赐教,也希望大家多多支持编程网!

--结束END--

本文标题: java实用型-高并发下RestTemplate的正确使用说明

本文链接: https://lsjlt.com/news/155254.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java实用型-高并发下RestTemplate的正确使用说明
    目录前言一、RestTemplate是什么?二、如何使用1.创建一个bean2.使用步骤三、高并发下的RestTemplate使用1.设置预热功能2.合理设置maxtotal数量总结...
    99+
    2024-04-02
  • vue里使用create,mounted调用方法的正确姿势说明
    目录使用create,mounted调用方法我之前有个错误的写法错误有2created方法和mounted的区别使用create,mounted调用方法 首先: 我之前有个错误的写法...
    99+
    2024-04-02
  • Java8 如何正确高效的使用并行流
    目录正确使用并行流,避免共享可变状态高效使用并行流流的数据源和可分解性java 并行计算的几点实践总结正确使用并行流,避免共享可变状态 错用并行流而产生错误的首要原因,就是使用的算法...
    99+
    2024-04-02
  • 如何在Go语言中使用正确的数据类型实现高效的并发和存储?
    Go语言是一种强大的编程语言,旨在为现代计算机体系结构提供高效的编程体验。在Go语言中,正确的数据类型选择可以实现高效的并发和存储操作。本文将介绍如何在Go语言中使用正确的数据类型实现高效的并发和存储。 一、并发 Go语言的并发模型是基于g...
    99+
    2023-08-20
    并发 存储 数据类型
  • Java8中怎么正确高效的使用并行流
    这篇文章主要为大家展示了“Java8中怎么正确高效的使用并行流”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java8中怎么正确高效的使用并行流”这篇文章吧。正确使用并行流,避免共享可变状态错用...
    99+
    2023-06-25
  • Java的StringBuilder在高性能场景下的正确用法
    目录StringBuilder在高性能场景下的正确用法1. 初始长度好重要,值得说四次。2. Liferay的StringBundler类3. 但,还是浪费了一倍的char[]4. ...
    99+
    2023-05-19
    java StringBuilder StringBuilder高性能用法
  • 使用Java中的并发库和框架实现高并发
    文章目录 使用Java中的并发库和框架实现高并发背景介绍技术原理及概念基本概念解释技术原理介绍 Java多线程Java线程池Java异步编程Java并发控制相关技术比较实现步骤与流程准备...
    99+
    2023-10-06
    java jvm 网络
  • 并发环境下使用哪种Java数据类型最为高效?
    在并发环境下,使用哪种Java数据类型最为高效?这是一个非常常见的问题。在这篇文章中,我们将探讨几种常见的Java数据类型,以及它们在并发环境下的性能表现。 synchronized关键字 synchronized关键字是Java中最基...
    99+
    2023-06-21
    容器 并发 数据类型
  • PHP中的数组、并发和缓存:如何正确使用?
    在PHP开发中,数组、并发和缓存是非常常见的概念。它们都可以用来提高程序的效率和性能,但是如果使用不当,也会给程序带来严重的问题。本文将探讨如何正确使用PHP中的数组、并发和缓存。 一、数组 数组是PHP中最常用的数据结构之一。它可以存储...
    99+
    2023-09-21
    数组 并发 缓存
  • 如何使用 Java 和 Bash 实现高效并发?
    随着计算机技术的不断发展,我们需要处理的数据量越来越大,对并发处理的需求也越来越迫切。Java 和 Bash 是常用的编程语言,在处理并发任务方面都有很好的支持。本文将介绍如何使用 Java 和 Bash 实现高效并发。 Java 实现并...
    99+
    2023-10-12
    bash 并发 日志
  • 关于ecs云服务器的使用以下选项哪些说法正确
    使用ecs云服务器是一个可靠的方式来存储数据,并且可以轻松访问和管理它们; ecs云服务器可以让您在不关闭服务器的情况下运行应用程序或网站,以便您可以在云上安全地使用数据; ecs云服务器提供了更好的扩展性,您可以随时添加和修改您的应用程...
    99+
    2023-10-26
    选项 说法 正确
  • java中并发Queue种类与各自API特点以及使用场景说明
    一 先说下队列 队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注意不要弄混队列的头部和尾部) 就是说,队列以一种先进先出的方式管理数据,如果...
    99+
    2024-04-02
  • 满足高并发多语言开发(C C+ PHP JAVA )下的淘宝平台API接口接入参数说明
        淘宝API接口是一个丰富的接口库,提供了各种各样的接口供开发者使用。满足多语言开发。以下是一些常见的淘宝API接口及其代码示例。 搜索商品API接口 该API提供了关键字搜索淘宝商品的功能,可以使用各种编程语言来访问。以下代码段展...
    99+
    2023-09-07
    c语言 php java
  • 如何在Java中正确使用关键字来处理并发编程算法?
    在Java编程中,处理并发编程算法是一个非常重要的话题。随着计算机技术的不断发展,多核处理器已经成为了计算机的标配,这就意味着我们需要更好地处理并发编程问题。本文将介绍如何在Java中正确使用关键字来处理并发编程算法,以及一些示例代码的演示...
    99+
    2023-10-22
    并发 关键字 编程算法
  • Java并发实例之CyclicBarrier的使用
    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆,如果有什么错误或者不当的地方,欢迎大家斧正。CyclicBarrier是一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线...
    99+
    2023-05-30
    java 并发 cyclicbarrier
  • 如何使用Java和NumPy实现高效的并发计算?
    随着互联网的不断发展,数据量的增长速度越来越快,如何高效地处理这些数据成为了一个重要的问题。并发计算是一种处理大量数据的有效方式,而Java和NumPy则是两个在并发计算领域中被广泛使用的工具。本文将介绍如何使用Java和NumPy实现高...
    99+
    2023-07-23
    numy 并发 npm
  • 如何在Linux环境下使用Java实现高并发?Django框架的应用也是关键
    在当今互联网时代,高并发已经成为了各种网站和应用程序必须面对的一个问题。如何在Linux环境下使用Java实现高并发,成为了每个程序员必须掌握的技能之一。在本文中,我们将介绍如何使用Java和Django框架来实现高并发。 一、Java环境...
    99+
    2023-09-29
    并发 linux django
  • java并发高的情况下用ThreadLocalRandom来生成随机数
    目录一:简述二:Random的性能差在哪里三:ThreadLocalRandom的简单使用四:为什么ThreadLocalRandom能在保证线程安全的情况下还能有不错的性能一:简述...
    99+
    2024-04-02
  • 如何在Java中使用容器实现高效的并发操作?
    Java作为一种流行的编程语言,其在并发编程方面的支持非常强大。其中,容器的使用是实现高效并发操作的关键之一。本文将介绍如何在Java中使用容器实现高效的并发操作。 一、什么是容器? 在Java中,容器是一种用于存储和管理对象的数据结构。它...
    99+
    2023-06-21
    容器 并发 数据类型
  • 面对 Python 并发编程的挑战:如何正确使用接口和缓存?
    随着互联网的发展,应用程序的并发访问量越来越大,Python 并发编程已成为越来越重要的领域。但同时,Python 并发编程也面临着很多挑战,例如如何处理并发请求、如何避免重复请求等。本文将介绍一些有效的解决方案,以帮助 Python 开...
    99+
    2023-06-30
    并发 接口 缓存
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作