【整理】后端接口设计和优化相关思路汇总
文章目录
- 明确的接口定义和文档化
- 使用RESTful设计规范
- 分页和过滤
- 合理使用缓存
- 限流与熔断机制
- 安全性设计
- 异步处理与后台任务
- 接口参数校验(入参和出参)
- 接口扩展性考虑
- 核心接口,线程池隔离
- 关键接口,日志打印
- 接口功能单一性原则
- 接口查询优化,串行改为并行
- 确保接口兼容性的策略
- 调用第三方接口要考虑异常和超时处理
- 接口实现过程中,注意大文件、大事务、大对象
- 仔细检查代码避免出现粗心的空指针异常
- 考虑是否存在事务失效的问题场景
明确的接口定义和文档化
接口的明确定义和完善的文档能够减少沟通成本,避免误用。文档化还可以方便后续维护和扩展。
使用RESTful设计规范
遵循RESTful设计风格,使得接口更具一致性和可读性,并便于理解和使用。
分页和过滤
对于返回大量数据的接口,使用分页和过滤以减少数据传输量和提高响应速度。
合理使用缓存
在高并发的后端系统中,合理使用缓存可以显著提升性能,减轻数据库的压力,并缩短接口的响应时间。缓存的核心思想是将一些计算量大、访问频繁的数据暂时存储在内存中(如Redis、Memcached等),当下次请求相同数据时,可以直接从缓存中获取,而不需要再次访问数据库或执行复杂的计算。
限流与熔断机制
限流与熔断机制旨在防止系统过载,保护服务稳定性。限流控制请求频率,避免瞬间高并发冲击;熔断则在服务不稳定时主动停止请求,防止连锁故障,并在服务恢复后逐步恢复正常请求。
安全性设计
确保接口的安全性,如身份认证、权限校验和数据加密,避免数据泄露和未授权访问。
异步处理与后台任务
对于需要耗时较长的操作,可以通过异步处理或后台任务方式提高接口的响应速度。
接口参数校验(入参和出参)
接口入参和出参都需要进行校验, ① 例如入参是否不能为空,入参数据长度,入参是否符合预期规则,很多bug由于未做参数校验导致,对于可能改变的参数建议设计为对象类型;② 对于返回值,当返回值为空时是否返回为空串、空对象、空数组,需要与前端约定好。
接口扩展性考虑
在后端接口设计中,扩展性是非常重要的考虑因素。设计良好的接口应该能够适应业务需求的变化,易于扩展而不需要对现有系统做出大规模修改。
核心接口,线程池隔离
登录接口、首页数据接口、转账提现接口等,都可能使用到线程池,某些普通接口也会使用线程池,如果不做线程池隔离,普通接口出bug线程池打满,会导致登录等主要业务受到影响。
关键接口,日志打印
关键业务代码,需要打印日志进行保驾护航,在入参和出参位置或者其他关键位置,良好的日志打印具有如下好处:① 方便排查定位线上问题,划清问题责任;② 生产环境不能直接debug,必须依靠日志查问题和具体异常。
接口功能单一性原则
单一性是指接口做的事情比较单一、专一。比如一个登陆接口,它做的事情就只是校验账户名密码,然后返回登陆成功以及userId即可。但是如果你为了减少接口交互,把一些注册、一些配置查询等全放到登陆接口,就不太妥。其实这也是微服务一些思想,接口的功能单一、明确。比如订单服务、积分、商品信息相关的接口都是划分开的。将来拆分微服务的话,是不是就比较简便啦。
接口查询优化,串行改为并行
在设计一个APP首页接口时,如果它需要从多个不同的数据源获取信息(如用户信息、banner信息、弹窗信息等),通常有两种常见的调用方式:串行调用和并行调用。为了提高接口的响应速度,优化用户体验,采用并行调用是更优的选择,尤其是在这些调用之间没有依赖关系时。
并行调用允许多个请求同时执行,不必等待彼此完成。Java中的CompletableFuture可以很方便地实现这一点。
确保接口兼容性的策略
在修改老接口时,接口的兼容性是一个非常重要的考虑因素,特别是在系统已经上线并且被多个客户端使用的情况下。以下是一些确保接口兼容性的策略和最佳实践。
- 向后兼容性
定义:向后兼容性指的是旧版本的客户端仍然可以正常使用新版本的接口,而不需要任何修改。
策略:
保持现有字段不变:不要随意修改或删除现有的字段或参数,这样可以保证旧客户端仍然能按预期工作。
新增字段:如果需要扩展数据模型,可以新增字段或参数,但这些新增内容应该是可选的。旧客户端可以忽略这些新字段,而新客户端则可以利用它们。
保持返回类型不变:尽量保持返回的JSON或XML结构不变,尤其是数据类型、字段名等。如果必须改变,确保新老结构兼容,或提供降级逻辑。 - 版本管理
定义:当新功能或重大修改不可避免地会破坏现有客户端时,应该采用接口版本管理策略。
策略:
路径版本化:在URL路径中添加版本号,例如/api/v1/user和/api/v2/user。这种方式直观,客户端明确知道调用的是哪个版本的接口。
请求头版本化:通过HTTP请求头指定版本号,例如Accept: application/vnd.company.v1+json。这种方式不会影响URL的结构。
API网关:使用API网关进行版本管理和路由,能够更灵活地处理不同版本的接口。
调用第三方接口要考虑异常和超时处理
在调用第三方接口时,异常和超时处理是至关重要的。这些问题如果处理不当,会导致应用程序的不稳定,甚至崩溃。为了确保系统的健壮性和用户体验的稳定性,以下是一些关键的考虑和处理策略。
重试机制:在遇到网络异常时,可以尝试进行重试,通常是几次有限次数的重试。例如,可以使用指数退避算法来增加重试间隔时间,避免因频繁重试造成更多的问题。
兜底方案:如果多次重试后仍然失败,返回默认值或使用缓存中的数据,确保系统能够继续工作。
降级处理:当第三方服务异常时,提供降级服务。例如,返回一个友好的错误信息或使用本地的备用数据。
告警通知:当出现服务异常时,触发告警通知运维团队,以便快速响应。
调用第三方接口时,必须设定合理的超时时间,以避免长时间等待。
超时重试:在设定的超时时间内如果请求未完成,可以尝试重试,通常可以设置有限次重试,避免无限循环。
当某个第三方接口频繁出现异常或超时时,可以采用熔断机制,暂时停止对该接口的调用,避免对系统产生更大的影响。
日志记录:详细记录每次第三方接口调用的请求和响应信息,特别是在出现异常和超时时,确保可以进行后续的排查。
监控与报警:设置接口调用的监控指标,如成功率、平均响应时间等,当某些指标超过阈值时,立即报警通知相关人员。
接口实现过程中,注意大文件、大事务、大对象
• 读取大文件时,不要Files.readAllBytes直接读取到内存,这样会OOM的,建议使用BufferedReader一行一行来。
• 大事务可能导致死锁、回滚时间长、主从延迟等问题,开发中尽量避免大事务。
• 注意一些大对象的使用,因为大对象是直接进入老年代的,可能会触发fullGC
仔细检查代码避免出现粗心的空指针异常
空指针异常(NullPointerException)是 Java 开发中常见的错误之一。它通常发生在尝试对一个 null 对象引用进行操作时。
使用工具如 IntelliJ IDEA 的代码分析功能、SonarQube、FindBugs、Checkstyle 等,这些工具可以帮助检测可能的空指针异常问题。
在方法和构造函数中,进行参数 null 检查,抛出适当的异常。
对可能返回 null 的方法结果进行检查或处理。
对可能的参数值都进行null检查。
考虑是否存在事务失效的问题场景
• 方法的访问权限必须是public,其他private等权限,事务失效
• 方法被定义成了final的,这样会导致事务失效。
• 在同一个类中的方法直接内部调用,会导致事务失效。
• 一个方法如果没交给spring管理,就不会生成spring事务。
• 多线程调用,两个方法不在同一个线程中,获取到的数据库连接不一样的。
• 表的存储引擎不支持事务
• 如果自己try…catch误吞了异常,事务失效。
• 错误的传播特性
相关文章:

【整理】后端接口设计和优化相关思路汇总
文章目录 明确的接口定义和文档化使用RESTful设计规范分页和过滤合理使用缓存限流与熔断机制安全性设计异步处理与后台任务接口参数校验(入参和出参)接口扩展性考虑核心接口,线程池隔离关键接口,日志打印接口功能单一性原则接口查…...

docker 部署 sql server
众所周知,sql server不好装,本人之前装了两次,这个数据库简直是恶心。 突然想到,用docker容器吧 果然可以 记得放开1433端口 还有 记得docker加速,不然拉不到镜像的最后工具还是要装的,这个就自己研究吧。 …...

微信云开发云存储 下载全部文件
一、安装 首先按照这个按照好依赖,打开cmd 安装 | 云开发 CloudBase - 一站式后端云服务 npm i -g cloudbase/cli 安装可能遇到的问题 ‘tcb‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。-CSDN博客 二、登录 在cmd输入 tcb login 三、…...

1、巡线功能实现(7路数字循迹)
一、小车运行 1.PWM初始化函数 (pwm.c中编写) 包括四个轮子PWM通道使用的GPIO接口初始化、定时器初始化、PWM通道初始化。 void PWM_Init(uint16_t arr,uint16_t psc); 2.PWM占空比设置函数 (pwm.c中编写) 此函数调用了四个通道设置占空比的函数,作用是方便修改四…...

来了...腾讯内推的软件测试面试PDF 文档(共107页)
不多说,直接上干货(展示部分以腾讯面试纲要为例)完整版文末领取 通过大数据总结发现,其实软件测试岗的面试都是差不多的。常问的有下面这几块知识点: 全网首发-涵盖16个技术栈 第一部分,测试理论&#x…...

Android大脑--systemserver进程
用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章,技术文章也可以有温度。 本文摘要 系统native进程的文章就先告一段落了,从这篇文章开始写Java层的文章,本文同样延续自述的方式来介绍systemserver进程,通过本文您将…...

python项目部署:Nginx和UWSGI认识
Nginx: HTTP服务器,反向代理,静态资源转发,负载均衡,SSL终端,缓存,高并发处理。 UWSGI: Python应用程序服务器,WSGI兼容,多进程管理,快速应用部署,多种协议支…...

【区块链+金融服务】农业大宗供应链线上融资平台 | FISCO BCOS应用案例
释放数据要素价值,FISCO BCOS 2024 应用案例征集 粮食贸易受季节性影响显著。每年的粮收季节,粮食收储企业会根据下游订单需求,从上游粮食贸易商或粮农手 里大量采购粮食,并分批销售给下游粮食加工企业(面粉厂、饲料厂…...

2025ICASSP Author Guidelines
Part I: General Information Procedure ICASSP 2025 论文提交与评审过程将与往届会议类似: 有意参加会议的作者需提交一份完整描述其创意和相关研究成果的文件,技术内容(包括图表和可能的参考文献)最多为4页&…...

Openstack 所需要的共享服务组件及核心组件
openstack 共享服务组件: 数据库服务(Database service):MariaDB及MongoDB 消息传输服务(messages queues):RabbitMQ 缓存(cache):Memcache 时间同步(time sync)&…...

解密Linux中的通用块层:加速存储系统,提升系统性能
通用块层 通用块层是Linux中的一个重要组件,用于管理不同块设备的统一接口,减少不同块设备的差异带来的影响。它位于文件系统和磁盘驱动之间,类似于Java中的适配器模式,让我们无需关注底层实现,只需提供固定接口即可。…...

浅析国有商业银行人力资源数字化平台建设
近年来,在复杂的国际经济金融环境下,中国金融市场整体运行保持稳定。然而,随着国内金融机构改革的不断深化,国有商业银行全面完成股改上市,金融市场规模逐步扩大,体系日益完善,同时行业的竞争也…...

微信h5跳转消息页关注公众号,关注按钮闪一下消失
一、需求背景 在微信里访问h5页面,在页面里跳转到微信公众号消息页关注公众号。如下图: 二、实现跳转消息页关注公众号 跳转链接是通过 https://mp.weixin.qq.com/mp/profile_ext?actionhome&__bizxxxxx&scene110#wechat_redirect 来实现。…...

掌握PyTorch的加权随机采样:WeightedRandomSampler全解析
标题:掌握PyTorch的加权随机采样:WeightedRandomSampler全解析 在机器学习领域,数据不平衡是常见问题,特别是在分类任务中。PyTorch提供了一个强大的工具torch.utils.data.WeightedRandomSampler,专门用于处理这种情况…...

网络丢包深度解析:影响、原因及优化策略
摘要 网络丢包是数据在传输过程中未能成功到达目的地的现象,它对网络通信的性能有着显著的影响。本文将深入探讨网络丢包的定义、原因、对性能的影响,以及如何通过技术手段进行检测和优化。 1. 网络丢包的定义 网络丢包发生在数据包在源和目的地之间的…...

Hadoop入门基础(一):深入探索Hadoop内部处理流程与核心三剑客
在大数据的世界里,处理海量数据的需求越来越多,而Hadoop作为开源的分布式计算框架,成为了这一领域的核心技术之一。 一、Hadoop简介 Hadoop是Apache Software Foundation开发的一个开源分布式计算框架,旨在使用简单的编程模型来…...

【扒代码】dave.py
COTR 模型是一个用于少样本或零样本对象检测和计数的神经网络。它结合了特征提取、Transformer 编码器和解码器、密度图预测和边界框预测等多个组件。该模型特别适用于在只有少量标注数据或完全没有标注数据的情况下进行对象检测和计数任务。通过使用 Transformer 架构…...

一个人真正的成熟,体现在这六个字上
你好,我是腾阳。 在这个快节奏、高压力的社会中,我们每个人都在追求成长与进步,渴望成为一个更优秀的自己。 然而,成长的道路从不是一帆风顺,我们时常会面临自我怀疑、挫折感、外界的质疑和内心的挣扎。 但正是这些…...

【已成功EI检索】第五届新材料与清洁能源国际学术会议(ICAMCE 2024)
重要信息 会议官网:2024.icceam.com 接受/拒稿通知:投稿后1周内 收录检索:EI, Scopus 会议召开视频 见刊封面 EI检索页面 Scopus 检索页面 相关会议 第六届新材料与清洁能源国际学术会议(ICAMCE 2025) 大会官网&…...

介绍Python `AsyncIterable` 的使用方法和使用场景
介绍Python AsyncIterable 的使用方法和使用场景 一、什么是 AsyncIterable?二、如何使用 AsyncIterable三、使用场景四、总结 在Python异步编程中,AsyncIterable 是一个非常重要的概念,它代表了一个异步可迭代对象。异步可迭代对象允许我们在…...

抖音直播间通过星图风车跳转到微信小程序
注册并认证巨量星图账号:首先,你需要通过主体公司的资质注册巨量星图账号,并通过审核,以取得申请小风车链接跳转微信组件的资格。 使用链接生成工具:借助链接生成工具,如“省点外链”,生成一条…...

idea 修改背景图片教程
🌏个人博客主页:意疏-CSDN博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 关注 收藏支持一下笔者吧~ 阅读指南: 开篇说明修改背景图片 开篇说明 给小白看得懂的修改图片教程&…...

PWN练习---Stack_2
目录 srop源码分析exp putsorsys源码分析exp ret2csu_1源码分析exp traveler源码分析exp srop 题源:[NewStarCTF 2023 公开赛道]srop 考点:SROP 栈迁移 源码 首先从bss段利用 syscall 调用 write 读出数据信息,然后调用 syscall-read向栈中…...

springCloudAlibaba整合log4j2
文章目录 简介log4j2概述log4j2在springCloudAlibaba中的使用排除依赖引入log4j2依赖添加log4j配置文件修改项目配置文件中添加配置 对spring-cloud-alibaba相关组件比较感兴趣的小伙伴,可以看下spring-cloud-alibaba 练习项目 简介 日志主要是记录系统发生的动作&…...

你是如何克服编程学习中的挫折感的
一:心态调整 分解任务:将大的编程任务分解成小的可管理的部分,逐步完成每个部分,逐渐提升自信心。 接受挑战:挑战自己解决一些难题,这样可以提高技能并增强成就感。 寻找资源:利用网络资源、教…...

C++观察者模式:订阅博主~
目录 观察者模式步骤例子:订阅博主UML图1:定义观察者接口2:定义被观察者接口3:创建具体观察者类4:创建具体被观察者类5:使用执行结果 观察者模式 观察者模式允许我们定义一种订阅机制,可在对象…...

1-安装Elasticsearch
支持一览表 | Elastic 未完待续...

EmguCV学习笔记 VB.Net 4.2 二值化
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSD…...

Spark大数据分析案例
目录 案例概述环境搭建1. Spark单机环境2. Spark集群环境 数据集数据预处理 Spark作业编写提交Spark作业 数据可视化可能遇到的问题及解决方法结论 案例概述 本案例将介绍如何在单机和集群环境下使用Apache Spark进行大数据分析,最终使用Python实现数据的可视化。我…...

【数据结构】关于Java对象比较,以及优先级队列的大小堆创建你了解多少???
前言: 🌟🌟Hello家人们,这期讲解对象的比较,以及优先级队列堆,希望你能帮到屏幕前的你。 🌈上期博客在这里:http://t.csdnimg.cn/MSex7 🌈感兴趣的小伙伴看一看小编主页&…...