首页 > 其他分享 >接口超时,接口参数的特殊符号,接口的有序性,重试机制的结果一致性

接口超时,接口参数的特殊符号,接口的有序性,重试机制的结果一致性

时间:2023-12-20 23:12:12浏览次数:31  
标签:请求 restTemplate RestTemplate 接口 重试 springframework 特殊符号

接口超时,接口参数的特殊符号,接口的有序性,重试机制的结果一致性

1.http超时时间,将restTemplate的连接,超时时间设置更加长的时间。
2.http mvc GET请求,?a=1&b=2&c=#3,测试发现含#符号会在服务接口接收参数异常。需要将#特殊符合过滤,比如:可以替换为中文”井“
3.请求的有序性保持
3.1服务端方法:比如接收到无序的MQ消息或者binlog,比如对库存的控制,删除之前先验证订单状态。只有取消订单状态才会删除库存。
删除库存记录之前,先验证一下订单状态(非取消的情况下)库存是需要占据的,不应删除。
正常的顺序是:先删后增。如果反过来:先增后删,就会出现增加的时候无法新增,因为已经存在了。而最终的结果是删除了。
1. A >> B
2. 删除,没有记录了,导致库存没有记录,引起超卖。


3.2客户端方法:客户端请求失败 + 重试机制,如何保障2次请求的结果正确,而不被覆盖。
从大的方面来看:其实是涉及到两个系统的事务一致性问题,A系统的结果 = B系统的结果。
比如:请求a 参数100 失败
请求b 参数200 成功 >> B系统结果200
重试请求a 参数100 成功 >> B系统结果100

以上操作就会出现最终的结果不一致:期望是A系统结果200,B系统的结果是100

解决方法:在重试请求的操作中,需要获取最新的参数值来发起请求,而不是基于上一次请求失败的参数来发起。关键


3.3 客户端方法2: 异步方法@Async + 延时重试 + while循环(在一段时间内的循环,确保接口的顺序执行,比如:先取消后新增,没有取消成功之后,不能新增操作)

@Transactional事务注解及请求接口的定义先后执行顺序设计

//超时时间设置代码
    @Autowired
    RestTemplateConfig restTemplateConfig;

HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.set("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE);   //application/x-www-form-urlencoded
            httpHeaders.set("user-agent", "自定义");
            HttpEntity httpEntity = new HttpEntity(httpHeaders);
String responseStr = restTemplateConfig.restTemplate().postForObject(url+"?"+object, httpEntity, String.class);



import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

/***
 * 内部服务调用者
 */
@Configuration
public class RestTemplateConfig {

    /**
     * 适用于服务使用RestTemplate调用外部地址请求
     * @return
     */
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
        return restTemplate ;
    }

    /***
     * 适用于服务内部之间使用RestTemplate相互调用增加Rinbbo机制
     * 通过服务名方式
     * @return
     */
    @Bean(name="loadBalancedRestTemplate")
    @LoadBalanced
    public RestTemplate loadBalancedRestTemplate() {
        RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
        return restTemplate ;
    }

    private ClientHttpRequestFactory clientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setReadTimeout(30000);
        factory.setConnectTimeout(30000);
        factory.setConnectionRequestTimeout(30000);
        return factory;
    }

}

 

标签:请求,restTemplate,RestTemplate,接口,重试,springframework,特殊符号
From: https://www.cnblogs.com/oktokeep/p/17917842.html

相关文章

  • Externalizable接口实现序列化与反序列化
    Externalizable接口实现序列化与反序列化packagecom.example.core.mydemo.java;importcom.example.core.mydemo.json2.GsonUtils;importjava.io.*;/***Externalizable接口实现序列化与反序列化**Serialization(序列化):将java对象以一连串的字节保存在磁盘文件......
  • spring gateway 超时重试和默认拦截器配置
    spring:cloud:gateway:default-filters:-name:Retryargs:retries:3RetryConfig中默认的异常处理为IOException.class,TimeoutException.classpublicstaticclassRetryConfigimplementsHasRouteId{ privateStrin......
  • 从零开始用 Axios 请求后端接口
    对于前端同学来说,请求后端接口是一个非常通用的东西。在十几年前的时候,我们还用Ajax去请求后端接口。但在2023年的今天,很多框架都很成熟了,我们有了更加快捷的方式——Axios框架。请求框架哪家强?对于使用Vue技术栈的同学来说,其实接口请求框架就三种:vue-resource、Axios......
  • EasyCVR平台如何通过api接口设置实时流的sei数据实现画框等操作?
    为了便于用户自由调用、集成与二次开发,EasyCVR平台也提供了丰富的API接口供大家使用。今天我们来分享一下如何通过API接口设置实时流的SEI数据,实现在视频播放器中展示文本内容、画框等操作?1)后端接口调用如下:接口URL:POSThttp://127.0.0.1:18000/api/v1/sei/set2)接口参数如下:3)调用成......
  • Apipost:一键生成接口文档
    你是否经常遇到接口开发过程中的各种问题?或许你曾为接口测试与调试的繁琐流程而烦恼。不要担心!今天我将向大家介绍一款功能强大、易于上手的接口测试工具——Apipost,并带你深入了解如何玩转它,轻松实现接口测试与调试。什么是Apipost?Apipost是一款API全生命周期管理平台,它提供了一系......
  • Apipost:一键生成接口文档
    你是否经常遇到接口开发过程中的各种问题?或许你曾为接口测试与调试的繁琐流程而烦恼。不要担心!今天我将向大家介绍一款功能强大、易于上手的接口测试工具——Apipost,并带你深入了解如何玩转它,轻松实现接口测试与调试。什么是Apipost?Apipost是一款API全生命周期管理平台,它提供了......
  • 安防监控EasyCVR平台如何通过api接口设置实时流的sei数据实现画框等操作?
    国标GB28181视频监控系统EasyCVR平台采用了开放式的网络结构,支持高清视频的接入和传输、分发,能提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,此外,高清可视化视频监控平台EasyCVR还具......
  • 接口自动化之excel读写封装
    本次封装基于openpyxl进行的二次封装安装openpyxlpipinstallopenpyxl封装ExcelReader采用yield的方式返回数据,减少内存的占用classExcelReader:def__init__(self,filename):self._excel:Workbook=load_workbook(filename,read_only=True)d......
  • 接口自动化之响应数据封装
    在使用requests实现接口自动化时,接口响应的数据没有代码提示,要获取某个接口字段就需要通过[xxx]的方式来获取,实际开发过程中希望能通过.的方式来获取到某个接口响应属性。方式一、使用dataclassdataclass是python3.7新推出的特性之一fromdataclassesimportdataclass@......
  • API 接口设计最佳实践
    前言 最近团队内部在做故障复盘的时候发现有很多故障都是因为接口设计不当导致的,这里我就整理归纳一下在接口设计层面需要注意的地方。API接口设计Token设计 Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此To......