如何合理开发Java接口(安全性,可重复调用,稳定性,追溯性)
一、接口开发规范
-
签名:对外提供的接口要做签名认证,认证不通过的请求不允许访问接口、提供服务。
-
加密:敏感数据在网络传输过程中应该加密。
-
IP白名单:限制请求的IP,增加IP白名单,一般在网关层处理。
-
限流:尤其是对外提供的接口,无法保障调用的频率,应该做限流处理,保障接口服务正常提供服务。
-
参数校验:即使前端做了非空,规范性校验,服务端参数校验仍然是非常必要的。
-
统一返回值:一个服务一套同意的数据返回结果和传参规范。
-
统一异常封装:系统报错友好提示,避免暴露出sql异常的信息给调用方。
-
请求日志:记录系统产生的日志,方便快速定位分析问题。
-
幂等设计:对于一些涉及到数据一致性的接口一定要做好幂等设计,防止数据出现重复问题。
-
限制记录条数:对于提供的大批量数据查询接口,一定要限制请求的记录条数。
-
压测:上线前我们务必要对 API接口做一下压力测试,知道各个接口的qps情况。以便于我们能够更好的预估,需要部署多少服务器节点,对于API接口的稳定性至关重要
-
异步处理:如果同步处理业务,耗时会非常长。这种情况下,为了提升API接口的性能,我们可以改成异步处理。
-
数据脱敏:关系到业务中用户的敏感数据要进行脱敏处理。
-
完整的接口文档。
二、保证API接口安全的10个小技巧
1、参数校验
必要性:防止无效请求,提高接口安全。
校验内容:
2、统一封装返回值
目的:防止敏感信息泄露,保持响应结构一致。
返回值格式:
{
"code": 0,
"message": "操作成功",
"data": [{"id": 123, "name": "abc"}]
}
code含义:0-成功,1-参数为空,2-参数错误,3-签名错误,4-请求超时,5-服务器内部错误等。
3、输入转义
-
XSS防御:转义用户输入的特殊字符
-
SQL注入防御:对用户输入进行SQL转义
4、权限控制
-
登录校验:判断用户是否登录
-
功能权限:只有特定权限的用户可以访问某些接口
-
数据权限:根据用户角色控制数据访问范围
5、验证码
-
用途:防止恶意刷接口,
-
形式:图形验证码、滑块验证、短信验证码。
-
注意:复杂验证码会影响用户体验。
6、限流
-
方法:对请求频率进行限制,防止接口被恶意刷。
-
实现:使用 Redis记录请求次数,设置每天的请求上限。
7、IP白名单
-
用途:限制只有特定IP可以访问重要接口。
-
实现:动态配置IP白名单,或通过数据库管理。
8、敏感词校验
-
方法:使用敏感词库对用户输入进行校验。
-
实现:自定义注解和AOP拦截器,敏感词匹配通过第三方接口或本地词库。
9、HTTPS协议
-
优点:数据加密,防止窃听、伪装和篡改。
-
注意:需要申请证书,有额外费用。
10、数据加密
-
用途:保护用户核心信息(如手机号、邮箱等)。
-
实现:使用 AES对称加密,自定义注解实现字段加解密。
三、API性能优化方法
1、索引优化
可以从以下几个角度入手:没加索引,索引没生效,选错索引
。
2、SQL优化
如果优化了索引之后效果不明显,接下来可以尝试优化一下SQL语句,因为相对于修改Java代码来说,改造 SQL语句的成本要小得多。
3、远程调用
4、重复调用
-
问题:在我们的日常工作代码中,重复调用非常常见,但如果没有控制好,会严重影响接口的性能。
-
方案:可以通过批量查询来优化性能,减少数据库的查询次数。
5、异步处理
核心逻辑可以同步执行,同步写库。非核心逻辑,可以异步执行,异步写库。
异步处理通常有两种主要方式:多线程和消息队列(MQ)
6、避免大事务
为了避免大事务引发的问题,可以考虑以下优化建议:
7、锁粒度
为了避免多个线程并发修改同一共享数据而引发数据异常,通常我们会使用加锁的方式来解决这个问题。
然而,如果锁的设计不当,导致锁的粒度过粗,也会对接口性能产生显著的负面影响。
8、分页处理
问题:调用接口从数据库获取数据需要经过网络传输。如果数据量过大,无论是数据获取速度还是网络传输速度都会受到带宽限制,从而导致耗时较长。
方案:将一次性获取所有数据的请求,改为分多次获取,每次只获取一部分用户的数据,最后进行合并和汇总,
9、加缓存
我们最常用的缓存是:Redis
和Memcached
。
10、分库分表
问题:当系统发展到一定阶段,用户并发量增加,会有大量的数据库请求,这不仅需要占用大量的数据库连接,还会带来磁盘10的性能瓶颈问题。
方案:通过分库分表来解决。
11、监控功能
四、公共数据接口API
https://www.zhihu.com/question/32225726
https://www.cnblogs.com/chen0307/p/9634848.html