什么?你设计接口什么都不考虑?

这篇具有很好参考价值的文章主要介绍了什么?你设计接口什么都不考虑?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么?你设计接口什么都不考虑?,测试工程师,软件测试,自动化测试,selenium,jmeter,postman,测试工具,自动化测试,接口测试

如果让你设计一个接口,你会考虑哪些问题?

什么?你设计接口什么都不考虑?,测试工程师,软件测试,自动化测试,selenium,jmeter,postman,测试工具,自动化测试,接口测试

1.接口参数校验

接口的入参和返回值都需要进行校验。

  • 入参是否不能为空,入参的长度限制是多少,入参的格式限制,如邮箱格式限制

  • 返回值是否为空,如果为空的时候是否返回默认值,这个默认值需要和前端协商

2.接口扩展性

举个例子,比如用户在进行某些操作之后,后端需要进行消息推送,那么是直接针对这个业务流程来开发一个专门为这个业务流程服务的消息推送功能呢?还是说将消息推送整合为一个通用的接口,其他流程都可以进行调用,并非针对特定业务。

这个场景可能光靠说不是很能理解,大家想想策略工厂设计模式,是不是可以根据不同的策略,来选择不同的实现方式呢?再结合上面的这个例子,是否对扩展性有了进一步的理解呢?

3.接口幂等设计

什么是幂等呢?幂等是指多次调用接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。

举个例子,在购物商场里面你用手机下单,要买某个商品,你需要去支付,然后你点击了支付,但是因为网速问题,始终没有跳转到支付界面,于是你又连点了几次支付,那在没有做接口幂等的时候,是不是你点击了多少次支付,我们就需要执行多少次支付操作?

所以接口幂等到的是什么?防止用户多次调用同一个接口

  • 对于查询和删除类型的接口,不论调用多少次,都是不会产生错误的业务逻辑和数据的,因此无需幂等处理

  • 对于新增和修改,例如转账等操作,重复提交就会导致多次转账,这是很严重的,影响业务的接口需要做接口幂等的处理,跟前端约定好一个固定的token接口,先通过用户的id获取全局的token,写入到Redis缓存,请求时带上Token,后端做处理

什么?你设计接口什么都不考虑?,测试工程师,软件测试,自动化测试,selenium,jmeter,postman,测试工具,自动化测试,接口测试

4.关键接口日志打印

关键的业务代码,是需要打印日志进行监测的,在入参和返回值或者如catch代码块中的位置进行日志打印

  • 方便排查和定位线上问题,划清责任

  • 生产环境是没有办法进行debug的,必须依靠日志查问题,看看到底是出现了什么异常情况

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

什么?你设计接口什么都不考虑?,测试工程师,软件测试,自动化测试,selenium,jmeter,postman,测试工具,自动化测试,接口测试

5.核心接口要进行线程池隔离

分类查询啊,首页数据等接口,都有可能使用到线程池,某些普通接口也可能会使用到线程池,如果不做线程池隔离,万一普通接口出现bug把线程池打满了,会导致你的主业务受到影响

什么?你设计接口什么都不考虑?,测试工程师,软件测试,自动化测试,selenium,jmeter,postman,测试工具,自动化测试,接口测试

file

6.第三方接口异常重试

如果有场景出现调用第三方接口,或者分布式远程服务的话,需要考虑的问题

  • 异常处理

    比如你在调用别人提供的接口的时候,如果出现异常了,是要进行重试还是直接就是当做失败

  • 请求超时

    有时候如果对方请求迟迟无响应,难道就一直等着吗?肯定不是这样的,需要设法预估对方接口响应时间,设置一个超时断开的机制,以保护接口,提高接口的可用性,举个例子,你去调用别人对外提供的一个接口,然后你去发http请求,始终响应不回来,此时你又没设置超时机制,最后响应方进程假死,请求一直占着线程不释放,拖垮线程池。

  • 重试机制

    如果调用对外的接口失败了或者超时了,是否需要重新尝试调用呢?还是失败了就直接返回失败的数据?

7.接口是否需要采用异步处理

举个例子,比如你实现一个用户注册的接口。用户注册成功时,发个邮件或者短信去通知用户。这个邮件或者发短信,就更适合异步处理。总不能一个通知类的失败,导致注册失败吧。那我们如何进行异步操作呢?可以使用消息队列,就是用户注册成功后,生产者产生一个注册成功的消息,消费者拉到注册成功的消息,就发送通知。

什么?你设计接口什么都不考虑?,测试工程师,软件测试,自动化测试,selenium,jmeter,postman,测试工具,自动化测试,接口测试

file

8.接口查询优化,串行优化为并行

假设我们要开发一个网站的首页,我们设计了一个首页数据查询的接口,这个接口需要查用户信息,需要查头部信息,需要查新闻信息

等等之类的,最简单的就是一个一个接口串行调用,那要是想要提高性能,那就采取并行调用的方式,同时查询,而不是阻塞

可以使用CompletableFuture(推荐)或者FutureTask(不推荐)

        Map<Long, List<SubjectLabelBO>> map = new HashMap<>();
        List<CompletableFuture<Map<Long, List<SubjectLabelBO>>>> completableFutureList = 
        categoryBOList.stream().map(category ->
                CompletableFuture.supplyAsync(() -> getLabelBOList(category), labelThreadPool)
        ).collect(Collectors.toList());

        completableFutureList.forEach(future -> {
            try {
                Map<Long, List<SubjectLabelBO>> resultMap = future.get(); //这里会阻塞
                map.putAll(resultMap);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        public Map<Long, List<SubjectLabelBO>> getLabelBOList(SubjectCategoryBO category) {...}

9.高频接口注意限流

自定义注解 + AOP

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimiter {
    int value() default 1;
    int durationInSeconds() default 1;
}

@Aspect
@Component
public class RateLimiterAspect {

    private final ConcurrentHashMap<String, RateLimiter> rateLimiters = new ConcurrentHashMap<>();

    @Pointcut("@annotation(RateLimiter)")
    public void rateLimiterPointcut(RateLimiter rateLimiterAnnotation) {
    }

    @Around("rateLimiterPointcut(rateLimiterAnnotation)")
    public Object around(ProceedingJoinPoint joinPoint, RateLimiter rateLimiterAnnotation) throws Throwable {
        int permits = rateLimiterAnnotation.value();
        int durationInSeconds = rateLimiterAnnotation.durationInSeconds();

        // 使用方法签名作为 RateLimiter 的 key
        String key = joinPoint.getSignature().toLongString();
        com.google.common.util.concurrent.RateLimiter rateLimiter = rateLimiters.computeIfAbsent(key, k -> com.google.common.util.concurrent.RateLimiter.create((double) permits / durationInSeconds));

        // 尝试获取令牌,如果获取到则执行方法,否则抛出异常
        if (rateLimiter.tryAcquire()) {
            return joinPoint.proceed();
        } else {
            throw new RuntimeException("Rate limit exceeded.");
        }
    }
}

@RestController
public class ApiController {

    @GetMapping("/api/limited")
    @RateLimiter(value = 10, durationInSeconds = 60) //限制为每分钟 10 次请求
    public String limitedEndpoint() {
        return "This API has a rate limit of 10 requests per minute.";
    }

    @GetMapping("/api/unlimited")
    public String unlimitedEndpoint() {
        return "This API has no rate limit.";
    }
}

10.保障接口安全

配置黑白名单,用Bloom过滤器实现黑白名单的配置

具体代码不贴出来了,大家可以去看看布隆过滤器的具体使用

11.接口控制锁粒度

在高并发场景下,为了防止超卖等情况,我们会对共享资源进行加锁的操作来保证线程安全的问题,但是如果加锁的粒度过大,是会影响

到接口性能的。那什么是加锁粒度呢?举一个例子,你带了一封情书回家,但是不想被爸妈发现,然后你偷偷回到房间里放到一个可以锁

住的抽屉里面,而不用把房间的门锁给锁上。无论是使用synchronized加锁还是redis分布式锁,只需要在共享临界资源加锁即可,不涉

及共享资源的,就不必要加锁。

  • 锁粒度过大:

    把方法A和方法B全部进行加锁,但是实际上我只是想要对A加锁,这就是锁粒度过大

void test(){
    synchronized (this) {
       B();
       A();
    }
}
  • 缩小锁粒度

void test(){
       B();
    synchronized (this) {
       A();
    }
}

12.避免长事务问题

长事务期间可能伴随cpu、内存升高、严重时会导致服务端整体响应缓慢,导致在线应用无法使用

产生长事务的原因除了sql本身可能存在问题外,和应用层的事务控制逻辑也有很大的关系。

  • 如何尽可能的避免长事务问题呢?

  1. RPC远程调用不要放到事务里面

  2. 一些查询相关的操作如果可用,尽量放到事务外面

  3. 并发场景下,尽量避免使用@Transactional注解来操作事务,使用TransactionTemplate的编排式事务来灵活控制事务的范围

在原先使用@Transactional来管理事务的时候是这样的

@Transactional
public int createUser(User user){
    //保存用户信息
    userDao.save(user);
    passCertDao.updateFlag(user.getPassId());
    // 该方法为远程RPC接口
    sendEmailRpc(user.getEmail());
    return user.getUserId();
}

使用TransactionTemplat进行编排式事务

@Resource
private TransactionTemplate transactionTemplate;

public int createUser(User user){
    transactionTemplate.execute(transactionStatus -> {
      try {
         userDao.save(user);
         passCertDao.updateFlag(user.getPassId());
      } catch (Exception e) {
         // 异常手动设置回滚
         transactionStatus.setRollbackOnly();
      }
      return true;
    });
    // 该方法为远程RPC接口
    sendEmailRpc(user.getEmail());
    return user.getUserId();
}

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

什么?你设计接口什么都不考虑?,测试工程师,软件测试,自动化测试,selenium,jmeter,postman,测试工具,自动化测试,接口测试

最后: 可以在公众号:自动化测试老司机 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!文章来源地址https://www.toymoban.com/news/detail-850102.html

到了这里,关于什么?你设计接口什么都不考虑?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件测试工程师使用Jmeter工具做接口压力测试(Jmeter配置随机生成手机号)

    背景:性能测试的数据准备时很多情况需要产生一批新的数据,我们这次主要讲述的是如何产生随机的手机号,以用户注册接口为场景、生成随机手机号作为账号进行并发测试。 JMeter压力测试中设置线程组的线程数,即执行时的并发用户数,适用于单个线程组的并发测试。

    2023年04月19日
    浏览(80)
  • 薪资17K+需要什么水平?98年测试工程师面试实录…

    大概介绍一下个人情况,男,本科,三年多测试工作经验,懂python,会写脚本,会selenium,会性能,然而到今天都没有收到一份offer!从年后就开始准备简历,年后上班的第一天就开始投,开始只是投了一些官网已久的岗位,并没有收到面试邀请,得到的都是不匹配的反馈,一

    2024年02月09日
    浏览(59)
  • 数字IC设计工程师是做什么的?

    随着我国半导体产业的发展,近几年的新入行的从业人员,除了微电子相关专业的,还有就是物理、机械、数学、计算机等专业,很多人对这一高薪行业充满了好奇,那么数字IC设计工程师到底是做什么的? 1、熟悉数字电路设计 2、熟悉Verilog或VHDL 3、熟悉异步电路设计; 4、

    2024年02月07日
    浏览(50)
  • 数字IC设计工程师一般都干什么

    简单来说,数字IC设计工程师一般就是负责写verilog代码(当然,不是仅仅写个代码)。本文主要对数字IC设计的工作流程进行简单的介绍,也算是对我从业一年来的总结。 一般来说,数字IC设计的工作流程如下: 算法文档学习(搞清楚你负责的功能):先由算法的同事给出详

    2024年02月05日
    浏览(52)
  • postman-循环调用测试接口_postman循环调用接口,你会的还只有初级工程师的技术吗

    此篇文章产生的背景是想针对接口做流控验证,检查流控是否奏效,便发现postman也能一次操作来循环调用接口,减少了一些开发测试工作,下面就看一下操作流程 目录 postman简单介绍 前置查看 postman版本 我的接口数据 具体操作步骤 1. 新建接口集 2. 选择接口集进行循环操作

    2024年04月23日
    浏览(48)
  • 2023非常全的接口测试面试题及参考答案-软件测试工程师没有碰到算我输

    接口测试最近几年被炒的火热了,越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢? 主要是平常的功能点点点,大家水平都一样,是个人都能点,面试时候如果问你平常在公司怎么测试的,你除了说点点点,还能说什么呢,无非就是这个项目点完

    2023年04月17日
    浏览(56)
  • 软件测试工程师需要达到什么水平才能顺利拿到 20k 无压力?

    最近有粉丝朋友问:软件测试员需要达到什么水平才能顺利拿到 20k 无压力? 这里写一篇文章来详细说说: 作为软件测试人员,首先要具备扎实的测试基础知识。这包括测试方法、测试流程、测试用例设计、缺陷管理等方面的掌握。我们需要了解各种测试类型和级别,如单元

    2023年04月23日
    浏览(55)
  • 薪资18K需要什么水平?来看看98年测试工程师的面试全过程…

    大概介绍一下个人情况,男,本科,三年多测试工作经验,懂python,会写脚本,会selenium,会性能,然而到今天都没有收到一份offer!从年后就开始准备简历,年后上班的第一天就开始投,开始只是投了一些官网已久的岗位,并没有收到面试邀请,得到的都是不匹配的反馈,一

    2023年04月19日
    浏览(54)
  • 黑客和网络安全工程师有什么区别?如何成为一名网络安全工程师?

    经常有小伙伴把 黑客 和 网络安全工程师 弄混, 黑客 和 网络安全工程师 是两种不同的职业,尽管它们都与计算机安全有关。本篇文章将告诉你 黑客 和 网络安全工程师 的区别并且教你如何成为一名 网络安全工程师 。 黑客 通常是指那些 能够入侵计算机系统或网络的人 。

    2024年02月08日
    浏览(59)
  • 渗透测试工程师

    渗透测试工程师简介 渗透测试 (penetration test)并没有一个标准的定义,国外一些安全组织达成共识的通用说法是:渗透测试是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析,这个分析

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包