当前位置: 首页 > news >正文

如何写出高质量的业务接口

  1. 清晰的需求
    1. 需求要有文档;方便后续追溯或交接等
    2. 需求是基础,必须详细;多和需求沟通确认,不可模糊、模棱两可,否则后续可能越错越远
  2. 抽象建模
    1. 分析需求;梳理清楚关联关系,建立数据模型和关联
    2. 画E-R图;思考、抽象表关系和表字段
    3. 评审;可以的话,请教业务透彻同事,评审数据表
  3. 数据库建表
    1. 尽量遵循数据库三范式
    2. 字段命名规范,避免使用数据库关键字
    3. 避免过度设计,比如一些多余的字段,增加了歧义和维护成本
    4. 合适的字段类型和字段长度
    5. 合适的冗余来减少表关联
    6. 评估哪些字段需要建立索引
      1. 一些非重字段,可建立唯一索引,
      2. 一些频繁用来查询或关联字段,可建立索引
      3. 索引不是越多越好,有维护成本
      4. 区分度不高的字段,不建议索引
    7. 尽量将字段设置为not null;
      1. 可以防止出现空指针问题
      2. null值可能会使运算变复杂
      3. 可通过设置默认值方式,保持not null
  4. 编写接口
    1. 明确需求,定义主体流程步骤
    2. 先满足接口功能需要
    3. 代码重构优化
      1. 修改已有接口,注意保持和原有兼容
      2. 可读性;合理注释、隔行
      3. 复用性;提取公共代码
      4. 提取函数;单一功能摘取为小函数,避免过长函数
      5. 扩展性;是否适用设计原则、设计模式等
      6. 入参检验;可避免大部分入参导致的错误
      7. 接口防重、限流、防刷;一些重要接口,尤其对外接口,需考虑幂等性、接口防刷等
      8. 异常和事务处理;对接口可能抛出的异常,以及事务是否回滚及生效,须考虑清楚
      9. 可追溯;记录日志,关键操作信息做持久化处理,方便后期追溯、排查
      10. 并发线程安全;在高并发场景下,类似“查询+修改”的场景,有可能出现数据不一致的清空;此时,通常需要加锁,并注意锁的粒度
      11. 调用第三方接口时,考虑异常、超时等情况处理策略
      12. 合理使用缓存;对于读多写少,且数据时效性要求低的场景,使用缓存可以提升查询效率,减轻数据库压力
      13. 合理使用批量操作;能批量操作时,就不要使用for循环调用;但对于海量数据,须拆分为小批量操作,分而治之
      14. 谨慎使用异步;遇到一些不影响核心流程准确性,但是较耗时的操作,可以考虑使用异步;
      15. 谨慎使用并行;在执行多个相互独立(没有先后顺序)的操作时,可以考虑使用并行,充分使用多核CPU优势
    4. SQL优化;对持久层的SQL进行优化,提升接口性能
  5. 测试接口
    1. 单元测试:测试每个方法的正确性
    2. 功能测试;业务核心流程是否通畅、正常提示、无系统异常
    3. 数据准确性测试:数据是否符合预期、数据边界、精度、计算结果是否准确
    4. 事务测试;抛出异常,是否需要或正常回滚,回滚粒度是全部回滚,还是部分回滚
    5. 并发测试;代码是否存在并发安全问题,在高并发下,是否幂等、防刷、降级、可用等
    6. 性能测试;在高并发或者海量数据时,接口能否正常响应,是否满足实时性要求
    7. 追溯测试;接口正常执行、异常报错后,是否有日志或监控可追溯或复现操作历史记录
  6. 输出接口文档
http://www.lryc.cn/news/34786.html

相关文章:

  • 3.8多线程
  • 图文讲解MongoDB该怎么安装
  • 「ML 实践篇」机器学习项目落地
  • c++面试技巧-基础篇3
  • MySQL OCP888题解044-从服务器上导入mysql模式数据后的权限问题
  • 实战小项目之视频监控(1-2)
  • 人工智能基础--AI作业1-ML基础
  • 关于JS中this对象指向问题总结
  • Codeforces Round 855 (Div. 3) A-E2
  • Spark Yarn 运行环境搭建
  • SpringMVC 页面跳转指南:转发和重定向的实现与比较
  • ModStartCMS v5.9.0 后台浅色模式,系统样式升级
  • 2020蓝桥杯真题反倍数 C语言/C++
  • PTA:L1-025 正整数A+B、L1-026 I Love GPLT、L1-027 出租(C++)
  • 状态机的Go语言实现版本
  • 第2章 线程安全与共享资源竞争
  • 77. writerows写入多行
  • STM32MP157-Linux输入设备应用编程-多点触摸屏编程
  • mybatis-plus的一般实现过程(超详细)
  • Spark(5):RDD概述
  • 面向对象 - 继承
  • 计算机网络的166个概念你知道几个 第十二部分
  • 【RabbitMQ】RabbitMQ各版本的兼容性与技术支持时限
  • 【Git】P5 Git 远程仓库(3)pull 发生冲突
  • 关于世界坐标系,相机坐标系,图像坐标系,像素坐标系的一些理解
  • 企业防护ddos的注意事项,你知道吗?
  • RocketMQ如何测试
  • SpringBoot中的bean注入方式和原理介绍
  • ESP32设备驱动-RFID-RC522模块驱动
  • SMETA认证有些客户是需要做窗口期的