http和dubbo接口调用主动设置超时时间

news2025/1/13 10:11:13

http接口超时方案

  • 方案1:多个resttemplate,不同超时时间的使用不同的template,优点:简单,扩展起来复制粘贴,缺点:代码冗余,多个template占用内存不够优雅

  • 方案2:单个resttemplate,调用过程中反射修改超时时间,优点:比较高端,缺点:可能有多线程问题,需要充分测试,反射影响一点点性能

  • 方案3:使用OkHttpClient包装一层resttemplate,再使用OkHttpClient提供的拦截器,每次调用的时候拦截根据url修改超时时间,优点:优雅;使用RestTemplateInterceptor包装后,可以动态修改每个接口的超时时间。缺点:需要引用自己的resttemplate,autowire的地方需要修改。

dubbo接口超时方案

  • 利用自带的dubbot的timeount属性设置超时时间:dubbo的超时时间可以设置在生产者和消费者,并且消费者可以覆盖生产者的配置,所以我们只需要关心消费者的配置

     

  • 方法 > 接口 > 全局

  • 同级别下消费 > 生产

  • 不仅针对超时timeout属性,所有可配置属性都具备该优先级规则

  • 有个小坑需要注意,在@Reference上设置的超时时间可能出现无效的情况,当存在多个@Reference配置时,程序启动的时候,会根据加载顺序进行加载并覆盖之前的配置,所以要想得到正确的配置,需要所有引用接口的地方的超时时间设置一样

http超时设置代码

1. 配置RestTemplate的bean

import com.f4.ts.org.manager.constants.NumberConstant;
import com.f4.ts.org.manager.interceptor.RestTemplateInterceptor;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import java.util.concurrent.TimeUnit;

/**
 * restful风格模板配置
 *
 * @author tengqy
 * @create 2022-07-04 8:33
 * @date 2022/07/05
 */
@Configuration
public class RestTemplateConfig {
    /**
     * restful风格模板拦截器
     */
    @Autowired
    private RestTemplateInterceptor restTemplateInterceptor;

    /**
     * 企业restful风格模板
     *
     * @return {@link RestTemplate}
     */
    @Bean
    public RestTemplate enterpriseRestTemplate() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(NumberConstant.NUM_INT_1000, TimeUnit.MILLISECONDS).readTimeout(NumberConstant.NUM_INT_1000, TimeUnit.MILLISECONDS)
                .writeTimeout(NumberConstant.NUM_INT_1000, TimeUnit.MILLISECONDS)
                .connectionPool(new ConnectionPool(NumberConstant.NUM_INT_50,
                        NumberConstant.NUM_INT_13, TimeUnit.MINUTES)).addInterceptor(restTemplateInterceptor);
        RestTemplate restTemplate = new RestTemplate(new OkHttp3ClientHttpRequestFactory(builder.build()));
        return restTemplate;
    }
}

2. 配置拦截器

import com.alibaba.fastjson.JSON;
import com.f4.ts.org.manager.config.TimeOutConfig;
import com.f4.ts.org.manager.constants.NumberConstant;
import com.f4.ts.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

/**
 * restful风格模板拦截器
 *
 * @author tengqy
 * @create 2022-07-04 8:35
 * @date 2022/07/05
 */
@Component
@Slf4j
public class RestTemplateInterceptor implements Interceptor {
    /**
     * 时间配置
     */
    @Autowired
    private TimeOutConfig timeOutConfig;


    /**
     * 超时地图
     */
    private static Map<String, List<Integer>> timeoutMap = new ConcurrentHashMap<>();

    /**
     * 最后一次
     */
    private long lastTime;


    /**
     * 全部url
     */
    private static final String DEFAULT_URL = "*";

    /**
     * 初始化
     */
    @PostConstruct
    public void init() {
        lastTime = System.currentTimeMillis();
        String timeoutCof = timeOutConfig.getTimeoutCof();
        log.info("初始化http超时时间配置 {}", timeoutCof);
        if (StringUtils.isNotBlank(timeoutCof)) {
            String[] split = timeoutCof.split(";");
            for (String s : split) {
                String[] strings = s.split(",");
                String connectionTimeout = "2000";
                String readTimeout = "2000";
                String writeTimeout = "2000";
                if (strings.length == NumberConstant.NUM_INT_4) {
                    connectionTimeout = strings[NumberConstant.NUM_INT_1];
                    readTimeout = strings[NumberConstant.NUM_INT_2];
                    writeTimeout = strings[NumberConstant.NUM_INT_3];
                }
                timeoutMap.put(strings[0], Arrays.asList(Integer.valueOf(connectionTimeout), Integer.valueOf(readTimeout),
                        Integer.valueOf(writeTimeout)));
            }
        }
        timeoutMap.put(DEFAULT_URL, Arrays.asList(NumberConstant.NUM_INT_2000, NumberConstant.NUM_INT_2000, NumberConstant.NUM_INT_2000));
        log.info("初始化http超时时间配置结束 {}", JSON.toJSONString(timeoutMap));
    }

    /**
     * 拦截
     *
     * @param chain 链
     * @return {@link Response}
     * @throws IOException ioexception
     */
    @Override
    public Response intercept(Chain chain) throws IOException {
        if (System.currentTimeMillis() - lastTime > (long) NumberConstant.NUMBER_600000) {
            init();
            lastTime = System.currentTimeMillis();
        }
        Request request = chain.request();
        String requestUrl = request.url().toString();
        for (Map.Entry<String, List<Integer>> entry : timeoutMap.entrySet()) {
            if (requestUrl.endsWith(entry.getKey())) {
                return chain.withConnectTimeout(entry.getValue().get(NumberConstant.NUM_INT_0), TimeUnit.MILLISECONDS)
                        .withReadTimeout(entry.getValue().get(NumberConstant.NUM_INT_1), TimeUnit.MILLISECONDS)
                        .withWriteTimeout(entry.getValue().get(NumberConstant.NUM_INT_2), TimeUnit.MILLISECONDS)
                        .proceed(request);
            }
        }
        List<Integer> defaultTime = timeoutMap.get(DEFAULT_URL);
        return chain.withConnectTimeout(defaultTime.get(NumberConstant.NUM_INT_0), TimeUnit.MILLISECONDS)
                .withReadTimeout(defaultTime.get(NumberConstant.NUM_INT_1), TimeUnit.MILLISECONDS)
                .withWriteTimeout(defaultTime.get(NumberConstant.NUM_INT_2), TimeUnit.MILLISECONDS)
                .proceed(request);
    }
}

 3. 动态配置接口的超时时间,可以配置到配置中心等地方

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 时间配置
 *
 * @author tengqy
 * @create 2022-07-05 9:18
 * @date 2022/07/05
 */
@Component
@Data
@ConfigurationProperties
public class TimeOutConfig {
    /**
     * 超时
     */
    @Value("${http.timeout.conf:*,2000,2000,2000}")
    private String timeoutCof;

    /**
     * 得到超时
     *
     * @return {@link String}
     */
    public String getTimeoutCof() {
        return timeoutCof;
    }

    /**
     * 设置超时
     *
     * @param timeoutCof 超时咖啡
     */
    public void setTimeoutCof(String timeoutCof) {
        this.timeoutCof = timeoutCof;
    }
}

 超时时间配置如下

http:
  timeout:
    conf: url1;url2,1000,2000,2000

其中,如果不配置超时时间,则默认超时时间都是2s/2s/2s,否则配置了超时时间则按照

接口,a,b,c; 配置,其中a、b、c分别为建立连接超时时间、读超时时间、写超时时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL事务和锁

目录 1、四大特性 2、事务引发的问题 3、事务控制演进 3.1、排队 3.2、排它锁 3.3、读写锁 3.4、MVCC 4、事务的隔离级别 4.1、四种隔离级别 4.2、事务隔离级别和锁的关系 4.3、MySQL隔离级别控制 5、锁机制和实战 5.1、锁分类 5.1.1、按操作粒度分类 5.1.2、按…

CDMP选修课都有什么?

大家都知道CDMP认证考试有四个级别。分别是A级&#xff08;基础级&#xff09;P级&#xff08;实践级&#xff09;M级&#xff08;专业级&#xff09;F级&#xff08;大师级&#xff09;。级别越高&#xff0c;考试难度就越大&#xff0c;分数比例要求也更高&#xff0c;相对应…

在Linux命令行中查找空目录

在 Linux 系统中&#xff0c;出现空的目录这是很正常的事情&#xff0c;而且&#xff0c;也是有办法一次性把它们都找出来的。 但是&#xff0c;仅仅列出空目录并不是我们的目的&#xff0c;我们今天了解一下如何删除这些空的目录。 在Linux中查找空目录 查找空目录&#xf…

ThinkPHP5文档学习——配置

文章目录一、配置目录二、配置格式PHP数组定义其它格式的支持二级配置三、配置加载惯例配置应用配置拓展配置场景配置四、读取配置参数五、动态配置设置配置参数六、独立配置独立配置文件V5.0.1版本已经废除该写法自动读取扩展配置七、配置作用域八、环境变量配置一、配置目录 …

语文课内外杂志语文课内外杂志社语文课内外杂志社2022年第14期目录

幼儿教育《语文课内外》投稿&#xff1a;cn7kantougao163.com 家园协同视域下幼儿心理危机的预防与干预对策 曹锭1-3 幼小衔接阶段幼儿时间观念的培养对策 陈晶晶4-6 有效支持 助力幼儿在书海中徜徉 胡玲珊7-9 东西部幼儿园结对帮扶,助力乡村教育扶贫——以广州市人民政府机关幼…

虹科分享|终端安全防护|网络安全术语列表(二)

如果你的工作或者生活与网络安全有关&#xff0c;你就知道它使用了自己独特的、不断发展的语言。术语和缩略语受到网络安全专家的喜爱。因此&#xff0c;我们创建了一个全面的网络安全词汇表&#xff0c;解释了常用的网络安全术语、短语和技术。我们设计此列表是为了揭开安全专…

[附源码]Python计算机毕业设计Django贷款申请审核管理系统论文

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

你知道吗?小程序组件≠小程序插件

一直以为小程序组件和小程序插件是一回事&#xff0c;只是措辞不一样&#xff0c;导致造成乌龙&#xff0c;其实完全是两回事&#xff0c;插件是可以直接提供服务的&#xff0c;组件是给开发者提供的轮子&#xff0c;不能直接提供服务。 先看看微信是如何定义小程序插件的&…

什么是深度卷积可分离Depthwise Separable conv

假设加载进来一张GRB三通道的图片 我现在就把三个通道拆开 注意哦 传统的就是 一个卷积核filter 和三个通道channel 进行卷积 现在这个深度卷积可分离 就要用三个不同的卷积核来对每一个通道进行卷积 小细节 &#xff1a;如果是传统意义上的卷积&#xff0c;但用一个的话&a…

【SQL Server + MySQL一】数据库基本知识、关系数据模型、关系数据语言--关系代数

极其感动&#xff01;&#xff01;&#xff01;当时学数据库的时候&#xff0c;没白学&#xff01;&#xff01; 时隔很长时间回去看数据库的笔记都能看懂&#xff0c;每次都靠这份笔记巩固真的是语雀分享要花钱&#xff0c;要不一定把笔记给贴出来(;༎ຶД༎ຶ) &#xff0c;除…

详解设计模式:装饰器模式

装饰器模式&#xff08;Decorator Pattern&#xff09;也称为包装模式&#xff08;Wrapper Pattern&#xff09;&#xff0c;是 GoF 的 23 种设计模式中的一种结构型设计模式。装饰器模式 是指在不改变原有对象的基础之上&#xff0c;将功能附加到对象上&#xff0c;提供了比继…

3.7.2、IP地址(网际层)

我们日常的大多数网络应用中&#xff0c;属于数据链路层的 MAC 地址&#xff0c;和属于网络层的 IP 地址都在使用&#xff0c;它们之间存在一定的关系。这里主要介绍 IP 地址的作用 1、基本介绍 IP 地址是因特网(Internet)上的主机和路由器所使用的地址&#xff0c;用于标识两…

osgEarth示例分析——osgearth_graticule

前言 本示例最具有借鉴的功能&#xff1a;绘制网格、网格上的文字显示、拾取地球的坐标。在地球网格示例中&#xff0c;可以设置4种网格。执行命令如下&#xff1a; // --geodetic osgearth_graticuled.exe --geodetic earth_image\china-simple.earth // --utm osgearth_gr…

[附源码]Python计算机毕业设计Django大学生心理测评系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

磁盘划分和磁盘格式化

文章目录列出装置的 UUID 等参数parted 列出磁盘的分区表类型与分区信息磁盘分区&#xff1a;gdisk、fdisk用 gdisk 新增分区槽用 gdisk 删除一个分区槽磁盘格式化&#xff08;建立文件系统&#xff09;XFS 文件系统 mkfs.xfsXFS 文件系统 for RAID 效能优化&#xff08;Option…

【Linux】环境变量

文章目录一.什么是环境变量二.常见的环境变量1.常见的环境变量和与之相关的命令2.PATH指定命令搜索路径3.env显示所有环境变量4.echo查看环境变量三.本地变量与环境变量的联系四.获取环境变量的三种方式1.getenv()函数获取环境变量2.利用命令行参数3.利用第三方变量一.什么是环…

如何校准Linux服务器时间

最近服务器上的时间与北京时间出现偏差&#xff0c;而Java代码里java.util.Date获取的是服务器时间&#xff0c;导致当前时间错误。 Linux查看服务器当前时间 查看当前时区&#xff1a;date -R 查看当前日期和时间&#xff1a;date 校准Linux服务器时间 Linux中有个ntp包可…

【Unity】URP渲染管线下代码获取相机的Volume Mask属性

步骤1. 引用URP的命名空间2. 获取摄像机3.通过URP扩展获取Volume Mask属性附 层级的相关代码Reference1. 引用URP的命名空间 using UnityEngine.Rendering.Universal;2. 获取摄像机 这里可以使用公有拖拽或者私有赋值的方式。 如果使用拖拽&#xff0c;则&#xff1a; publi…

神经网络和深度学习-多分类问题Softmax Classifier

多分类问题Softmax Classifier 在之前做糖尿病数据集的时候做的二分类问题&#xff0c;因为只有两类&#xff0c;所以只需要输出一个概率值&#xff0c;另一个概率值用1去减去就可以得到 实际上在大多数数据集中是在处理一个多分类问题&#xff0c;例如MNIST中有10类标签 神经…

Hifiasm-meta | 你没看错!基于宏基因组的完成图!!

哈佛大学医学院Dana-Farber癌症研究所李恒课题组重磅推出三代HiFi宏基因组组装软件——hifiasm-meta。研究论文“Metagenome assembly of high-fidelity long reads with hifiasm-meta”预印本在线发布。 宏基因组样本的do novo组装是研究微生物群落的常用方法。与单个物种的组…