restTemplate踩过的坑-spring clound

2023-11-14

现在公司项目基本都从臃肿的项目转换成微服务的方向转换,因此也从中使用了spring clound的一些组件,在此过程中就遇到了restTemplate的坑。

起初,是直接注入RestTemplate,后来则不断的遇到错误日志无法请求,出现异常。

异常信息:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: No instances available for IP

意思是说url必须是服务的名称,猜测应该是涉及到eureka,直接用ip跟url调用是直接报错的。

因此不适用默认的,直接重新自定义,则引用了原有的注入修改一下。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

/**

 *

 * 功能描述:

 *

 * @作者 jimw 创建时间:2018-04

 *

 */

@Configuration

public class RestTemplateConfig {

 

    public RestTemplate restTemplate() {

        return new RestTemplate(getClientHttpRequestFactory());

    }

 

    /**

     * 配置HttpClient超时时间

     *

     * @return

     */

    private ClientHttpRequestFactory getClientHttpRequestFactory() {

        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(HTTP_SOCKET_TIMEOUT)

                .setConnectTimeout(HTTP_CONNECT_TIMEOUT).build();

        CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();

        return new HttpComponentsClientHttpRequestFactory(client);

    }

 

    /** http请求socket连接超时时间,毫秒为单位 */

    public static final int HTTP_SOCKET_TIMEOUT = 15000;

 

    /** http请求连接超时时间,毫秒为单位 */

    public static final int HTTP_CONNECT_TIMEOUT = 15000;

}

  

当配置了这个之后,服务正常了。观察了一段时间,发现在并发的高峰期,开多几个服务器负载,也会存在服务出现请求非常慢,导致接口出现阻塞的情况出现,经过分析

1、出现阻塞的原因是因为高峰并发的时候,出现请求的链接数很大

因此找了源码,发现是因为restTemplate的默认配置值小于请求的链接数,而且路由并发也是默认为5的,因为微服务之间的逻辑处理中也有一定的时间。出现大规模阻塞的坑就这么踩到了。 

 

对代码改造一下,配置最大链接数,路由并发数,这个restTemplate的坑就这么解决了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

package com.jingbei.guess.config.web;

 

import java.security.KeyManagementException;

import java.security.KeyStoreException;

import java.security.NoSuchAlgorithmException;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

 

import javax.net.ssl.HostnameVerifier;

import javax.net.ssl.SSLContext;

 

import org.apache.http.client.HttpClient;

import org.apache.http.config.Registry;

import org.apache.http.config.RegistryBuilder;

import org.apache.http.conn.socket.ConnectionSocketFactory;

import org.apache.http.conn.socket.PlainConnectionSocketFactory;

import org.apache.http.conn.ssl.NoopHostnameVerifier;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.conn.ssl.SSLContextBuilder;

import org.apache.http.conn.ssl.TrustStrategy;

import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;

import org.apache.http.impl.client.HttpClientBuilder;

import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;

import org.springframework.web.client.DefaultResponseErrorHandler;

import org.springframework.web.client.RestTemplate;

 

import lombok.extern.slf4j.Slf4j;

 

/**

 *

 * 功能描述:

 *

 * @作者 jimw 创建时间: 2018-04

 *

 */

@Slf4j

@Configuration

public class RestTemplateConfig {

    @Bean

    public RestTemplate restTemplate() {

        RestTemplate restTemplate = new RestTemplate();

        restTemplate.setRequestFactory(clientHttpRequestFactory());

        restTemplate.setErrorHandler(new DefaultResponseErrorHandler());

        return restTemplate;

    }

 

    @Bean

    public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {

        try {

            HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();

            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(nullnew TrustStrategy() {

                public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {

                    return true;

                }

            }).build();

            httpClientBuilder.setSSLContext(sslContext);

            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;

            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,

                    hostnameVerifier);

            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()

                    .register("http", PlainConnectionSocketFactory.getSocketFactory())

                    .register("https", sslConnectionSocketFactory).build();// 注册http和https请求

            // 开始设置连接池

            PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(

                    socketFactoryRegistry);

            poolingHttpClientConnectionManager.setMaxTotal(2700); // 最大连接数2700

            poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100); // 同路由并发数100

            httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);

            httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3true)); // 重试次数

            HttpClient httpClient = httpClientBuilder.build();

            HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(

                    httpClient); // httpClient连接配置

            clientHttpRequestFactory.setConnectTimeout(20000); // 连接超时

            clientHttpRequestFactory.setReadTimeout(30000); // 数据读取超时时间

            clientHttpRequestFactory.setConnectionRequestTimeout(20000); // 连接不够用的等待时间

            return clientHttpRequestFactory;

        catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {

            log.error("初始化HTTP连接池出错", e);

        }

        return null;

    }

 

}

  在对应的插件中配置即可

依赖包:

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpclient</artifactId>

<version>4.5.3</version>

</dependency>

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpcore</artifactId>

<version>4.4.9</version>

</dependency>

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

restTemplate踩过的坑-spring clound 的相关文章

随机推荐

  • AQS同步组件-CountDownLatch解析和案例

    CountDownLatch原理 CountDownLatch是通过一个计数器来实现的 计数器的初始化值为线程的数量 每当一个线程完成了自己的任务后 计数器的值就相应得减1 当计数器到达0时 表示所有的线程都已完成任务 然后在闭锁上等待的线
  • Linux——线程同步(互斥锁、信号量、读写锁、自旋锁、条件变量)

    前言 当多个控制线程共享相同的内存时 需要确保每个线程看到一致的数据视图 若每个线程使用的变量都是其他线程不会读取或修改的 那么就不存在一致性概念 同样地 若变量是只读的 多个线程同时读取该变量也不会有一致性问题 但是当某个线程可以修改变量
  • Myeclipse平台struts+hibernate+spring项目开发示例

    如果您按照上篇文章配置成功 可以进行开发简单的J2EE项目 开发前准备 1 新建项目包 如下图 Dao 数据层 service 逻辑层 web web展现层 2 建立好三层架构 部署好包名 建立一个jsp文件 取名为 login jsp 代
  • Go设置国内源

    Go设置国内源 如果你需要Beego这个框架 正常来说你需要安装Git之后go get不会报错 但由于网络问题 go get会非常慢 以至于没法使用 这个时候我们需要需要国内源来进行加速 首先需要我们开启Go的MODULL支持 SETX G
  • 从零开始的ESP8266探索(16)-扫描网络演示

    文章目录 目的 使用演示 同步扫描 异步扫描 总结 目的 ESP8266可以通过扫描获取周围环境中的WiFi热点 所以我们也可以先扫描一下再决定连接到某个网络上 这也是一种常见的应用场景 使用演示 同步扫描 使用下面代码进行同步扫描 同步扫
  • 59. 螺旋打印情况

    i 代表一圈 j 从用来上下左右移动 主要是控制 i 与j 的参数关系就ok了 另一个是注意如何初始化 从左上角到右上角 while j
  • CScrollView嵌入对话框中无法响应WM_MOUSE WHEEL 消息

    1 问题描述 当使用CScrollView来显示图像时 往往需要将它嵌入到对话框中 当嵌入对话框之后 显示图像 使用放大镜查看图像时 发现使用WM MOUSE WHEEL消息来放大和缩小放大镜 结果消息未响应 2 分析原因 跟着调试发现 C
  • 基于LLaMA-2进行微调的FreeWilly2开源语言模型

    FreeWilly2是由Stability AI基于Llama2 70B所微调后发布的大语言模型 该模型的部分推理能力甚至已经超越了openAI的GPT 3 5 截止至发稿前 该模型在HuggingFace的开源语言模型排行榜中位列榜首 大
  • FPGA的虚拟时钟如何使用?

    以下文章来源于傅里叶的猫 作者张大侠 但文中对虚拟时钟的应用介绍的还不够详细 因此这里我们再对虚拟时钟做一个更加细致的介绍 首先 虚拟时钟用于什么地方 虚拟时钟通常用于设定输入和输出的延时 即set input delay和set outp
  • python 读取dll、exe文件版本终极方案

    网上找到的大都是调用win32api 但是这个api很多dll识别失败了 推荐使用wind32com 它兼容性比较强 1 使用win32api import os import win32api def getFileVersion fil
  • AlmaLinux构建LNMP

    环境 虚拟机 AlmaLinux9 1 hostname localhost ip 192 168 123 228 查看系统 cat etc redhat release 确保软件包管理器是最新的 yum clean all yum upd
  • 已解决AttributeError: ‘list‘ object has no attribute ‘text‘

    已解决AttributeError list object has no attribute text 文章目录 报错问题 报错翻译 报错原因 解决方法 千人全栈VIP答疑群联系博主帮忙解决报错 报错问题 粉丝群里面的一个小伙伴遇到问题跑来
  • 时间序列预测误差_时间序列-误差指标

    时间序列预测误差 时间序列 误差指标 Time Series Error Metrics It is important for us to quantify the performance of a model to use it as
  • 2023年电工杯B题问题二三思路讲解+创新点

    问题二三解题思路 1 根据你们对数据的分析结果选取评价指标 从优先级 科学性 可操作性等方面论述其合理性 并构建评价指标体系 2 建立数学模型 评价人工智能对大学生学习的影响 给出明确 有说服力的结论 这两问 可以看作一个问题 即针对人工智
  • anguar一个空间多个项目实战

    一 前言 有时候我们在一条产品线上 会有多套前端代码 运行在不同平台或者有多个业务端 这些代码可复用性非常高 以至于可以从某套代码直接copy出来用于开发另一个业务端 于是某个小组件需要改动时却要跑起多个项目来修改 angular cli很
  • js的日志输出console.log 你真的会使用吗

    在JavaScript中 可以使用console对象在控制台中输出信息 以下是一些常用的console方法 log 输出一般信息 console log Hello World error 输出错误信息 console error An e
  • This custom view should extend androidx.appcompat.widget.AppCompatTextView instead

    报错信息 第一种 This custom view should extend androidx appcompat widget AppCompatTextView instead 这是新版 第二种 This custom view sh
  • 弹性云服务器(Elastic Cloud Server,ECS)

    弹性云服务器 Elastic Cloud Server ECS https support huaweicloud com ecs index html 弹性云服务器 Elastic Cloud Server 是一种可随时自动获取 计算能力
  • Revit2014: 板Slab在创建时候提示错误:“边界边缘线彼此相交。边界等高线不可扭曲。”

    在Revit 2014里面 调用NewSlab方法抛出一个奇怪的错误 Boundary edge lines intersect each other Boundary contour must not be distorted 中文是这样
  • restTemplate踩过的坑-spring clound

    现在公司项目基本都从臃肿的项目转换成微服务的方向转换 因此也从中使用了spring clound的一些组件 在此过程中就遇到了restTemplate的坑 起初 是直接注入RestTemplate 后来则不断的遇到错误日志无法请求 出现异常