如何设计好一个接口?

  • 前言
  • 安全性
  • 稳定性
    • 健壮性
      • 限流
      • 接口响应超时处理
    • 可靠性
      • 幂等性
      • 事务一致性
        • 分布式事务
    • 高效性
      • 线程安全问题
    • 可维护性
    • 可读性

前言

接口对于我们系统来说是必不可少的,可以称得上是系统的基石。一个好的接口我认为需要具备以下几方面:安全性、稳定性、高效性、可维护性、可读性。下面我们就根据这几个性质讨论一下设计一个好接口需要考虑哪些问题?

安全性

安全性对于接口来说重要性不言而喻。我们常见的Web漏洞包括:SQL注入、JSON反序列化漏洞、XSS攻击、CSRF 攻击、文件上传下载漏洞、DDoS 攻击、弱口令、证书有效性验证、内部接口在公网暴露、未鉴权等权限相关漏洞。

预防措施:

  • 数据验证:使用过滤器、拦截器进行输入数据验证;
  • 身份认证&会话管理:对重要操作的接口使用令牌保护;
  • 存储安全:使用加密算法:MD5、SHA256、3DES;
  • IP白名单、记录接口请求日志、敏感数据脱敏等等。

稳定性

接口稳定性包含两个方面一个是健壮另一个是可靠,这两个概念很容易弄混。

健壮性

健壮指的是接口对错误处理机制的能力。
体现在几个方面:接口限流、降级、接口响应超时处理、重试以及预警机制。

限流

限流,也称流量控制(Rate Limit)。是指系统在面临高并发,或者大流量请求的情况下,只允许指定的事件进入,超过的部分将被拒绝服务、排队或等待、降级等处理,从而保证接口的稳定性。

常见的限流算法:固定窗口限流算法(计数器)、滑动窗口限流算法、漏桶算法、令牌桶算法。

因为篇幅原因这里不在展开说明,有机会我们单开一章详细介绍一下。

接口响应超时处理

这种情况往往都是对接第三方接口时,因为网络等不稳定因素导致

这种情况我们可以采取:设置超时时间、接口重试机制、异步、预警等方案。

另外我们可以通过:System默认方式、StopWatch、AutoCloseable来统计接口的响应时间,以便对其进行监控处理。

可靠性

可靠性的设计可以主要考虑:幂等、事务一致性两方面。

幂等性

幂等指任意多次请求的执行结果和一次请求的执行结果所产生的影响相同。

说的直白一点就是查询操作无论查询多少次都不会影响数据本身,因此查询操作本身就是幂等的。但是新增操作,每执行一次数据库就会发生变化,所以它是非幂等的。

幂等问题的解决有很多思路,比如:

  • insert前先select
  • 加悲观锁:select … for update
  • 加乐观锁:表中增加一个timestamp或者version字段
  • 加唯一索引
  • 建防重表
  • 加分布式锁:redis、zookeeper

事务一致性

事务是一组不可分组的操作集合,这些操作要么都成功执行,要么都取消执行。

事务的四个特性(ACID):原子性、一致性、隔离性、持久性。

单体数据库不涉及网络交互,所以在多表之间实现事务是比较简单的(Spring事务轻松解决),这种事务我们称之为本地事务。

当单体数据库的性能达到瓶颈就需要进行分库分表以及服务化改造。

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。

单体数据库事务很容易满足事务的 ACID 四个特性,提供强一致性保证,但是分布式事务要完全遵循 ACID 特性会比较困难。

为了追求分布式系统的高可用和高吞吐,分布式事务的解决方案一般提供的是最终一致性。

分布式事务

我们把提供最终一致性的事务称之为柔性事务,柔性事务一般遵循的是分布式领域中的 BASE 理论:

  • BA:Basic Availability,基本业务可用性。
  • S:Soft state,柔性状态。
  • E:Eventual consistency,最终一致性。

分布式事务有三种场景

  • 跨数据库分布式事务
  • 跨服务分布式事务
  • 混合式分布式事务

常见的分布式事务解决方案

  • XA 两阶段提交
  • TCC模式:支持 TCC 事务的开源框架有:ByteTCC、Himly、TCC-transaction。
  • Saga
  • 基于消息的分布式事务:基于事务消息的方案、基于本地消息的方案
  • 分布式事务中间件:Seata

高效性

我们可以使用多线程能够更加充分合理利用系统资源,使用缓存可以提高响应速度、

多线程的实现离不开两个类:Thread、Runnable。

同时我们也可以通过Future和Callable获取子线程的执行结果。

使用线程池可以管理并复用线程,减少频繁创建线程带来的上下文切换等问题。

谈到多线程就不得不聊聊线程安全问题。

线程安全问题

线程安全问题的两个场景:

  • 数据争用:两个数据同时去写,造成其中一方的数据要么被丢弃要么写入错误;
  • 竞争条件:执行顺序,比如去读取一个文件的内容,那么自然是在这个文件写完之后的,假设线程配合的不好,我在你没写完之前就来读取,这样就会造成顺序上的错误。

线程安全问题只在多线程环境下才出现,单线程串行执行不存在此问题。
保证高并发场景下的线程安全,可以从以下四个维度考量:

  • 数据单线程内可见,比如ThreadLocal;
  • 只读对象,final
  • 线程安全类:StringBuffer、ConcurrentHashMap
  • 同步与锁机制:synchronized、Lock等。

多线程的场景下还需注意死锁问题。

可维护性

可维护也可以称为可拓展。这就要在设计层面对接口进行良好的设计。
体现在对响应结果、异常处理、日志打印等要做统一的控制。
再有就是可以使用设计模式。

设计模式一共有23种,最常用比如:单例模式、代理模式、工厂模式、建造者模式、模板模式、策略模式等。

Spring源码中就使用了很多的设计模式,大家有兴趣可以了解一下。

可读性

可读性是为了给后人提供方便,正所谓铁打的营盘流水的兵。
我们在写接口的时候对复杂的逻辑不妨多加一些注释,这样不仅仅给方便其他人阅读,同样给自己带来遍历。

如何设计好一个接口?相关推荐

  1. https接口_API设计指南 一个接口文档模板的最佳实践

    1. 基础说明 1.1 背景 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一 ...

  2. 利用接口做参数,写个计算器,能完成加减乘除运算。 (1)定义一个接口Compute含有一个方法int computer(int n, int m)。 (2)设计四个类分

    代码 /*第二题:利用接口做参数,写个计算器,能完成加减乘除运算.(1)定义一个接口Compute含有一个方法int computer(int n, int m).(2)设计四个类分别实现此接口,完成 ...

  3. 如何设计USB TYPE-C接口的显示器和电视机,形态三独立功能的双USB-C接口 +一个HDMI接口的显示器

    接着形态一跟形态二的讲述,大家对于tupe-c的显示器有了一定的了解, 接下来我们来讲一下第三种形态,独立功能的双USB-C接口 +一个HDMI接口的显示器. 这种显示器具有双USB-C接口,但是两个 ...

  4. java设计一个形状shape_编程定义一个图形接口 Shape, 内含2个抽象方法 get... JAVA编程题:编一个程序包含一个接口 shape(该接......

    导航:网站首页 > 编程定义一个图形接口 Shape, 内含2个抽象方法 get... JAVA编程题:编一个程序包含一个接口 shape(该接... 编程定义一个图形接口 Shape, 内含2 ...

  5. 类的设计与实现1、设计一个图形抽象类Graph,该类中有成员变量图形类型(type),维度信息(dimension,二维或三维);成员方法计算面积(computeArea); 2、设计一个接口

    类的设计与实现 1.设计一个图形抽象类Graph,该类中有成员变量图形类型(type),维度信息(dimension,二维或三维):成员方法计算面积(computeArea); 2.设计一个接口IDi ...

  6. 设计一个接口, 并设计一个实现类实现该接口,演示它们的使用。具体,创建一个名称为Person的接口,在接口中定义两个方法sayHello()和sayBye()。

    设计一个接口, 并设计一个实现类实现该接口,演示它们的使用. 具体,创建一个名称为Person的接口,在接口中定义两个方法sayHello()和sayBye().然后,创建两个实现了Person接口的 ...

  7. 干货!如何设计实现一个通用的分布式事务框架?

    来源:https://www.bytesoft.org/ 一个TCC事务框架需要解决的当然是分布式事务的管理.关于TCC事务机制的介绍,可以参考TCC事务机制简介. TCC事务模型虽然说起来简单,然而 ...

  8. python数据接口设计_python之接口与归一化设计

    1接口 接口的概念: Java 语言中的接口很好的展现了接口的含义: IAnimal.java /* * Java的Interface很好的体现了我们前面分析的接口的特征: * 1)是一组功能的集合, ...

  9. 【设计模式】软件设计七大原则 ( 接口隔离原则 | 代码示例 )

    文章目录 一.接口隔离原则简介 二.接口隔离原则代码示例 ( 反面示例 ) 1.接口定义 ( 接口臃肿 ) 2.实现类 1 3.实现类 2 三.接口隔离原则代码示例 ( 推荐用法 ) 1.接口 1 2 ...

最新文章

  1. AI颠覆经济世界作用被夸大?影响远比媒体头条报道更加复杂
  2. @Repository、@Service、@Controller 和 @Component
  3. java session 生命周期_JavaWeb关于session生命周期的几种设置方法
  4. 以大多数人的努力程度之低,根本轮不到去拼天赋
  5. 【渝粤教育】电大中专学前儿童语言教育 (6)作业 题库
  6. ABB RobotStudio6.08安装
  7. [翻译]Real-Time Correlative Scan Matching
  8. Mac Spark 安装
  9. EXCEL插入超链接——无法打开指定文件
  10. win10摄像头打开后黑屏怎么回事?(驱动重新装了、注册表按照网上的方法也改过了、相机隐私设置也打开了,总之各种方法都尝试了还是打开黑屏)
  11. Bootstrap-collapse
  12. 图解计算机基础网站上线了
  13. 关于新冠疫情,美国专家们终于认定了这9大事实
  14. Springboot集成Hadoop+Hbase实现企业能源消耗监测大数据分析系统
  15. Office与visio的快速下载与安装
  16. 要习惯同时兼顾几个学习项目
  17. myeclipse代码或JSP页面改动之后,并没有生效问题
  18. bgp整机柜租用有什么好处?
  19. JQuery(四) 对象数组进行排序
  20. amazon应用程序开发_亚马逊音乐是流媒体应用程序的黑马

热门文章

  1. 聚焦低代码SaaS云服务,让企业轻松办公!
  2. 当下各种关系数据库管理系统
  3. 推荐 8 个优质的公众号
  4. 云计算平台为什么是必需的
  5. Mac-Brew介绍
  6. PHP的ob_flush()与flush()区别
  7. Centos7防火墙与IPTABLES详解
  8. CSMA/CD协议分析
  9. 判断是不是iphone x齐刘海屏幕
  10. 如何获取(GET)一杯咖啡——星巴克REST案例分析