一、接口开发规范

  1. 签名:对外提供的接口要做签名认证,认证不通过的请求不允许访问接口、提供服务。

  2. 加密:敏感数据在网络传输过程中应该加密。

  3. IP白名单:限制请求的IP,增加IP白名单,一般在网关层处理。

  4. 限流:尤其是对外提供的接口,无法保障调用的频率,应该做限流处理,保障接口服务正常提供服务。

  5. 参数校验:即使前端做了非空,规范性校验,服务端参数校验仍然是非常必要的。

  6. 统一返回值:一个服务一套同意的数据返回结果和传参规范。

  7. 统一异常封装:系统报错友好提示,避免暴露出sql异常的信息给调用方。

  8. 请求日志:记录系统产生的日志,方便快速定位分析问题。

  9. 幂等设计:对于一些涉及到数据一致性的接口一定要做好幂等设计,防止数据出现重复问题。

  10. 限制记录条数:对于提供的大批量数据查询接口,一定要限制请求的记录条数。

  11. 压测:上线前我们务必要对 API接口做一下压力测试,知道各个接口的qps情况。以便于我们能够更好的预估,需要部署多少服务器节点,对于API接口的稳定性至关重要

  12. 异步处理:如果同步处理业务,耗时会非常长。这种情况下,为了提升API接口的性能,我们可以改成异步处理。

  13. 数据脱敏:关系到业务中用户的敏感数据要进行脱敏处理。

  14. 完整的接口文档

二、保证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、远程调用

  • 串行改并行
  • 数据异构:为了提升接口性能,尤其在高并发场景下,可以考虑数据几余,将用户信息、积分和成长值的数据统一存储在一个地方,比如 Redis。

4、重复调用

  • 问题:在我们的日常工作代码中,重复调用非常常见,但如果没有控制好,会严重影响接口的性能。

  • 方案:可以通过批量查询来优化性能,减少数据库的查询次数。

5、异步处理

核心逻辑可以同步执行,同步写库。非核心逻辑,可以异步执行,异步写库。

异步处理通常有两种主要方式:多线程和消息队列(MQ)

6、避免大事务

为了避免大事务引发的问题,可以考虑以下优化建议:

  • 少用 @Transactional 注解
  • 将查询(select)方法放到事务外
  • 事务中避免远程调用
  • 事务中避免一次性处理太多数据
  • 有些功能可以非事务执行
  • 有些功能可以异步处理

7、锁粒度

为了避免多个线程并发修改同一共享数据而引发数据异常,通常我们会使用加锁的方式来解决这个问题。

然而,如果锁的设计不当,导致锁的粒度过粗,也会对接口性能产生显著的负面影响。

8、分页处理

问题:调用接口从数据库获取数据需要经过网络传输。如果数据量过大,无论是数据获取速度还是网络传输速度都会受到带宽限制,从而导致耗时较长。

方案:将一次性获取所有数据的请求,改为分多次获取,每次只获取一部分用户的数据,最后进行合并和汇总,

9、加缓存

我们最常用的缓存是:RedisMemcached

10、分库分表

问题:当系统发展到一定阶段,用户并发量增加,会有大量的数据库请求,这不仅需要占用大量的数据库连接,还会带来磁盘10的性能瓶颈问题。

方案:通过分库分表来解决。

11、监控功能

  • 开启慢查询日志
  • 链路跟踪
  • 开源监控系统 Prometheus。

四、公共数据接口API

https://www.zhihu.com/question/32225726

https://www.cnblogs.com/chen0307/p/9634848.html

https://www.kancloud.cn/lizhixuan/free_api

https://www.seniverse.com/api

https://apis.baidu.com/

如何合理开发Java接口(安全性,可重复调用,稳定性,追溯性)的更多相关文章

  1. OpenCV4Android开发之旅(一)----OpenCV2.4简介及 app通过Java接口调用OpenCV的示例

    转自:  http://blog.csdn.net/yanzi1225627/article/details/16917961 开发环境:windows+ADT Bundle+CDT+OpenCV-2 ...

  2. JMeter5.1开发Java协议接口脚本【待完成】

    JMeter5.1开发Java协议接口脚本

  3. Java++:安全|API接口安全性设计

    接口的安全性主要围绕 token.timestamp 和 sign 三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看: Token授权机制: 用户使用用户名密码登录后服务器给客户端返 ...

  4. Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类?

    Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类? 2013-01-05 17:16:09|  分类: JAVA |  标签:java  |举报|字号 订阅     下面比较一下两者的 ...

  5. java 接口的作用和好处

    1.java 接口的作用 http://blog.csdn.net/hack_bug/article/details/7634737 2.一位Java大牛的回答 很多JAVA初级程序员对于接口存在的意 ...

  6. java接口

    一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...

  7. 崔用志-微信开发-java版本

    崔用志-微信开发-java版本 今天看到一些关于微信开发的知识蛮好的博客,分享给大家,希望对大家有帮助. 微信开发准备(一)--Maven仓库管理新建WEB项目 微信开发准备(二)--springmv ...

  8. 初探设计:Java接口和抽象类何时用?怎么用?

    今天犯了个错: “接口变动,伤筋动骨,除非你确定只有你一个人在用”.哪怕只是throw了一个新的Exception.哈哈,这是我犯的错误. 一.接口和抽象类 类,即一个对象. 先抽象类,就是抽象出类的 ...

  9. Java 接口和抽象类差别

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想非常大程度上取决于它的总体架构,而这个总体架构事实上 ...

  10. 早期MyBatis开发与接口式Mybatis开发的简介

    早期MyBatis开发与接口式Mybatis开发的简介 一.早期版本的myBatis使用 导jar包            1.配置mybatis.xml的配置文件                1) ...

随机推荐

  1. gorm使用小结

    增 db.Create(user) db.Save(user) 参数只能用**结构体指针****,因为要根据指针写入该条插入的数据, 所以user可以作为该条数据使用. 新增只能用结构体 save方法 ...

  2. 如何加速C++文件的编译速度?

    一.为什么慢? 重要的一个原因是C++的基本 头文件-源文件的编译模型: 每个源文件为一个编译单元 头文件数量多,可能会包含上百甚至上千个头文件 存在重复解析,每个编译单元中,这些头文件都要从硬盘里读 ...

  3. ansible系列(34)--ansible实战之部署WEB集群架构(4)

    目录 1. 业务环境部署 1.1 wordpress-base编写 1.2 wordpress-web编写 1.3 wordpress-mysql编写 1.4 wordpress-proxy编写 1. ...

  4. 记一次线上Redis内存占用过高、大Key问题的排查

    问题背景 在一个风和日丽的下午,公司某项目现场运维同学反馈,生产环境3个Redis的Sentinel集群节点内存占用都很高,达到了17GB的内存占用量. 稍加思索,应该是某些Key的Value数据体量 ...

  5. lodash已死?Radash库方法介绍及源码解析 —— 异步方法篇

    写在前面 tips:点赞 + 收藏 = 学会! 我们前面已经介绍了 radash 的相关信息和所有 Array 相关方法,详情可前往主页查看. 本篇我们继续介绍radash中异步相关的方法. 所有方法 ...

  6. 网络安全—部署CA证书服务器

    文章目录 网络拓扑 安装步骤 安装证书系统 安装从属证书服务器 申请与颁发 申请证书 CA颁发证书 使用windows Server 2003环境 网络拓扑 两台服务器在同一网段即可,即能够互相pin ...

  7. ETSI GS MEC 013,UE 位置 API

    目录 文章目录 目录 版本 功能理解 Relation with OMA APIs Relation with OMA API for Zonal Presence Relation with OMA ...

  8. 模仿jinja2的模板语言实验,可用于简易框架中

    mcw_str=''' wo shi {{ name }} ''' import re class myclass(): def inithtml(self): ret1 = re.search('{ ...

  9. 大数据之Hadoop中HDFS的故障排除

    NameNode故障处理 1)需求 NameNode进程挂了并且存储的数据也丢失了 2)故障模拟 (1)kill -9 NameNode进程 kill -9 19886 (2)删除NameNode储存 ...

  10. 薄书的pytorch项目实战lesson49-情感分类+蹭免费GPU

    项目来源 B站视频pytorch项目实战-情感分类问题 github lesson49-情感分类实战 1 实验环境 在这里和大家推荐一个学习ML和DL的一个实验运行平台,就是google的Colabo ...